Бороздя просторы интернета я иногда натыкался на описания миграции на 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-контроллера, обязательно пущую его в продакт и обкатаю на нем это дело.