Тема, которую я хочу затронуть, довольно популярная и рассмотрена на многих ресурсах, но для другой версии загрузчика «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 и можно попробовать загрузится с первого диска.
Ссылка и решение про баг:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=725759
Автор: kuroneco