Pull to refresh

Centos 7 convert to software RAID 1

Reading time 2 min
Views 28K
Тема, которую я хочу затронуть, довольно популярная и рассмотрена на многих ресурсах, но для другой версии загрузчика «GRUB» и для другой версии ОС.

Преамбула


Потребовалось перенести установленный Centos 7 на software raid level 1 в ручном режиме, так как сама система ставилась через kickstart. Поискав информацию по данному вопросу, нашел материал только по старым версия ОС и по первой версии загрузчика «GRUB».

Решив, что методы аналогичные, лишь с изменением команд, взялся за дело и наткнулся на нюансы с «dracut».
По какой-то причине initramfs созданый «dracut» не видит собранного raid и отказывается грузится. Версия «dracut» 033.

Фабула


Решение было найдено и заключается оно в включении и посылке ядру опции «rd.auto=1» (опция заставляет автоматически определить и запустить все raid устройства которые есть в наличии), которая отключена по умолчанию в «dracut» начиная с версии 024.

Ниже я приведу набор команд для перевода установленной ОС на software raid level 1, для осуждения или помощи нуждающимся.

Исходные данные


Диск /dev/sda, на /dev/sda1 стоит система, размером в 4Гб.
Диск /dev/sdb полностью чистый.

Команды


1. Копируем полностью разделы, с sda на sdb:

sfdisk -d /dev/sda | sfdisk /dev/sdb

2. Через fdisk меняем id 83 на fd на sdb1:

fdisk /dev/sdb

3. Делаем raid level 1 с одним диском:

mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb1

4. Форматируем получившийся /dev/md0:

mkfs.ext4 /dev/md0

5. Монтируем наш /dev/md0:

mount /dev/md0 /mnt/

6. Копируем текущую сис-му на /dev/md0:

rsync -axu / /mnt/

7. Монтируем информацию о текущей системе в наш новый корень и делаем chroot в него:

mount --bind /proc /mnt/proc && mount --bind /dev /mnt/dev && mount --bind /sys /mnt/sys && mount --bind /run /mnt/run && chroot /mnt/

8. Получаем uuid /dev/md0 и вносим его в fstab, где заменяем uuid sda1 на uuid md0:

ls -l /dev/disk/by-uuid |grep md >> /etc/fstab && vim /etc/fstab

9. Создаем конфиг для mdadm, чтоб md0 не сменил имя при перезагрузке:

mdadm --detail --scan > /etc/mdadm.conf 

10. Делаем новый initramfs, с нужными модулями (вот тут-то dracut и подкачал):

mv /boot/initramfs-3.10.0-123.el7.x86_64.img /boot/initramfs-3.10.0-123.el7.x86_64.img.bak
dracut /boot/initramfs-$(uname -r).img $(uname -r)

11. Передаем ядру опцию «rd.auto=1» явно через «GRUB», для этого, добавляем ее в «GRUB_CMDLINE_LINUX»:

vim /etc/default/grub

12. Перепишем конфиг «GRUB» и установим его на наш диск sdb:

grub2-mkconfig -o /boot/grub2/grub.cfg && grub2-install /dev/sdb

13. Убеждаемся, что uuid md0 и опция «rd.auto=1» точно записались:

cat /boot/grub2/grub.cfg

14. Производим reboot машины и через bios boot меню выбираем диск с половинкой raid

15. После удачной загрузки, переделываем sda в часть raid. Меняем id 83 на fd через fdisk, добавляем диск в raid и переустанавливаем «GRUB» на диск:

fdisk /dev/sda
mdadm --manage /dev/md0 --add /dev/sda1
grub2-install /dev/sda

После этого смотрим как собирается raid через /proc/mdstat и можно попробовать загрузится с первого диска.

UPD: Из-за использования rd.auto=1, замечены проблемы с LVM, если он располагается на software raid разделе — LVM раздел будет not available после перезагрузки. Чтобы этого не происходило, нужно сделать следующее:
В пункте 11, нужно передать rd.md.uuid= UUID который мы положили в mdadm.conf, вместо «rd.auto=1», тем самым явно указав какой raid раздел нам собрать, чтобы загрузился корень.

Ссылка и решение про баг:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=725759
Tags:
Hubs:
+12
Comments 10
Comments Comments 10

Articles