Имеем два диска одинаковой емкости (в моем случае 1ТБ с поддержкой GPT), которые хотим собрать в программный RAID-1 без переустановки системы (система установлена на /dev/sda). На борту grub 0.97, кстати.

Без доступа к KVM лучше даже не начинать что-либо делать.

[root@aska ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2             911G  1.2G  864G   1% /
tmpfs                  12G     0   12G   0% /dev/shm
/dev/sda1              97M   49M   44M  53% /boot
/dev/sda4             2.0G   36M  1.9G   2% /tmp
1. Т.к. диски с поддержкой разметки GPT, то fdisk ничего интересного не покажет, кроме одной большой парции на весь диск и ошибки поддержки GPT. Для начала нужно разметить диск sdb (сейчас пустой) так же, как sda (с системой).
sfdisk -d /dev/sdb | sfdisk /dev/sda
В нашем случае в связи с тем, что диск использует GPT, sfdisk бесполезен. Потому просто скопируем первые 63 блока с информацией о разметке диска так (если у вас диски без GPT, то этого делать не нужно):
dd if=/dev/sda of=/dev/sdb count=63
После, чтобы система подхватила новую разметку диска:
partprobe
Теперь у нас есть два одинаково разбитых диска, проверяем что все парции определились нормально:
[root@aska ~]# ls /dev/ | grep sd
sda
sda1
sda2
sda3
sda4
sdb
sdb1
sdb2
sdb3
sdb4
2. Хорошо, у нас есть одинаковые парции, засунем в raid парции sdb и сделаем файловую систему:
mdadm --create /dev/md0 --metadata=0.90 --level=1 --raid-devices=2 /dev/sdb1 missing
mdadm --create /dev/md1 --metadata=0.90 --level=1 --raid-devices=2 /dev/sdb2 missing
mdadm --create /dev/md2 --metadata=0.90 --level=1 --raid-devices=2 /dev/sdb4 missing
3. /dev/sdb3 не трогаем, нет смысла делать swap в рейде. Теперь файловая система:
mkfs.ext2 /dev/md0 # для /boot оптимально ext2
mkfs.ext4 /dev/md1 # для / оптимально ext4
mkfs.ext4 /dev/md2 # для /tmp оптимально ext4
mkswap /dev/sdb3   # создаем swap на свободной парции второго диска
4. raid парции с sdb готовы, теперь посмотрим что получилось и запишем в /etc/mdadm.conf
[root@aska ~]# mdadm --detail --scan
ARRAY /dev/md0 metadata=0.90 UUID=2ad7a3cb:c529bc5b:471e044a:b012c701
ARRAY /dev/md1 metadata=0.90 UUID=bde7711f:0fab930c:471e044a:b012c701
ARRAY /dev/md2 metadata=0.90 UUID=c36b33c1:021b3b60:471e044a:b012c701
[root@aska ~]# mdadm --detail --scan > /etc/mdadm.conf
5. Это готово. Теперь надо сделать изменения в grub и fstab на текущей системе. Для этого идем в /boot и редактируем grub/grub.conf. Для начала проверим параметры ядра:
cat /boot/grub/grub.conf | grep MD
Не должно выдать ничего. Если выдает строки с параметрами ядра rd_no_md, если есть такие – удаляем rd_no_md, без этого grud raid парции распознавать при загрузке не будет.
Далее смотрим какое ядро загружено сейчас (uname -r), находим блок для этого ядра в grub.conf, и делаем в нем замену
ro root=UUID=9f1affbd-1d56-4463-a184-82d0965189d9
и заменим на
ro root=/dev/md1
Вы должны помнить что md1 у нас – это парция c корнем (/) системы. Также заменяем в том же блоке
root (hd0,0) на root (hd1,0)
Здесь закончили. Идем в /etc и редактируем fstab – заменяем устройства /dev/sda* на соответствующие им /dev/md*, вот так должен выглядеть файл после редактирования:
[root@aska ~]# cat /etc/fstab
#UUID=9f1affbd-1d56-4463-a184-82d0965189d9 /                       ext4    defaults        1 1
/dev/md1                /                       ext4    defaults        1 1
#UUID=41e2be20-a05b-4db8-a13e-9b15ef379a90 /boot                   ext2    defaults        1 2
/dev/md0                /boot                   ext2    defaults        1 2
#UUID=4672b344-eb53-48c5-9c67-70af3f2fca4a /tmp                    ext4    noexec,nosuid,nodev        1 2
/dev/md2                /tmp                    ext4    noexec,nosuid,nodev        1 2
UUID=b9de4859-da45-4033-a29b-ef0d421ac231 swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
Старые устройства у меня закомментированы (там UUID=<id> вместо /dev/sda*, из-за GPT, сути это не меняет).
Примонтируем наши /dev/md* девайсы.
mount /dev/md2 /mnt/md2
mount /dev/md1 /mnt/md1
mount /dev/md0 /mnt/md0
6. После изменений в конфигурации grud нужно обновить initrd, и переделать initramfs с подключением нашего mdadm.conf
mv /boot/initrd-`uname -r`.img /boot/initrd-`uname -r`.img.old  # Забеками старый
mkinitrd /boot/initrd-`uname -r`.img `uname -r`                 # Сделаем новый, это нужно сделать для применения изменений в grub
mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.old     # Забекапим
dracut --mdadmconf --force /boot/initramfs-$(uname -r).img $(uname -r)     # Сделаем новый ram-диск для инициализации OS (нужно для верного определения устройств md*)
7. Почти все готово к ребуту. Кроме самого важного – данные то не скопировали. Копируем.
cp -dpRx / /mnt/md1
cd /boot
cp -dpRx . /mnt/md0
cd /tmp
cp -dpRx . /mnt/md2
8. Итак, что имеем. Мы сделали raid-парции, скопировали все данные на них, сконфигурировали os на определение и монтирование raid-1 парций при инициализации и grub на загрузку с этих парций.
Установим grub на диски. Код ниже позаимствовал из какой-то статьи, т.к. свой как-то по ходу дела не сохранил:
grub
root (hd0,0)

grub> root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83

grub>

setup (hd0)

grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  15 sectors are embedded.
 succeeded

 Running "install /grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
 Done.

grub>

root (hd1,0)

grub> root (hd1,0)
 Filesystem type is ext2fs, partition type 0xfd

grub>

setup (hd1)

grub> setup (hd1)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd1)"...  15 sectors are embedded.
 succeeded

 Running "install /grub/stage1 (hd1) (hd1)1+15 p (hd1,0)/grub/stage2 /grub/grub.conf"... succeeded
 Done.

grub>

quit
Теперь можно и ребут сделать.
reboot

Если все прошло хорошо – сервер загрузится без проблем. Иногда время загрузки может чуть увеличиться по сравнению с обычным.

Часть два – после ребута

Первым делом поглядим что и как у нас загрузилось:

[root@aska ~]# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sdb2[0]
      970367936 blocks [2/1] [U_]
md0 : active raid1 sdb1[0]
      102336 blocks [2/2] [UU]
md2 : active raid1 sdb4[0]
      2096064 blocks [2/1] [U_]
unused devices: <none>
[root@aska ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/md1              911G  1.2G  864G   1% /
tmpfs                  12G     0   12G   0% /dev/shm
/dev/md0               97M   79M   13M  87% /boot
/dev/md2              2.0G   36M  1.9G   2% /tmp
Все в норме – raid парции определились (хотя это можно и не проверять, ничего бы не загрузилось без этого) и система загрузилась с них.


1. Теперь диск sda у нас уже не основной, засунем его в raid-1 массив и синхронизируем со вторым:
mdadm --add /dev/md0 -a /dev/sda1
mdadm --add /dev/md1 -a /dev/sda2
mdadm --add /dev/md2 -a /dev/sda4

Проверяем ход синхронизации:

[root@aska ~]# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sda2[2] sdb2[0]
      970367936 blocks [2/1] [U_]
      [==========>..........]  recovery = 54.7% (531472320/970367936) finish=68.6min speed=106516K/sec
md0 : active raid1 sda1[1] sdb1[0]
      102336 blocks [2/2] [UU]
md2 : active raid1 sda4[2] sdb4[0]
      2096064 blocks [2/1] [U_]
        resync=DELAYED
unused devices: <none>
Процедура не быстрая, я успел попить чаю, посмотреть сериал, и написать эту статью.
Следить за ходом процесса можно используя watch cat /proc/mdstat
Дождемся завершения синхронизации. Пойду пока еще один сериал посмотрю…
Закончилась синхронизация:
[root@aska ~]# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sda2[1] sdb2[0]
970367936 blocks [2/2] [UU]
md0 : active raid1 sda1[1] sdb1[0]
102336 blocks [2/2] [UU]
md2 : active raid1 sda4[1] sdb4[0]
2096064 blocks [2/2] [UU]
unused devices: <none>
2. Теперь можно и по пиву аниме переписать mdadm.conf:
mdadm --detail --scan > /etc/mdadm.conf
3. Сделаем парции обоих дисков raid’ового типа. Для дисков с GPT запускаем gdisk и выставляем тип FD00 для каждой парции каждого диска (кроме парций под SWAP, конечно). Если у вас диски без GPT, то ставим raid autodetect через fdisk, параметр (тип fd).


4. Переконфигурируем grub еще раз.
[root@aska ~]# mcedit /boot/grub/menu.lst
В начале файла ищем указание до splashimage и меняем в нем hd0 на hd1 (должно быть).
Еще раз установим grub на оба диска:
grub
root (hd0,0)

grub> root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83

grub>

setup (hd0)

grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  15 sectors are embedded.
 succeeded

 Running "install /grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
 Done.

grub>

root (hd1,0)

grub> root (hd1,0)
 Filesystem type is ext2fs, partition type 0xfd

grub>

setup (hd1)

grub> setup (hd1)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd1)"...  15 sectors are embedded.
 succeeded

 Running "install /grub/stage1 (hd1) (hd1)1+15 p (hd1,0)/grub/stage2 /grub/grub.conf"... succeeded
 Done.

grub>

quit
Контрольный ребут для проверки и система готова к работе.
reboot