Замена и тестирование сбойного диска в RAID1 на Linux
TL;DR
Если в RAID1 вышел из строя диск — можно смоделировать отказ, скопировать таблицу разделов с работоспособного диска на новый, сбросить метаданные RAID и добавить диск обратно для синхронизации. Проверьте /proc/mdstat, дождитесь завершения ресинхронизции и установите загрузчик (grub) на оба диска.
Тестирование и замена диска (пример)
Ниже показан пошаговый пример: в нём предполагается, что вышел из строя /dev/sdb. То же самое применимо и к /dev/sda — просто подставьте нужное имя устройства.
Чтобы смоделировать отказ диска, можно выключить систему и физически извлечь /dev/sdb, либо (soft-)удалить его программно:
mdadm --manage /dev/md0 --fail /dev/sdb1
mdadm --manage /dev/md1 --fail /dev/sdb2
mdadm --manage /dev/md2 --fail /dev/sdb3Затем удалите часть из массива:
mdadm --manage /dev/md0 --remove /dev/sdb1
mdadm --manage /dev/md1 --remove /dev/sdb2
mdadm --manage /dev/md2 --remove /dev/sdb3Выключите систему:
shutdown -h nowВставьте новый диск на место вышедшего (если вы симулировали отказ /dev/sda, то при сборке поменяйте местами диски так, чтобы новый диск стал /dev/sdb) и загрузите систему — она должна стартовать нормально.
Запустите:
cat /proc/mdstatВы увидите деградированный массив, например:
server1:~# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda3[0]
5550336 blocks [2/1] [U_]
md1 : active (auto-read-only) raid1 sda2[0]
497920 blocks [2/1] [U_]
md0 : active raid1 sda1[0]
240832 blocks [2/1] [U_]
unused devices:
server1:~# Проверка таблицы разделов:
fdisk -lОжидаемый вывод (пример):
server1:~# fdisk -l
Disk /dev/sda: 6442 MB, 6442450944 bytes
255 heads, 63 sectors/track, 783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000740fc
Device Boot Start End Blocks Id System
/dev/sda1 * 1 30 240943+ fd Linux raid autodetect
/dev/sda2 31 92 498015 fd Linux raid autodetect
/dev/sda3 93 783 5550457+ fd Linux raid autodetect
Disk /dev/sdb: 6442 MB, 6442450944 bytes
255 heads, 63 sectors/track, 783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000
Disk /dev/sdb doesn't contain a valid partition table
Disk /dev/md0: 246 MB, 246611968 bytes
2 heads, 4 sectors/track, 60208 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000
Disk /dev/md0 doesn't contain a valid partition table
Disk /dev/md1: 509 MB, 509870080 bytes
2 heads, 4 sectors/track, 124480 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000
Disk /dev/md1 doesn't contain a valid partition table
Disk /dev/md2: 5683 MB, 5683544064 bytes
2 heads, 4 sectors/track, 1387584 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000
Disk /dev/md2 doesn't contain a valid partition table
server1:~#Теперь копируем таблицу разделов с /dev/sda на /dev/sdb:
sfdisk -d /dev/sda | sfdisk /dev/sdbЕсли появится ошибка, можно попробовать с опцией –force:
sfdisk -d /dev/sda | sfdisk --force /dev/sdbПример вывода команды:
server1:~# sfdisk -d /dev/sda | sfdisk /dev/sdb
Checking that no-one is using this disk right now ...
OK
Disk /dev/sdb: 783 cylinders, 255 heads, 63 sectors/track
sfdisk: ERROR: sector 0 does not have an msdos signature
/dev/sdb: unrecognized partition table type
Old situation:
No partitions found
New situation:
Units = sectors of 512 bytes, counting from 0
Device Boot Start End #sectors Id System
/dev/sdb1 * 63 481949 481887 fd Linux raid autodetect
/dev/sdb2 481950 1477979 996030 fd Linux raid autodetect
/dev/sdb3 1477980 12578894 11100915 fd Linux raid autodetect
/dev/sdb4 0 - 0 0 Empty
Successfully wrote the new partition table
Re-reading the partition table ...
If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)
server1:~#После этого очистите возможные остатки суперблоков RAID на новом диске и добавьте его в массив:
mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdb2
mdadm --zero-superblock /dev/sdb3Добавляем разделы в массив:
mdadm -a /dev/md0 /dev/sdb1
mdadm -a /dev/md1 /dev/sdb2
mdadm -a /dev/md2 /dev/sdb3Посмотрите состояние:
cat /proc/mdstatПример прогресса ресинхронизации:
server1:~# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sdb3[2] sda3[0]
5550336 blocks [2/1] [U_]
[====>................] recovery = 23.2% (1288576/5550336) finish=1.1min speed=64428K/sec
md1 : active raid1 sdb2[2] sda2[0]
497920 blocks [2/1] [U_]
resync=DELAYED
md0 : active raid1 sdb1[1] sda1[0]
240832 blocks [2/2] [UU]
unused devices:
server1:~# Дождитесь завершения синхронизации — в финале все массивы должны показывать [UU]:
server1:~# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sdb3[1] sda3[0]
5550336 blocks [2/2] [UU]
md1 : active raid1 sdb2[1] sda2[0]
497920 blocks [2/2] [UU]
md0 : active raid1 sdb1[1] sda1[0]
240832 blocks [2/2] [UU]
unused devices:
server1:~# Наконец, установите загрузчик grub на оба HDD. Запустите grub и выполните команды:
grubВ интерактивной консоли grub:
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
quitГотово — вы заменили сбойный диск в RAID1 и восстановили зеркалирование.
Краткая методология (шаги)
- Смоделировать отказ (fail/remove) или вынуть диск.
- Вставить новый диск и загрузить систему.
- Скопировать таблицу разделов sfdisk.
- Очистить суперблоки mdadm –zero-superblock.
- Добавить разделы в массив mdadm -a.
- Проверить /proc/mdstat и дождаться [UU].
- Установить grub на оба диска.
Чек-лист для оператора
- Проверить текущее состояние md массивов: cat /proc/mdstat
- Убедиться, что необходимый диск физически заменён и виден системой: fdisk -l
- Корректно скопировать таблицу разделов: sfdisk -d /dev/sda | sfdisk /dev/sdb
- Обнулить старые суперблоки: mdadm –zero-superblock
- Добавить в массив и следить за прогрессом: cat /proc/mdstat
- Установить grub на оба диска
- Протоколировать время начала и завершения ресинхронизации
Критерии приёмки
- Все RAID-массивы отображают состояние [UU] в /proc/mdstat.
- Данные монтируются и доступны без ошибок.
- GRUB установлен на обоих физических дисках и система загружается, если вы отключаете один из них.
Когда описанный способ не сработает (ограничения и исключения)
- Оба диска в массиве повреждены — требуется восстановление из бэкапа.
- Различие в размерах/геометрии дисков: новый диск меньше оригинального — таблица разделов не встанет.
- Иные типы RAID (RAID5/6) подразумевают другие действия и порядок операций.
- Если используется LVM поверх RAID, дополнительно проверьте PV/VG/LPV.
Альтернативные подходы
- Горячая замена (hot-swap) без выключения: fail/remove/zero-superblock/add выполняются пока система работает и контроллер поддерживает hot-swap.
- Восстановление из бэкапа при полном выходе из строя обоих дисков.
Полезные команды проверки
- Просмотр состояния: cat /proc/mdstat
- Таблица разделов: fdisk -l или lsblk -f
- Копирование таблицы: sfdisk -d /dev/sda | sfdisk /dev/sdb
- Удаление метаданных RAID: mdadm –zero-superblock /dev/sdXN
- Добавление в массив: mdadm -a /dev/mdX /dev/sdXN
- Проверка логов: dmesg | tail, journalctl -e
Советы по безопасности и надёжности
- Всегда имейте актуальную резервную копию перед операциями с разделами и RAID.
- Убедитесь, что новые диски имеют достаточный размер и аналогичные характеристики.
- Протоколируйте все действия и временные метки операций восстановления.
Ссылки
- The Software-RAID Howto: http://tldp.org/HOWTO/Software-RAID-HOWTO.html
- Debian: http://www.debian.org/
Похожие материалы
Google Assistant на Galaxy Watch 4 — как установить
Трассировка изображений в Illustrator
Отправка денег через Facebook Messenger
Почему Nintendo Switch не включается — руководство
Точка доступа Wi‑Fi на iPhone и Android — настройка