Centos 7 convert to software RAID 1

Тема, которую я хочу затронуть, довольно популярная и рассмотрена на многих ресурсах, но для другой версии загрузчика «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
Поделиться публикацией

Комментарии 10

    0
    swap остался на первом диске?
      0
      При текущих объемах оперативной памяти — мне не нужен swap.
      0
      Не совсем понял назначение вот этого шага:
      sfdisk -d /dev/sda | sfdisk /dev/sdb

      Не проще ли просто создать раздел sdb1 такого же или большего размера чем sda1?
        0
        ну, на диске обычно есть еще и другие разделы…
          0
          Тогда в чем смысл переносить корень на другой диск и оставить на старом диске все остальные разделы (возможно, такие как swap, /var, /home, /tmp и т.д.)? Если уж переносить, то, мне кажется, все сразу…
          И мне показалось, или вы делаете зеркало /dev/sdb1 + /dev/sda1, оставляя при этом все остальные разделы вне зеркала?
            0
            во-первых, это не я. это автор статьи. :)
            а во-вторых, мне кажется, что идея статьи показать как переносить систему, а не дать точную последовательность команд для конкретного случая. Кто-то будет зеркались своп, а кто-то нет. Кто-то будет зеркалить /tmp, а кто-то сделает его RAID0, ну и т.д. А кто-то просто из статьи узнает как просто в одну строку сдублировать таблицу разделов.
          0
          Меньше действий чем через fdisk. Создается полная копия на основе sda. Не нужно думать с того ли блока началось «начало» диска.
            0
            В данном случае начало раздела соблюдать не нужно, т.к. далее там создается новая файловая система. Плюс зачем копировать таблицу разделов на sdb, если другие разделы в итоге все равно остаются жить на sda?
            Имхо, статья хорошая, но эта конкретная команда вызывает лишнюю путаницу.
          0
          Напомнили мне про мою очень старую статью, которую время от времени дописывали, по мере появления новых технологий:

          www.altlinux.org/CreateMdRAID1onLiveSystem

          Там можно несколько полезных действий взять на вооружение, например, -b internal для mdadm или увеличение скорости синхронизации через /proc и т.д.
            0
            Только что попробовал на VirtualBox, на рейде стоит lvm и всё работает, единственное я не стал создавать /etc/mdadm.conf он автоматически сам ищет, с mdadm.conf — не загружался.
            И потом надо было сделать
            touch /.autorelabel
            после rsync selinux не пускает даже из под консоли без него.

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое