
В этой статье описана последовательность действий необходимых для восстановление программного RAID в Linux после замены одного из диска. Действия описаны с момента как вы уже заменили винчестер и загрузили ОС с неполного массива. Для полноценного восстановления массива необходимо выполнить три основных шага:
1. Создать таблицу разделов на новом диске.
2. Синхронизировать данные на дисках.
3. Установить загрузчик (GRUB) на новый диск.
Допустим что дисковая массив был собран из двух жестких дисков объединенных в RAID 1.
На нем были созданы отдельные разделы для корня, директории /boot, /var/ и swap.
/ - /dev/md2 /boot - /dev/md1 swap - /dev/md0 /var - /dev/md3
Текущее состояние массива можно увидеть с помощью команды «cat /proc/mdstat«:
# cat /proc/mdstat Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md3 : active raid1 sdb4[1] 347734848 blocks [2/1] [_U] md2 : active raid1 sdb3[1] 367004800 blocks [2/1] [_U] md1 : active raid1 sdb2[1] 1052160 blocks [2/1] [_U] md0 : active (auto-read-only) raid1 sdb1[1] 16777856 blocks [2/1] [_U]
Из нее видно что сейчас массив работает с одного жесткого диска /dev/sdb. Необходимо синхронизировать новый диск (/dev/sda) с ним .
В начале создаем таблицу разделов на новом диске аналогичную /dev/sdb :
# sfdisk -d /dev/sdb | sfdisk /dev/sda Checking that no-one is using this disk right now ... OK Disk /dev/sda: 91201 cylinders, 255 heads, 63 sectors/track sfdisk: ERROR: sector 0 does not have an msdos signature /dev/sda: 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/sda1 3906 33559784 33555879 fd Linux raid autodetect /dev/sda2 33559785 35664299 2104515 fd Linux raid autodetect /dev/sda3 35664300 769674149 734009850 fd Linux raid autodetect /dev/sda4 769674150 1465144064 695469915 fd Linux raid autodetect Warning: no primary partition is marked bootable (active) This does not matter for LILO, but the DOS MBR will not boot this disk. 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).)
Команда sfdisk -d /dev/sdb — выводит текущее разбиение рабочего диска (делает дамп параметров) и передает по конвееру команде sfdisk /dev/sda которая воссоздает таблицу разделов на новом диске.
После создания таблицы разделов необходимо добавить в RAID новый диск, в первую очередь необходимо синхронизировать /, /boot и swap. Они обычно меньше объемом и их синхронизация проходит намного быстрее чем /var . А пока будет синхронизироваться /var мы установим загрузчик на новый диск.
Добавляем новые диски в RAID:
# mdadm --manage /dev/md1 --add /dev/sda2 mdadm: metadata format 00.90 unknown, ignored. mdadm: metadata format 00.90 unknown, ignored. mdadm: metadata format 00.90 unknown, ignored. mdadm: metadata format 00.90 unknown, ignored. mdadm: added /dev/sda2 # mdadm --manage /dev/md0 --add /dev/sda1 mdadm: metadata format 00.90 unknown, ignored. mdadm: metadata format 00.90 unknown, ignored. mdadm: metadata format 00.90 unknown, ignored. mdadm: metadata format 00.90 unknown, ignored. mdadm: added /dev/sda1 # mdadm --manage /dev/md2 --add /dev/sda3 mdadm: metadata format 00.90 unknown, ignored. mdadm: metadata format 00.90 unknown, ignored. mdadm: metadata format 00.90 unknown, ignored. mdadm: metadata format 00.90 unknown, ignored. mdadm: added /dev/sda3
Логика добавления проста — смотрим из какого раздела второго диска состоит программный RAID и добавляем аналогичный из первого.
Увидеть прогресс синхронизации можно с помощью команды » watch cat /proc/mdstat«.
После того как мы синхронизировали основные разделы, можем добавлять новый раздел и в /dev/md3 (директории /var):
[email protected]:~# mdadm --manage /dev/md3 --add /dev/sda4 mdadm: metadata format 00.90 unknown, ignored. mdadm: metadata format 00.90 unknown, ignored. mdadm: metadata format 00.90 unknown, ignored. mdadm: metadata format 00.90 unknown, ignored. mdadm: added /dev/sda4
Для того что бы синхронизация RAID забирала не все наши ресурсы, ограничим её скорость:
# echo 15000 > /proc/sys/dev/raid/speed_limit_max
Теперь необходимо установить загрузчик GRUB на новый диск, что бы мы могли загрузить ОС в случае выхода из строя второго диска. Загрузчик устанавливается из командной оболочки grub. При этом необходимо указать на каком разделе находится директория /boot . Так же следует учитывать что grub ведет отсчет разделов с 0, а не с 1 как ядро Linux.
В моем случае /boot — это /dev/sdb, для grub это будет hd0,1 :
# grub deviceProbing devices to guess BIOS drives. This may take a long time. Unknown partition table signature Unknown partition table signature GNU GRUB version 0.97 (640K lower / 3072K upper memory) [ Minimal BASH-like line editing is supported. For the first word, TAB lists possible command completions. Anywhere else TAB lists the possible completions of a device/filename. ] grub> device (hd0) /dev/sda devicedevice (hd0) /dev/sda Error 27: Unrecognized command grub> device (hd0) /dev/sda device (hd0) /dev/sda grub> root (hd0,1) root (hd0,1) Filesystem type is ext2fs, partition type 0xfd grub> setup (hd0) setup (hd0) Checking if "/boot/grub/stage1" exists... yes Checking if "/boot/grub/stage2" exists... yes Checking if "/boot/grub/e2fs_stage1_5" exists... yes Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 17 sectors are embedded. succeeded Running "install /boot/grub/stage1 (hd0) (hd0)1+17 p (hd0,1)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded Done. grub> quit
После окончания синхронизации дисков массив вернется к полностью штатной работе.