Replace disk online

Материал из ALT Linux Wiki

Запишу здесь свои эксперименты с софтверным рейдом - эмуляция сбоя и смена одного из дисков "на лету".

Исходные данные:

  • относительно старый сервер с набортным SCSI-адаптером LSI Logic / Symbios Logic 53c1010 (1000:0021, subsystem 103c:60a0);
  • hot-swap корзина;
  • пара винчестеров на 18 гб;
  • свежепоставленный и обновлённый Server4.0.1, ядро 2.6.18-ovz-rhel-alt2.M40.5

Винчестеры побиты на 3 раздела, на которых подняты raid1: 1 - под своп, 2 - под корень, 3 - под LVM, там еще три раздела (usr, home, var).

Всё настроено, крутится, работает.

Итак, эмуляция сбоя: запускаем stress для видимости интенсивной работы (в т.ч. по отжиранию памяти и использованию свопа) и выдёргиваем из корзины один из дисков. Система уходит в ступор на полминуты, пытаясь осознать, что с ней произошло, после чего отвисает и разражается руганью в логах на испорченные рейды и IO errors. Работоспособность системы ничуть не нарушена. В /proc/mdstat исчезнувшие разделы помечены как fault, а устройства в системе остались.

Теперь попробуем вновь ввести этот диск в работу:

  • удаляем записи об сбойных разделах из рейдов. Если этого не сделать, то вновь подключенный диск сменит своё имя устройства.
mdadm /dev/md0 --remove /dev/sdb1
mdadm /dev/md1 --remove /dev/sdb2
mdadm /dev/md2 --remove /dev/sdb3
  • удаляем из системы отсутствующее физически устройство:
echo "1" > /sys/block/sdb/device/delete

при этом пропадают /dev/sdb*. Если этого не проделать, нижеследующее сканирование не сработает.

  • втыкаем диск обратно в корзину, прислушиваясь к его раскрутке
  • просим драйвер пересканировать шину:
echo "- - -" > /sys/class/scsi_host/host0/scan

после некоторой задержки на сканирование устройства вновь объявляются, а в логах видим протокол сканирования, как при старте системы. Иногда это сканирование срабатывает не с первого раза, отваливаясь по полуминутному таймауту, и тогда его можно попробовать повторить. Загадочные "- - -" суть: "$channel $id $lun". Прочерки просто означают все_сразу вместо конкретного значения.

  • (тут для надёжности непопадания в рейд кривых данных можно обнулить свежеобъявленные разделы, но вообще не обязательно)
  • (тут в случае нового диска мы должны создать на нём разделы по числу и размеру имеющихся, с типом FD)
  • добавляем в рейды новые разделы:
mdadm /dev/md0 --add /dev/sdb1
mdadm /dev/md1 --add /dev/sdb2
mdadm /dev/md2 --add /dev/sdb3

наблюдаем логи, наблюдаем /proc/mdstat. После возможной синхронизации мы имеем рейды с полностью исправными членами.

  • выдёргиваем из корзины другой диск..... ;)

Литература