Бороздя просторы интернета я иногда натыкался на описания миграции на RAID1, но никогда особо не обращал на них внимания, при правильно поставленной задаче в этом просто нет смысла. По-моему, если планировать недорогой сервер, то софтовый RAID можно предусмотреть с самого начала, и сразу на него уже проинсталить операционную систему, а заодно и проверить как он отреагирует на отключение одного из винтов. Но бывают ситуации из разряда одна на миллион, когда в руки попадает какой-нибудь недорогой Supermicro расположенный на площадке провайдера, на единственном винте которого чудесным образом вращается около сотни различных сайтов.

1. Лирика (вступление)

В Linux дело с миграцией на софтовый RAID1 обстоит явно хуже чем в FreeBSD, и провести полноценную онлайн миграцию приложив при этом минимум усилий почти невозможно. Дело в том, что софтовый RAID хранит свои метаданные на каждом из дисков массива, для версии суперблока 0.90 и 1.0 они хранятся в конце диска, а для версий 1.1 и 1.2 в начале. Поэтому что бы перенести файловую систему на RAID, ее нужно либо сжать при помощи resize2fs, либо создать новую файловую систему на RAID и перенести данные копированием, – в обоих случаях файловую систему придется отмонтировать, причем явно не на 5 минут.

В этой ситуации спасает то, что при установке по-умолчанию CentOS создает небольшой раздел для загрузчика, а остальное размещает на втором разделе при помощи LVM. А LVM уже может достаточно прозрачно перемещать логические тома между физическими дисками.

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

[root@web16 ~]# fdisk -l /dev/sda
 
Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0007a541
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
/dev/sda2              64        6591    52428800   8e  Linux LVM

Как и предполагалось – один 512мб раздел под /boot и все остальное в Linux LVM.

[root@web16 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 vg_web16 lvm2 a-- 50.00g 0

На втором разделе диска создана группа томов с именем vg_web16, при установке поименованная по имени сервера.

[root@web16 ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
lv_root vg_web16 -wi-ao-- 44.06g
lv_swap vg_web16 -wi-ao-- 5.94g

И на этой группе томов располагаются два тома под данные и свап. Все как нужно.

1. Основной раздел

Я предполагаю, что устанавливаются совершенно одинаковые диски и копировать таблицу разделов можно один к одному, в противном случае разбивку лучше сделать вручную.

[root@web16 ~]# sfdisk -d /dev/sda | sfdisk /dev/sdb --force

Ставим mdadm и создаем RAID1 массив с именем md2, в этот массив помещается только один раздел со второго (пустого) диска, раздел с первого диска пока помечается как отсутствующий.

[root@web16 ~]# yum install mdadm
[root@web16 ~]# mdadm --create --metadata=1.2 --level=1 --raid-devices=2 /dev/md2 missing /dev/sdb2

Далее помечаем /dev/md2 как физический том LVM, расширяем на него группу томов vg_web16, переносим все логические тома лежащие на первом диске /dev/sda2 на созданный RAID-массив /dev/md2.

[root@web16 ~]# pvcreate /dev/md2
[root@web16 ~]# vgextend vg_web16 /dev/md2
[root@web16 ~]# pvmove /dev/sda2 /dev/md2

Операция pvmove может выполняться длительное время, для 500Гб SATA-дисков оно составило около 45 минут. Теперь удаляем из группы томов первый диск и добавляем его в RAID

[root@web16 ~]# vgreduce vg_web16 /dev/sda2 
[root@web16 ~]# mdadm --add /dev/md2 /dev/sda2

Ждем пока закончится процесс синхронизации дисков в RAID1.

[root@web16 ~]# watch -n1 cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda2[2] sdb2[1]
      52427704 blocks super 1.2 [2/1] [_U]
      [>....................]  recovery =  1.3% (717568/52427704) finish=7.2min speed=119594K/sec

2. Раздел Boot

Опять как и для предыдущего раздела создаем RAID-массив с одним диском, и выбираем формат суперблока 0.90 или 1.0, с другими форматами GRUB 0.97 работать не умеет.

[root@web16 ~]# mdadm --create --metadata=1.0 --level=1 --raid-devices=2 /dev/md1 missing /dev/sdb1

Форматируем созданный раздел в ext4 и переносим на него данные из директории /boot

[root@web16 ~]# mkfs.ext4 /dev/md1
[root@web16 ~]# mount /dev/md1 /mnt
[root@web16 ~]# cp -R /boot/* /mnt
[root@web16 ~]# umount /mnt

Размонтируем /boot отключив от него первый раздел первого диска и примонтируем туда RAID-массив /dev/md1, а затем добавляем отмонтированный диск в этот массив.

[root@web16 ~]# umount /boot
[root@web16 ~]# mount /dev/md1 /boot
[root@web16 ~]# mdadm --add /dev/md1 /dev/sda1

3. Настройка initrd и grub

Итак, initrd или initramfs – это прообраз файловой системы используемый не этапе первоначальной загрузки, главная его цель загрузить все необходимые драйвера, например софтовый RAID или LVM, смонтировать файловую систему, а за тем предать управление дальше. Для того что бы система могла загружаться с софтового RAID-массива initrd нужно пересоздать.

Для начала формируем конфигурационный файл mdadm.conf

[root@web16 ~]# mdadm --examine --scan > /etc/mdadm.conf

Меняем в /etc/fstab точку монтирования для /boot, все остальные точки монтирования находятся на LVM и поэтому остаются на своих местах.

/dev/md1      /boot      ext4     defaults     1 2

Пересоздать initramfs можно при помощи утилиты dracut, начиная с Fedora 12 она пришла на смену mkinitrd. Проверяем выключены ли в конфигурацию LVM и MDADM, и перезаписываем старый initramfs.

[root@web16 ~]# cat /etc/dracut.conf | egrep -v "^($|#)"
mdadmconf="yes"
lvmconf="yes"
[root@web16 ~]# dracut --mdadmconf --force /boot/initramfs-`uname -r`.img `uname -r`

Из конфигурационного файла Grub убираем параметры ядра отключающие загрузку mdraid.

[root@web16 ~]# sed -i -e "s/rd_NO_DM //; s/rd_NO_MD //;" /boot/grub/grub.conf

Настраиваем Grub на обоих дисках

[root@web16 ~]# grub
grub> root (hd0,0)
grub> setup (hd0)
grub> root (hd1,0)
grub> setup (hd1)
grub> quit

Запасаемся на всякий случай LiveCD и отправляем сервер в перезагрузку.

4. Заключение

Честно говоря провести миграцию с первого раза на рабочей системе не получилось, после перезагрузки сервер не находил mdraid и выпадал в kernel-panic. Спасла загрузка с LiveCD и уже из под него запуск всех сервисов, которые на нем крутились, так или иначе down-time увеличился где-то на 10-15 минут. Проблемка оказалась всего-ничего в отсутствии параметра –mdadmconf при запуске dracut, и после перестроения initramfs вторая перезагрузка прошла уже успешно.

В принципе LVM и сам не плохо умеет делать RAID, и как мне кажется это намного проще чем с mdraid, основной раздел легко разместиться LVM-RAID, а /boot можно просто скопировать на оба диска и монтировать по метке. Но это теория.. как только попадется какой-нибудь еще сервер без RAID-контроллера, обязательно пущую его в продакт и обкатаю на нем это дело.

Оставить комментарий