четверг, 18 августа 2011 г.

Состояние сервера

Так как сервер, над котором я эксперементирую достаточно древний, чтобы опасаться за его здоровье, возникла острая потребность наблюдать его состояние и условия работы.
Общее тестирование жёстких дисков с помощью утилиты smartctl, я рассмотрю чуть позже (в отдельной заметке), а тут остановимся на проверки условий работы.
За информацию о температурах системы и работе вентиляторов охлаждения в Linux отвечает утилита lm_sensors, а за температуру жёстких дисков. Так что первым делом надо их установить.
$sudo apt-get install hddtemp lm_sensors
или для OenSuSE:
#zypper install hddtemp sensors
Обратите внимание, что пакет lm_sensors в OpenSuSE зовётся просто sensors (по-началу меня это сбило с толку). Если hddtemp не окажется в репках OpenSuSE, пошарьте на software.opensuse.org - там всегда найдётся пара-тройка репок в которых они есть.
После установки стоит проверить работоспособность hddtemp вбив в терминале:
#hddtemp /dev/sda
С lm_sensors всё на шаг длиннее.
#sensors-detect
После этого lm_sensors будет сканировать подключённые устройства и вам многократно придётся жать "Enter".
По окончании процесса будет сформирован файл /etc/sysconfig/lm_sensors, а также будет предложено скопировать prog/init/lm_sensors.init в /etc/rc.d/init.d/lm_sensors - этого категорически делать нельзя. В вашем дистрибутиве уже есть этот файл, если вы его устанавливали из репок. Если собирали из сырцов - придётся править его в соответствии с особенностями вашего дистрибутива. Иначе, например в OpenSuSE он будет ругаться на line 39 в которой не хватает некоего /etc/init.d/function, а без него всё работать отказывается.
Следующим шагом необходимо добавить lm_sensors в загрузку. В OpenSuSE это делается через yast → System → System Services (Runlevel). Для других дистрибутивов нужно почитать специфику.
После этого по запросу
#sensors вам будет выдаваться таблица а ля:
adm1027-i2c-3-2e
Adapter: SMBus I801 adapter at c800
in0: +1.48 V (min = +0.00 V, max = +3.32 V)
Vcore: +1.50 V (min = +0.00 V, max = +2.99 V)
+3.3V: +3.34 V (min = +2.97 V, max = +3.63 V)
+5V: +5.05 V (min = +4.50 V, max = +5.50 V)
+12V: +11.92 V (min = +0.00 V, max = +15.94 V)
fan1: 3321 RPM (min = 0 RPM)
fan2: 0 RPM (min = 0 RPM)
fan3: 1058 RPM (min = 0 RPM)
fan4: 0 RPM (min = 0 RPM)
temp1: +46.8°C (low = -127.0°C, high = +127.0°C)
M/B Temp: +38.5°C (low = -127.0°C, high = +127.0°C)
temp3: +39.8°C (low = -127.0°C, high = +127.0°C)
cpu0_vid: +1.525 V

Вроде как всю нужную информацию мы теперь получить можем. Однако форма неудобоваримая и команд несколько. Поэтому попробуем сформировать нужные нам данные и записать всё в .bashrc.
Не мудрствуя лукаво, я притырил скрипт отсюда и слегка подправил его под свои дела:
test -s ~/.alias && . ~/.alias || true

function memdisp {

MEM=`free -mot | head -n 2 | tail -n 1`
COUNT=1
for ITEM in $MEM
do
if [ $COUNT -eq 2 ] ; then
printf " Total RAM:\t$ITEM Mb\n"
fi

if [ $COUNT -eq 3 ] ; then
printf " Used RAM:\t$ITEM Mb\n"

fi

if [ $COUNT -eq 4 ] ; then
printf " Free RAM:\t$ITEM Mb\n"
fi

COUNT=$[COUNT+1]
done

MEM=`free -mot | tail -n 2 | head -n 1`
COUNT=1
for ITEM in $MEM
do
if [ $COUNT -eq 2 ] ; then
printf " Total SWAP:\t$ITEM Mb\n"

fi

if [ $COUNT -eq 3 ] ; then
printf " Used SWAP:\t$ITEM Mb\n"

fi

if [ $COUNT -eq 4 ] ; then
printf " Free SWAP:\t$ITEM Mb\n"

fi

COUNT=$[COUNT+1]
done

}

UPTIME=`uptime`
D_UP=${UPTIME:2}

alias hi="
printf ' Hello \t`whoami`\n'
printf ' Today is:\t\t`date`\n'
printf ' Number of user login:\t\t`who | wc -l`\n'
printf ' uptime:\t$D_UP\n'
printf ' Sensors:\t`sensors -A`\n'
printf ' HDD1: \t`hddtemp -n /dev/sda`°C\n'
printf ' HDD2: \t`hddtemp -n /dev/sdb`°C\n'
memdisp
"

Теперь войдя в систему я просто пишу
#hi
и получаю в ответ сводку:
Hello root
Today is: Thu Aug 18 13:15:45 MSD 2011
Number of user login: 1
uptime: 3:15pm up 3:19, 1 user, load average: 0.00, 0.01, 0.05
Sensors: adm1027-i2c-3-2e
in0: +1.48 V (min = +0.00 V, max = +3.32 V)
Vcore: +1.47 V (min = +0.00 V, max = +2.99 V)
+3.3V: +3.35 V (min = +2.97 V, max = +3.63 V)
+5V: +5.06 V (min = +4.50 V, max = +5.50 V)
+12V: +11.84 V (min = +0.00 V, max = +15.94 V)
fan1: 3262 RPM (min = 0 RPM)
fan2: 0 RPM (min = 0 RPM)
fan3: 1056 RPM (min = 0 RPM)
fan4: 0 RPM (min = 0 RPM)
temp1: +47.8°C (low = -127.0°C, high = +127.0°C)
M/B Temp: +37.2°C (low = -127.0°C, high = +127.0°C)
temp3: +39.0°C (low = -127.0°C, high = +127.0°C)
cpu0_vid: +1.525 V
HDD1: 36°C
HDD2: 39°C
Total RAM: 495 Mb
Used RAM: 195 Mb
Free RAM: 300 Mb
Total SWAP: 2053 Mb
Used SWAP: 0 Mb
Free SWAP: 2053 Mb
Можно ещё причесать вывод Sensors, но пока руки не доходят ~_~.
В общем, то, что я хотел — я получил. Если кому пригодится — пользуйтесь :)
P.S. Вообще я считаю чрезвычайно странным, что утилиты по получению информации о состоянии железа не включены в ядро, не говоря уже про комплектацию дистрибутивов. Неужели никого не интересует в каком состоянии пребывает сервер?

пятница, 5 августа 2011 г.

Всякие там HDD ID

В связи с переездом на новый хард (обзавёлся "зелёным" WD на 2Тб) столкнулся с проблемой, которая раньше обходила меня стороной - с HDD ID.

Если кто не знает, некоторое время назад, стоило изменить разметку диска, как Linux терял свои разделы. Это было связано с тем, что разделы в fstab нумеровались по физическому положению на диске - т.е. sda1 - первый праймари раздел на первом диске, sda5 - первый расширенный раздел и т.д.

То есть стоило впихнуть перед sda5 ещё один раздел, как sda5 переезжал на sda6 и если на нём располагались жизненно важные структуры (типа /usr или /home) система грузиться отказывалась и приходилось грузиться с лайвсиди и править fstab и grub.

Так вот комьюнити решило исправить недостаток. Выявилось сразу несколько решений среди которых наибольшую популярность приобрели UUID и hdd ID.

UUID в первую очередь проталкивала Canonical в своём не безызвестном дистрибе Убунту. hdd ID нашёл прибежище, например, в моей SuSE.

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

Казалось бы - проблема решена.

Однако не всё так славно. ID привязан к жёсткому диску и при миграции раздела с одного жёсткого диска на другой, ID имеет свойство меняться.

Так и произошло у меня - GRUB выдал ERROR 17, я залез в fstab и обнаружил... уже упомянутые абсолютно не читаемые сочетания буков и цифр.

Возник вопрос, где взять оные для моих целей. Ответ выяснился довольно быстро, но не очевидно, что я в итоге и решил написать тут (как водится, чтоб самому не забыть).

Чтобы выяснить HDD ID нужно просто посмотреть что находится в папке /dev/disk/by-id
Так как этот вариант кодировки указывает на жёсткий диск прямо в названии, вы легко можете понять какой ID какому разделу принадлежит.

Чтобы выяснить UUID можно чисто теоретически заглянуть в /dev/disk/uuid однако это даст вам мало, т.к. бессистемное сочетание буков и цифр никак не скажет вам о своих корнях. Для того, чтобы выяснить UUID в сочетании с физическим расположением диска, можно воспользоваться командой blkid. Если написать её без аргументов (причём не важно из под рута или нет) она выдаст вам красивую таблицу соответствия.

Единственная беда - все эти id'шники надо вбить в fstab и, в моём случае, в меню grub. Не очень удобно хоть и очевидно.