Replace disk online
Запишу здесь свои эксперименты с софтверным рейдом - эмуляция сбоя и смена одного из дисков "на лету".
Исходные данные:
- относительно старый сервер с набортным 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. После возможной синхронизации мы имеем рейды с полностью исправными членами.
- выдёргиваем из корзины другой диск..... ;)
Литература
- Программный RAID в Linux
- Как пересканировать SCSI-шину без перезагрузки компьютера?
- откровения vsu@ на #altlinux