среда, 30 января 2013 г.

Не загружался сервер с программным RAID1 на MD

Вчера ночью на одном из серверов вылетел жесткий диск из программного RAID1. Один из вариантов решения проблемы - программно отключить сбойный диск и затем вернуть его обратно, запустив поиск на SATA шине. Я уже как-то описывал этот способ тут.

Недостаток этого способа в том, что не всегда удается надолго вернуть в строй диск подобным способом. Более надежным будет отключить питание от диска и затем подключить его обратно. Поскольку у того сервера нет hot-swap корзины и была возможность отключить сервер, то я выключил и включил сервер (просто перезагрузить или нажать reset может быть недостаточно).

Однако после меню grub'а не последовала загрузка системы, а вместо этого меню ждала ошибка вида VolGroup00/swap not found. Через несколько секунд вывалилось приглашение initramfs и появилась возможность посмотреть причину сбоя.

Поскольку VolGroup00/swap - логический том поверх RAID1В /proc/mdstat не было ни одного массива (на сервере их два: md0 и md1). Смотрю в /etc/mdadm/mdadm.conf - нужные массивы на месте. Пробую запустить их вручную:

initramfs> mdadm -A /dev/md0
initramfs> mdadm -A /dev/md1

После этого нужные массивы появились в /proc/mdstat. Последним штрихом была активация томов LVM2

initramfs> vgchange -ay

Далее выхожу из initramfs (Ctrl+D) и система продолжает нормальную загрузку. После добавления сбойного диска обратно в массив и окончания ребилда, пробую снова перезагрузить сервер и спотыкаюсь о ту же ошибку.

После перепроверки всех настроек, пересборки initramfs я решил сравнить вывод mdadm --detail --scan и соответствующих секций в /etc/mdadm/mdadm.conf. И вот тут нашлось различие:

# mdadm --detail --scan
ARRAY /dev/md0 metadata=1.2 name=finnix:0 UUID=d5824c5a:ecf39d9a:89c3b877:ec43e0c0
ARRAY /dev/md1 metadata=1.2 name=finnix:1 UUID=4c287c75:edef1139:07ca6e74:b0fcb0e6

# grep ^ARRAY /etc/mdadm/mdadm.conf
ARRAY /dev/md0 metadata=1.2 name=0 UUID=d5824c5a:ecf39d9a:89c3b877:ec43e0c0
ARRAY /dev/md1 metadata=1.2 name=1 UUID=4c287c75:edef1139:07ca6e74:b0fcb0e6

Различие в значении параметров name=. Заменяю описание актуальным и пересобираю initramfs.

# sed -i -e '/^ARRAY/d' /etc/mdadm/mdadm.conf
# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
# update-initramfs -u

После всех манипуляция перезагрузка прошла без проблем.

вторник, 22 января 2013 г.

Wine 1.5.22 для Debian Squeeze/Wheezy

Собрал пакеты для свежей версии Wine 1.5.22. Анонс новой версии тут. Пакеты собраны для Debian Squeeze (i386, amd64) и Debian Wheezy (пока только i386). Взять можно в моем репозитарии.

В планах попробовать собрать multiarch для Wheezy, мне уже подкинули пару полезных ссылок, но пока не хватает свободного времени для этого.

пятница, 18 января 2013 г.

Настройка планировщика ввода/вывода для дисков с поддержкой NCQ

Появление NCQ в SATA II дисках дало возможность перенести упорядочивание очереди запросов к жесткому диску на плечи самого диска. Сегодня мне довелось тестировать работу базы данных на программном RAID-0 и я решил попробовать NCQ для этой задачи. Чтобы исключить влияние планировщика Linux (сейчас по-умолчанию им является CFQ) я включаю планировщик noop (на самом деле noop не занимается переупорядочиванием запросов и служит для того, чтобы выключить планирование ввода/вывода для конкретного блочного устройства) для всех дисков, которые поддерживают управление очередью запросов.

Руками это можно сделать записав noop в /sys/block/sda/queue/scheduler, но проблема в том, что в тестовый сервер собран на базе простого десктопного железа но с дополнительными SATA контроллерами на шине PCI-E x1. Системный диск и вовсе IDE.

Один из способов решить проблему - задать elevator=noop в параметрах ядра, но тогда придется руками найти системный жесткий диск и вернуть ему cfq в качестве планировщика. Но мне больше нравится идея оставить cfq по-умолчанию, а для жестких дисков с NCQ включить noop в из скрипта при загрузке системы.

$ cat /root/bin/noop4ncq.sh
#!/bin/bash

for _blkdev in `ls -1d /sys/block/*`
do
 # Check if block device has support for NOOP IO scheduler
 if [ -e "$_blkdev/queue/scheduler" ]; then
  if `grep -q noop "$_blkdev/queue/scheduler"`; then
   if [ ! -e "$_blkdev/device/queue_depth" ]; then
    continue
   fi
   if [ `cat "$_blkdev/device/queue_depth"` -gt 1 ]; then
    echo -n "Selecting NOOP I/O scheduler for $_blkdev: "
    echo noop >"$_blkdev/queue/scheduler" 2>/dev/null && echo OK || echo FAIL
   else
    continue
   fi
  else
   continue
  fi
 fi
done

Из скрипта видно, что noop включается не для всех блочных устройств, а только для тех, у которых queue depth > 1. Это связано с тем, что для правильной планирования очереди запросов на аппаратном уровне недостаточно иметь только SATA II жесткий диск. Еще нужна поддержка NCQ в SATA контроллере и операционной системе хоста.

Осталось прописать вызов /root/bin/noop4ncq.sh в /etc/rc.local и все.

UPDATE: Альтернативное решение с использованием UDEV описано тут.

понедельник, 14 января 2013 г.

Wine 1.5.21 для Debian Squeeze/Wheezy

С горем пополам залил свежий билд Wine 1.5.21 в свой репозитарий. Для squeeze есть сборка для i386/amd64. Для wheezy только i386 (из-за перехода на multiarch и отсутствия свободного времени мне пока не удалось осилить amd64). Анонс версии 1.5.21.

вторник, 8 января 2013 г.

Debian preseed

Пост из разряда смотрю в книгу, а вижу фигу.

Пол-часа перечитываю документацию к debian unattended install, но не могу понять почему она не стартует. После N-го прочтения доки таки рассмотрел строку "When the graphical installer menu appears, press ESC", а я пытался жать Tab и редактировать параметры.

Чтобы не забыть
  • Нажать Esc (должно пропасть графическое меню и появиться приглашение boot:);
  • Вбить auto url=http://1.2.3.4/path/to/preseed.cfg;
  • Давить Enter и идти пить чай.