gladilov.org.ru gladilov.org.ua

41 заметка с тегом

маленькие хитрости

Хаки и трюки, подсмотренные на просторах Интернета или «выстраданные» мною самим.



Загадочные BogoMIPS’ы

Давно хотел сделать статейку о том, что такое BogoMIPS’ы. Наконец руки дошли и до этого

Когда-то в юнлсти я обратил внимание на то, что при начальной загрузке ядра Linux выдаётся сообщение примерно такого вида:

Calibrating delay loop… 1699 BogoMIPS

Оказывается, в ядре Линукс — это способ измерения оценки скорости исполнения процессорных инструкций на компьютере, он предназначен для калибровки внутренних циклов ядра.

Теория: Показать

BogoMIPS’ы можно определить как «число миллионов раз в секунду, когда процессор может ничего не делать» («the number of million times per second a processor can do absolutely nothing»).

Это собственное изобретение Линуса. В версии ядра 0.99.11 от 11 июля 1993 года была нужда в цикле синхронизации для калибровки скорости процессора компа. Поэтому во время загрузки ядро ​​измеряет, насколько быстро на компьютере выполняется определенный цикл. Приставка «Bogo» происходит от слова «bogus» (англ. «фальшивка», «подделка»). Поэтому значение BogoMIPS’ов даёт некоторое представление о скорости процессора, но при этом это значение очень ненаучно. Вывод этого значения был немного полезен для отладки и проверки работоспособности кэшей компьютеров и работы кнопки «Турбо» (когда она ещё была на системниках).

BogoMIPS’ы определены в /usr/src/linux/init/main.c, где описан простой алгоритм на C, с хорошим примером арифметики с плавающей запятой в полностью целочисленном ядре, соответствующая переменная ядра loops_per_sec используется в нескольких драйверах для более серьёзной работы. Фактически функция задержки udelay() написана на ассемблере, поэтому каждый порт на другую архитектуру имеет собственное определение в /include/asm/delay.h. При этом, переменная loops_per_sec и функция udelay() используются во многих драйверах, посмотреть это можно так:

cd /usr/src/linux
find . -name '*.[hcS]' -exec fgrep loops_per_sec {} /dev/null \;
find . -name '*.[hcS]' -exec fgrep udelay {} /dev/null \;

Цикл расчёта BogoMIPS’ов для процессоров с не Intel-архитектурой похож, но не всегда, так как он пишется на другой реализации языкя ассемблера.

Методов определения богомипсов три:

  1. (самый предпочтительный) просмотр в /proc/cpuinfo (например так:
cat /proc/cpuinfo | grep -i bogomips

  1. просмотр вывода системного журнала для контроля, что было напечатано во время загрузки (с помощью dmesg или syslogk). Иногда информация всё ещё может находиться на загрузочной консоли.
  2. (рекомендуется только для не Linux-систем) используя отдельную программу bogomips..

Теперь практика. Действующие, гм..., лица и устройства: Показать

Тип Сетевое имя Бренд, Модель
/Аппаратная ревизия
ОС
(прошивка)
Процессор ОЗУ
Компьютер soulhome  Debian 10 Intel Celeron G1610@2.6ГГц 16Гб
VPS-сервер gor QEMU/KVM  Debian 9 Intel Celeron@2.1ГГц 1Гб
Нетбук asus4g Asus Eee PC 4G (701)  Debian 9 Intel Celeron M ULV 353@900МГц,
работает на частоте 630МГц
2Гб
Маршрутизатор hive D-Link DIR-320/A2E  DebWRT Broadcom BCM3302 v2.9@240МГц 32Мб
IPTV STB-приставка x96mini DQiDianZ X96 mini  armbian 5.67 Amlogic S905W, 4xARM Cortex-A53@1,5ГГц 2Гб
Маршрутизатор linksys Linksys WRT300N/1.1  DD-WRT v24-sp2 mega v1.51.2 Broadcom BCM4705L@300МГц 32Мб
Маршрутизатор midge Edimax BR-6104KP/1.3.r510  flyrouter3-office_usb ADMtek 5120P@170МГц 16Мб
Маршрутизатор tplink TP-Link TL-WR841ND/8.1  OpenWRT Attitude Adjustment 12.09, r36088 Atheros AR9341@535МГц 32Мб
IPTV STB-приставка mag250 TeleTec MAG-250 Micro  0.2.18-r22-250 STMicroelectronics STi7105@450МГц 256Мб
Смартфон k3note Lenovo K3 Note  Android 5.1 MediaTek MT6752, 8xARM Cortex-A53@1,7ГГц 2Гб
Маршрутизатор gw D-Link DIR-300/A/C1E  2.5.7 Realtek RTL8196C@390МГц 32Мб

На всех (почти) подконтрольных мне домашних железках с ОСью/прошивкой на ядре Linux настроил авторизацию по ключу по протоколу SSH. Кое-где из-за старости и ущербности и отстуствия сорременных алгоритмов обмена ключей прищлось в /~.ssh/config прописать

Host <узел>
    KexAlgorithms +diffie-hellman-group1-sha1

чтобы не писать в командной строке конструкцию вида:

ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 <узел> 'cat /proc/cpuinfo | grep -i bogomips && cat /proc/version'

На железках, в которых dropbear кроме motd выдавал ещё и login banner — пришлось пойти на крайние меры путём убийства процесса dropbear и старта его без указания файла с банером, т. е. вместо процесса

dropbear -b /tmp/loginprompt -r /tmp/root/.ssh/ssh_host_rsa_key -d /tmp/root/.ssh/ssh_host_dss_key -p 22

делаю

killall dropbear

и стартую процесс

dropbear -r /tmp/root/.ssh/ssh_host_rsa_key -d /tmp/root/.ssh/ssh_host_dss_key -p 22

Авторизацию по ключу сделал так:

cat ~/.ssh/id_rsa.pub | ssh <узел> 'cat >> .ssh/authorized_keys'

Затем на всех узлах выполнял код

ssh <узел> 'cat /proc/cpuinfo | grep -i bogomips && cat /proc/version'

Полученный результат я свёл на скрин с инфой (1920x1080): Показать

Текстовая расшифровка изображения (вдруг кому пригодится): Показать

soul@soulhome:~$ cat /proc/cpuinfo | grep -i bogomips && cat /proc/version
bogomips        : 5188.12
bogomips        : 5188.12
Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.168-1+deb9u5 (2019-08-11)
soul@soulhome:~$ ssh gor 'cat /proc/cpuinfo | grep -i bogomips && cat /proc/version'
bogomips        : 4199.99
Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.168-1+deb9u2 (2019-05-13)
soul@soulhome:~$ ssh asus4g 'cat /proc/cpuinfo | grep -i bogomips && cat /proc/version'
bogomips        : 1260.10
Linux version 4.9.0-6-686-pae (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07)
soul@soulhome:~$ ssh hive 'cat /proc/cpuinfo | grep -i bogomips && cat /proc/version'
BogoMIPS                : 239.10
Linux version 2.6.34.5 (amain@amain-laptop) (gcc version 4.3.3 (GCC) ) #1 Sun Sep 26 18:20:27 CEST 2010
soul@soulhome:~$ ssh x96mini 'cat /proc/cpuinfo | grep -i bogomips && cat /proc/version'
BogoMIPS        : 48.00
BogoMIPS        : 48.00
BogoMIPS        : 48.00
BogoMIPS        : 48.00
Linux version 5.1.0-rc5-next-20190416-aml-s905-gde3c659c8-dirty (root@vbox) (gcc version 7.4.1 20181213 [linaro-7.4-2019.02 revision 56ec6f6b99cc167ff0c2f8e1a2eed33b1edc85d4] (Linaro GCC 7.4-2019.02)) #5.78 SMP PREEMPT Tue Apr 16 13:56:07 MSK 2019
soul@soulhome:~$ ssh linksys 'cat /proc/cpuinfo | grep -i bogomips && cat /proc/version'
BogoMIPS                : 299.82
Linux version 2.4.36 (root@dd-wrt) (gcc version 3.4.6 (OpenWrt-2.0)) #2827 Thu Jun 19 08:30:07 CEST 2008
soul@soulhome:~$ ssh midge 'cat /proc/cpuinfo | grep -i bogomips && cat /proc/version'
BogoMIPS                : 174.48
Linux version 2.4.32 (builder@work) (gcc version 3.4.5 (ZFT Lab. and FlyRouter Team)) #2 Вто Мар 24 21:44:31 EET 2009
soul@soulhome:~$ ssh tplink 'cat /proc/cpuinfo | grep -i bogomips && cat /proc/version'
BogoMIPS                : 266.64
Linux version 3.3.8 (blogic@Debian-60-squeeze-64-minimal) (gcc version 4.6.3 20120201 (prerelease) (Linaro GCC 4.6-2012.02) ) #1 Sat Mar 23 16:49:30 UTC 2013
soul@soulhome:~$ ssh k3note 'cat /proc/cpuinfo | grep -i bogomips && cat /proc/version'
BogoMIPS        : 26.00
BogoMIPS        : 26.00
BogoMIPS        : 26.00
Linux version 3.10.65+ (buildslave@shws40) (gcc version 4.9 20140514 (mtk-20150408) (GCC) ) #1 SMP PREEMPT Wed Oct 28 14:17:24 CST 2015
soul@soulhome:~$ ssh mag250 'cat /proc/cpuinfo | grep -i bogomips && cat /proc/version'
bogomips        : 444.41
Linux version 2.6.32.59_stm24_0211-MAG250_7105 (dmgrib@Server01.localdomain) (gcc version 4.6.3 20120313 (STMicroelectronics/Linux Base 4.6.3-106) (GCC) ) #41 PREEMPT Thu Jun 8 13:01:38 EEST 2017
soul@soulhome:~$ telnet -E dlink 
Trying 10.9.1.1...
Connected to dlink.
Escape character is 'off'.
                                                                                                                                                                                             
Dlink-Router login: soul                                                                                                                                                                     
Password:                                                                                                                                                                                    
Welcome to                                                                                                                                                                                   
     _______          ___     __  ____   _  _   ___                                                                                                                                          
    |  ___  \        |   |   |__||    \ | || | /  /                                                                                                                                          
    | |   | ||  ___  |   |__  __ |     \| || |/  /                                                                                                                                           
    | |___| || |___| |      ||  || |\     ||     \                                                                                                                                           
    |_______/        |______||__||_| \____||_|\___\                                                                                                                                          
                                                                                                                                                                                                                  
                     = Building Networks for People =                                                                                                                                                             
                                                                                                                                                                                                                  
                                                                                                                                                                                                                                             
                                                                                                                                                                                                                                             
BusyBox v1.19.2 (2016-10-19 16:25:25 MSK) built-in shell (ash)                                                                                                                                                                               
Enter 'help' for a list of built-in commands.                                                                                                                                                                                                
                                                                                                                                                                                                                                             
soul@dlink:$ cat /proc/cpuinfo | grep -i bogomips                                                                                                                                                                                            
BogoMIPS                : 389.12                                                                                                                                                                                                             
soul@dlink:$ cat /proc/version 
Linux version 2.6.30.9 (builder@rd) (gcc version 4.4.5-1.5.5p2 (GCC) ) #1 Wed Oct 19 16:21:12 MSK 2016
soul@dlink:$ exit
Connection closed by foreign host.
soul@soulhome:~$

Источники:
http://tldp.org/HOWTO/BogoMips/index.html
http://www.clifton.nl/bogo-faq.html
https://ru.wikipedia.org/wiki/BogoMIPS

2019   Linux   досуг   железо   интересное   маленькие хитрости   ОС   сисадминство

Загрузка в графическое окружение или в текстовую консоль

Давно хотел реализовать на рабочей дебиане вариант выбора загрузки (в одной системе) как в графику, так и в текстовую консоль. Но недостаток мозга знаний не позволял это реализовать.

Сначала я по скудоумию копал в сторону передачи параметра загрузки INITLEVEL или RUNLEVEL системе. Пробовал в конце строки загрузки ядра linux добавлять строчку text, но это тоже не сработало. После этого я решился спросить у знакомого админа (очень хорошего админа, Макс — спасибо!)... Он в ответ прислал ссылку на инструкцию, которую я не смог найти на просторах инета ))) И сегодня я наконец-то победил задачу, решение оказалось очень простым.

Описываю процесс (проверил в свежеустановленной виртуалке с Debian 9): Показать

Поставил систему в  ВиртуалБоксе. Установил XFCE4. Продублировал запись о загрузке в /boot/grub/grub.conf, полностью скопировав первый блок menuentry (привожу с сокращениями):

menuentry 'Debian GNU/Linux' {
load_video
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
        echo 'Загружается Linux <версия ядра> …'
        linux /boot/vmlinuz-<версия ядра> root=UUID=<UUID> ro  quiet
        echo 'Загружается начальный виртуальный диск …'
        initrd /boot/initrd.img-<версия ядра>
}

В первом блоке menuentry дополнил название до ’Debian GNU/Linux in text mode’, во втором — до ’Debian GNU/Linux in graphical mode’. Затем в первом блоке в строке загрузки ядра в конце добавил параметр 3, что означает уровень выполнения, в который система прыгает после загрузки. При выборе второго пункта меню система загрузится в обычном режиме, предусматривающем уронь выполнения 5 (графическая консоль), а при загрузке по первому пункту меню (по умолчанию) будет текстовая консоль и уровень выполнения 3.

Загрузочное меню GRUB: Показать

Загрузка в текстовом режиме: Показать

Загрузка в графику: Показать

Затем (так как это тестовая машина) настраиваю автологин и в тексте, и в графике. Для автологина в тексовой консоли в файле /lib/systemd/system/getty@.service прописываю юзера для автологина

ExecStart=-/sbin/agetty --noclear -a <юзер> %I $TERM

Да автовхода в XFCE в файле /etc/lightdm/lightdm.conf указываю

autologin-user=<юзер>
autologin-user-timeout=0

Источники:
Настройка GRUB
Автологин в текстовой консоли
Автологин в XFCE

2019   досуг   интересное   маленькие хитрости   ОС   сисадминство

Напильник для Эгеи, часть 3

      Небольшой отчёт о проделаной работе с Эгеей.

      Март 2018 года:
Пришла пора  книжного раздела. Добавил ко всем заметкам о прочтённых книгах тэг «Моё чтиво», так как тэг «Книги» использую, в том числе, для статей об известных авторах или их произведениях. Все обложки прочтённых книг перенёс к себе на сервер (раньше тэги IMG смотрели на картинки на разных сайтах) и причесал их к стандартному размеру 105×150 точек. К каждому такому изображению применил класс «bookimg», так описав его в файле user/extras/header-pre.tmpl.php:

Показать

.bookimg {
    width:106px;
    height:150px;
    vertical-align:middle;
    border:1px solid grey;
}

Для заголовочных картинок там же описал классы «main_left_img» и «main_right_img»:

.main_left_img {
    float:left;
    margin-right:10px;
}
.main_right_img {
    float:right;
    margin-left:10px;
}

      Май 2018 года:
Приделал к блогу реКАПЧУ для отсекания сообшений от ботов.

      Октябрь 2018 года:
В конце октября настроил в системе своп-файл для борьбы с частыми вылетами демона агрегатора новостей. Эксперимент можно считать успешным, так как с тех пор не было ни одного аварийного завершения демона.
Статистика и динамика в графиках: Показать

(данные графиков зафиксированы на 06.01.2019 г.)

Размер свопа Используемая память
Выполняемые процессы Load average
Размер базы агрегатора

      Январь 2019 года:
Привинтил к Эгее lightbox2 для показа скринов разных ОСей. Для этого в файле user/extras/header-pre.tmpl.php добавил записи:

<link href="/lightbox2/css/lightbox.css" rel="stylesheet" type="text/css">
<script src='/lightbox2/js/lightbox-plus-jquery.min.js'></script>

а в постах пишу такой код:

<font size="2"><a class="lightbox2" data-lightbox="<уникальный ID>" href="/img/osdetect/ОСь.png"><img src="/img/install/os/ось.png" style="vertical-align:middle;" />&nbsp;ОСь<br /><img src="/img/osdetect/preview/ОСь.png" style="vertical-align:middle;" /></a></font>

Уникальный ID нужен для исключения создания галереи из нескольких картнок.

2019   HTML   досуг   маленькие хитрости   сисадминство   софт

Элегантная форк-бомба


ВНИМАНИЕ!
Не запускайте эту команду, чтобы «проверить» её, так как у вашего компьютера скорее всего произойдёт сбой, влекущий за собой принудительную перезагрузку системы.

Текст бомбы:

:(){ :|:& };:

Что она делает:
 :() — объявление функции с именем :
 {:|: &} — в теле функции описан запуск её же и отправка вывода снова в функцию : (в фоне)
 ; — разделитель команд, как и &&.
 : — первый запуск функции :

Источник

2018   BASH   Linux   досуг   интересное   маленькие хитрости   сисадминство   скрипт   софт

Добавление swap-файла в системе Debian

В связи с частыми вылетами демона TTRSS из-за недостатка памяти решил откусить 2 гига от корневой ФС для файла подкачки. Не уверен, что поможет, но попробую...

Создал пустой файл /swapfile размером 2 Гб:

dd if=/dev/zero of=/swapfile bs=1M count=2048

Установил ему права:

chmod 600 /swapfile

Отформатировал этот файл как своп:

mkswap /swapfile

Добавил файл подкачки в систему:

swapon /swapfile

В файле /etc/fstab добавил строку:

/swapfile     swap     swap     defaults     0     0

для того, чтобы при перезагрузке файл опять был добавлен в систему как своп.

Источники:
https://wiki.debian.org/Swap
https://www.tecmint.com/create-a-linux-swap-file/
http://blog.sedicomm.com/2017/07/26/kak-sozdat-linux-swap-fajl/

2018   Debian   Linux   досуг   маленькие хитрости   сисадминство   софт

Срыв покровов. Продолжение

Продолжение рассказа об особенностях монтирования файловых систем.

В дополнение темы монтирования двух разных ФС в одну точку монтирования имею заявить следующее:

как явствует из манов ([1], [2]), при монтировании файлов используется механизм монтирования через loop-устройство. То есть, сначала устанавливается привязка петлевого устройства /dev/loopX к монтируемому файлу, затем это устройство монтируется на точку монтирования.

Если петлевое устройство явно не указано (как у меня при проведении эксперимента), тогда mount попытается найти свободный loop-device и использовать его. Поэтому, если бы я при монтировании файлов A.img и B.img в одну точку монтирования выполнил команду losetup и cat /etc/mtab, то увидел бы нечто вроде этого: Показать

root@debian:/home/soul# losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         1  0 /home/soul/A.img
/dev/loop1         0      0         1  0 /home/soul/B.img
root@debian:/home/soul# cat /etc/mtab 
rootfs / rootfs rw 0 0
. . .
/dev/loop0 /mnt/A ext2 rw,relatime 0 0
/dev/loop1 /mnt/A minix rw,relatime 0 0
root@debian:/home/soul#

Как по мне, cамый оптимальный вариант решения (подсмотрен тут) — это создать линейный RAID из двух петлевых устройств, привязанных к своим файлам, и смонтировать его в нужную точку монтирования (требует установленного пакета mdadm): Показать

root@debian:/home/soul# losetup /dev/loop0 A.img
root@debian:/home/soul# losetup /dev/loop1 B.img
root@debian:/home/soul# mdadm --build /dev/md0 --level=linear --raid-devices=2 /dev/loop0 /dev/loop1
root@debian:/home/soul# mount /dev/md0 /mnt
root@debian:/home/soul#

2018   Linux   досуг   маленькие хитрости   мну   ОС   сисадминство   софт

Срыв покровов

Рассказ об особенностях монтирования файловых систем.

Вчера моя дражайшая половина супруга задала мне интересный вопрос — что будет, если в одну точку монтирования привинтить две разных файловых системы?

Сегодня, найдя свободное время, я попробовал это выяснить опытным путём в  ВиртуалБоксовой машине с установленным  Дебианом, о чём отчитываюсь: Показать

– Создал директории /mnt/A и /mnt/B и файлы A.img и B.img (размером по 10 Мб), отформатировав их в разные файловые системы (ext2 и minix): Показать

soul@debian:~$ sudo -s
root@debian:/home/soul# fallocate -l 10M A.img
root@debian:/home/soul# fallocate -l 10M B.img
root@debian:/home/soul# ls /mnt
root@debian:/home/soul# mkdir /mnt/A
root@debian:/home/soul# mkdir /mnt/B
root@debian:/home/soul# mkfs.ext2 A.img
mke2fs 1.42.12 (29-Aug-2014)
Discarding device blocks: done
Creating filesystem with 10240 1k blocks and 2560 inodes
Filesystem UUID: 866d1e35-dad7-466a-990a-411601395777
Superblock backups stored on blocks:
        8193

Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done

root@debian:/home/soul# mkfs.minix B.img
3424 inodes
10240 blocks
Firstdatazone=112 (112)
Zonesize=1024
Maxsize=268966912

root@debian:/home/soul#

– Смонтировал их в разные директории (A.img в /mnt/A, B.img в /mnt/B): Показать

root@debian:/home/soul# mount -o loop A.img /mnt/A
root@debian:/home/soul# ls /mnt/A
lost+found
root@debian:/home/soul# mount -o loop B.img /mnt/B
root@debian:/home/soul# ls /mnt/B
root@debian:/home/soul#

– Отмонтировал B.img от /mnt/B и примонтировал к /mnt/A, создал каталог /mnt/A/test1: Показать

root@debian:/home/soul# umount /mnt/B
root@debian:/home/soul# mount -o loop B.img /mnt/A
root@debian:/home/soul# mkdir /mnt/A/test1
root@debian:/home/soul# ls /mnt/A
test1
root@debian:/home/soul#

– Перемонтировал A.img и B.img и примонтировал их к разным директориям, посмотрел результат создания каталога: Показать

root@debian:/home/soul# umount /mnt/A
root@debian:/home/soul# umount /mnt/A
root@debian:/home/soul# mount -o loop A.img /mnt/A
root@debian:/home/soul# mount -o loop B.img /mnt/B
root@debian:/home/soul# ls /mnt/A
lost+found
root@debian:/home/soul# ls /mnt/B
test1
root@debian:/home/soul# umount /mnt/A
root@debian:/home/soul# umount /mnt/B
root@debian:/home/soul#

– Повторил эксперимент в другой последовательности: Показать

root@debian:/home/soul# mount -o loop B.img /mnt/A
root@debian:/home/soul# mount -o loop A.img /mnt/A
root@debian:/home/soul# ls /mnt/A
lost+found
root@debian:/home/soul# mkdir /mnt/A/test2
root@debian:/home/soul#

– Отмонтировал оба файла, примонтировал их опять к разным директориям и посмотрел результат второго этапа: Показать

root@debian:/home/soul# umount /mnt/A
root@debian:/home/soul# umount /mnt/A
root@debian:/home/soul# mount -o loop A.img /mnt/A
root@debian:/home/soul# mount -o loop B.img /mnt/B
root@debian:/home/soul# ls /mnt/A
lost+found  test2
root@debian:/home/soul# ls /mnt/B
test1
root@debian:/home/soul#

– Отмонтировал всё, удалил ненужные файлы и каталоги: Показать

root@debian:/home/soul# umount /mnt/A
root@debian:/home/soul# umount /mnt/B
root@debian:/home/soul# rm A.img
root@debian:/home/soul# rm B.img
root@debian:/home/soul# rmdir /mnt/A
root@debian:/home/soul# rmdir /mnt/B
root@debian:/home/soul# ^D
exit
soul@debian:~$

Из вышеприведённого можно сделать вывод, что изменения применяются на ту файловую систему, которая была примонтирована последней.

P. S. Здесь речь идёт о стандартных решениях, всякие там LVM, ZFS, btrfs и unionfs не рассматриваются.

Информация о системе: Показать

soul@debian:~$ uname -a
Linux debian 3.16.0-6-amd64 #1 SMP Debian 3.16.56-1 (2018-04-28) x86_64 GNU/Linux
soul@debian:~$ cat /etc/issue.net
Debian GNU/Linux 8
soul@debian:~$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
soul@debian:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 8.10 (jessie)
Release:        8.10
Codename:       jessie
soul@debian:~$

2018   Debian   Linux   досуг   маленькие хитрости   мну   ОС   сисадминство   софт

Напильник для Tiny Tiny RSS

 Как я недавно писал тут, после переезда на VDS’ку на сервере из-за недостатка памяти стала отваливаться сессия screen’а, в которой крутится демон опроса и наполнения БД новостей Tiny Tiny RSS. Для контроля того, что screen-сессия и процесс демона опроса и агрегирования новостей запущены, я написал скриптик на похапе, который опрашивает состояние этих процессов и отображает на WEB-странице. Показать

Возможны 22 вариантов:

  1. Скрин запущен, демон запущен: Показать
  1. Скрин запущен, демон выпал: Показать
  1. Скрин отвалился, демон вместе с ним: Показать
  1. Четвёртый вариант я не привожу, так как демона не в скрине я никогда не запускаю.

Однако мне достаточно быстро надоело открывать новую вкладку со страницей статистики каждый раз, когда у меня возникало подозрение о том, что скрин/демон отвалился. Поэтому я интегрировал индикаторы работы прямо на страницу Tiny Tiny RSS.

Ищу две картинки индикаторов  ON и  OFF, создаю файл скрипта опроса (допустим, readerstates.php) в том каталоге, где развёрнут TT RSS, с таким содержимым:

<?php $screen=exec("ps aux | grep -e 'SCREEN -dmS reade[r]'");
$daemon=exec("ps aux | grep -e 'php <путь к скрипту демона>/update_daemon2.ph[p]'");
$scrn_t=$dmn_t='не запущен';
$scrn=$dmn='off';if($screen){$scrn='on';$scrn_t='запущен';}
if($daemon){$dmn='on';$dmn_t='запущен';}?>
<img src='/... путь к картинке .../<?php echo$dmn;?>.png' title='Демон <?php echo$dmn_t;?>' />
<img src='/... путь к картинке .../<?php echo$scrn;?>.png' title='SCREEN <?php echo$scrn_t;?>' />

Затем прописываю require в файле index.php:

<?php
    foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_TOOLBAR_BUTTON) as $p) {
        echo $p->hook_toolbar_button();
    }
    require_once "readerstates.php";
?>

После этого все вышеописанные ситуации выглядят у меня на странице так:

  1. Скрин запущен, демон работает: Показать
  1. Скрин запущен, демон нет: Показать
  1. Скрин отвалился, демон тоже: Показать
2018   HTML   досуг   маленькие хитрости   мну   сисадминство   скрипт   софт

Автозапуск команды в screen’е

После переезда моего  сайта на VDS’ку шум раздолбанного вентилятора Asus EEE PC 710 перестал меня беспокоить, но теперь периодически вываливается screen-сессия, в которой крутится демон опроса и наполнения БД новостей TTRSS (чаще всего демон отваливался с ошибкой 12 «недостаточно памяти», но иногда и сам процесс скрина отъезжал).

Показать

Для повторного запуска я сначала стартовал сам скрин

screen -S reader

нажимал Enter и уже в нём запускал демона:

php <путь к скрипту демона>/update_daemon2.php

Теперь, если я вижу, что сессия скрина пропала, то стартую её заново и в ней автоматом запускаю демона:

screen -dmS reader sh && screen -S reader -X stuff "php <путь к скрипту демона>/update_daemon2.php^M"

Осталось написать демона, который будет контролировать работу запущенного демона.

Но об этом позже...

2018   BASH   досуг   маленькие хитрости   ОС   сисадминство   скрипт   софт

Получение списка устройств в сети

Для получения списка устройств, работающих в моей домашней сети (получивших IP от моего DHCP-сервера на своём сетевом интерфейсе), я использую самописный скрипт (смесь PHP и BASH’а). Он отрабатывает около 10 секунд, за это время сканируется сеть для выявления ответивших MAC’ов.

Концепцию можно улучшить, например, переписать его полностью на BASH’е и по cron’у вызывать, допустим, раз в пять минут, пусть он пишет MAC’и наличных сетевых устройств в файл/базу, а WEB-скрипт просто читает оттуда актуальные данные при открытии страницы.

Показать

<?php
// задаю необходимые переменные
$home_iface='eth0'; // интерфейс, посредством которого система включена в домашнюю сеть
$lan='192.168.120.0/24'; // определитель домашней сети (или её гостевого сегмента)
$temp_file='/tmp/dev.tmp'; // путь к временному файлу
// функция анализа и вывода MAC'а на странице
function DrawDevice() { ... }
// получаю MAC интерфейса $home_iface
$home_mac=exec("sudo ifconfig {$home_iface} | grep 'HWaddr' | awk '{print $5}'");
// отображаю его на странице
DrawDevice(trim($home_mac));
// удаляю временный файл, если он есть
if(file_exists($temp_file))exec("rm -f {$temp_file}");
// сканирую сетевой диапазон $lan
exec("fping {$lan} -age -r 1 >/dev/null 2>/dev/null");
// вычленяю устройства с ответившими MAC'амм
// и записываю во временный файл,
// можно писать в базу данных для получения динамики
exec("ip n | grep 'lladdr' | awk '{print $5}' > {$temp_file}",$h);
// получаю список ответивших MAC'ов из временного файла
$h=file_get_contents($temp_file);
// и удаляю его
if(file_exists($temp_file))exec("rm -f {$temp_file}");
$mac=array();
// убираю из списка символы новой строки
$mac=explode("\n",$h);
// в цикле вывожу MAC'и
foreach($mac as$host){DrawDevice($host);}
?>

    Требования:
  • 1. в системе должен быть установлен пакет fping (или любой другой с аналогичной функциональностью, например nmap);
  • 2. пользователь, от которого запущен WEB-сервер, обычно www-data, можно проверить командой
    ps aux | egrep '([a|A]pache|[h|H]ttpd)' | awk '{ print $1}' | uniq | tail -1
    должен иметь возможность выполнения команды ifconfig от имени суперпользователя (sudo ifconfig) или запускать эту утилиту непостредственно по пути её расположения, обычно /sbin/ifconfig, можно проверить командой 
    whereis ifconfig

Статья написана для Блога «Умного дома».

2018   BASH   досуг   маленькие хитрости   ОС   сеть   сисадминство   скрипт   софт
Ранее Ctrl + ↓
Наверх