Перенос системы с mdadm RAID1 на mdadm RAID1+LVM

Ранее я уже писал о том, как перевести установленную на диск систему на два диска, объединённые в программный массив RAID1: Перевод работающей системы Debian на RAID 1. На этот раз я задумался о том, чтобы переделать DOS-разделы диска в логические тома LVM. LVM может пригодиться для размещения виртуальных машин под управлением Xen, для более безболезненного переноса системы на другие физические диски, для изменения размеров разделов, их создания и уничтожения.

Стратегия перехода была такая:

  1. Исключаем из настроенного RAID-массива один из дисков, так что у нас появляется один свободный диск и один деградировавший RAID-массив,
  2. Создаём деградировавший RAID-массив на освободившемся диске, выполняем разбивку, переносим на него данные,
  3. Выполняем загрузку системы с флешки, синхронизируем накопившиеся изменения, настраиваем загрузку системы с нового диска,
  4. Грузим систему с нового диска, удаляем старый RAID-массив, разбиваем его аналогично новому, включаем в новый RAID-массив в качестве второй половинки.

В комментариях к прошлой статье о переходе на RAID1 мне писали, что статья не годится, т.к. кто-то сломал систему и теперь не может её загрузить. Сам я по той статье переводил три системы и с проблемами не сталкивался. Насчёт этой статьи хочу сразу предупредить, что здесь нет готового на 100% работающего рецепта. Мне самому пришлось изрядно помучиться на этапе загрузки системы с флешки и последующей загрузки новой системы, т.к. нужно хорошо разбираться в нюансах ручной сборки RAID-массивов, определения LVM-томов, генерации файлов конфигурации загрузчика GRUB, создания загрузочных образов системы initramfs и работы с режимом восстановления на загрузочной флешке. Для этого этапа я лишь приведу несколько команд, которые наверняка пригодятся вам, если вы всё-таки решите попробовать проделать то же самое.

Приступим.

1. Извлечение одного из дисков из RAID-массива

Посмотрим на разделы одного из двух дисков:

# fdisk -l /dev/sda 

Disk /dev/sda: 931,5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x9a7a0fdb

Device     Boot     Start        End    Sectors   Size Id Type
/dev/sda1            2048    1977979    1975932 964,8M fd Linux raid autodetect
/dev/sda2         1978368   41064512   39086145  18,7G fd Linux raid autodetect
/dev/sda3  *     41066496   62208035   21141540  10,1G  7 HPFS/NTFS/exFAT
/dev/sda4        62210048 1953525167 1891315120 901,9G  5 Extended
/dev/sda5        62212096  140352192   78140097  37,3G  7 HPFS/NTFS/exFAT
/dev/sda6       140355584 1953525167 1813169584 864,6G fd Linux raid autodetect

Разделы sda1, sda2 и sda6 - это половинки RAID-массивов md1, md2, md6. На md1 расположен раздел подкачки, на md2 - корневой раздел Linux, на md6 - раздел home.

Разделы sda3 и sda5 являются разделами NTFS, на первый из которых когда-то был установлен Windows, а второй использовался для хранения данных для Windows. На разделах sdb3 и sdb5 были расположены посекторные резервные копии этих разделов.

Выведем из RAID-массивов диск /dev/sda:

# mdadm --manage /dev/md1 --fail /dev/sda1
# mdadm --manage /dev/md2 --fail /dev/sda2
# mdadm --manage /dev/md6 --fail /dev/sda6

2. Новая разбивка диска

Я решил воспользоваться консервативной схемой разбивки, когда GRUB будет находиться вне логических томов LVM, на отдельном разделе. Мне показалось, что так будет проще его починить, если что-то пойдёт не так. Новая схема разделов стала следующей:

# fdisk -l /dev/sda 

Disk /dev/sda: 931,5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x382c6e6a

Device     Boot  Start        End    Sectors   Size Id Type
/dev/sda1  *      2048     411647     409600   200M fd Linux raid autodetect
/dev/sda2       411648 1953525167 1953113520 931,3G fd Linux raid autodetect

На созданных разделах я создал деградировавшие массивы RAID1, в которых пока что не хватает второй половинки:

# mdadm --create /dev/md11 -l1 -n2 missing /dev/sda1
# mdadm --create /dev/md12 -l1 -n2 missing /dev/sda2

Создадим файловую систему для будущего раздела /boot, на котором будет находиться загрузчик GRUB:

# mkfs.ext4 /dev/md11

Теперь установим менеджер томов, если он ещё не был установлен:

# apt-get install lvm2

Создадим физический том на разделе:

# pvcreate /dev/md12

Создадим группу томов stupin, в котором будет один физический том /dev/md12:

# vgcreate stupin /dev/md12

Создадим логический том размером 1 гигабайт для раздела подкачки:

# lvcreate -n dom0-swap -L 1G stupin

И разметим его как раздел подкачки:

# mkswap /dev/stupin/dom0-swap

Создадим логический том размером в 20 гигабайт для корневого раздела системы:

# lvcreate -n dom0-root -L 20G stupin

И разметим на нём файловую систему ext4:

# mkfs.ext4 /dev/stupin/dom0-root

Создадим логический том для раздела /home и разметим на нём файловую систему ext4:

# lvcreate -n dom0-home -L 800G stupin
# mkfs.ext4 /dev/stupin/dom0-home

3. Копирование разделов ext4

Для копирования ext4 я решил воспользоваться rsync. Создадим точки монтирования будущих разделов /mnt, /mnt/boot, /mnt/home:

# mkdir /mnt
# mount /dev/stupin/dom0-root /mnt/
# mkdir /mnt/boot
# mount /dev/md11 /mnt/boot/
# mkdir /mnt/home
# mount /dev/stupin/dom0-home /mnt/home/

И выполним первоначальное копирование данных на новые разделы:

# rsync -xavv --delete /home/ /mnt/home/
# rsync -xavv --delete / /mnt/

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

4. Копирование NTFS-разделов

Для копирования NTFS-разделов я решил воспользоваться утилитой dd, хотя мог бы воспользоваться и утилитой ntfsclone. Здесь я изначально копировал диски остановленной системы, поскольку она бывает мне нужна лишь иногда и обычно выключена.

Создадим логические тома LVM с размером точно равным количеству секторов на исходных разделах:

# lvcreate -L 21141540S -n winxp-c-disk stupin
# lvcreate -L 78140097S -n winxp-d-disk stupin

И скопируем на них данные посекторно:

# dd if=/dev/sdb3 of=/dev/stupin/winxp-c-disk
# dd if=/dev/sdb5 of=/dev/stupin/winxp-d-disk

5. Загрузка с флешки

Этот момент - самый сложный и ответственный. По идее, если у вас ничего не получится, вы можете загрузить систему со старого диска, переразбить диск, который планировали использовать под LVM, и включить его обратно в зеркало. На этом неудачный опыт будет завершён и система вернётся в то состояние, в котором она находилась изначально.

Я использовал установочную флешку с Debian Jessie. Загрузившись с флешки нужно выбрать режим восстановления (rescue mode), через её меню определить RAID-массивы и логические тома, смонтировать корневой раздел и раздел /boot и перейти в командную строку в среду, где корнем является корневой раздел восстанавливаемой системы.

Попав в оболочку, для начала домонтируем будущий раздел /home:

# mount /dev/stupin/dom0-home /home

Теперь смонтируем разделы исходной системы для того, чтобы синхронизировать накопившиеся на ней изменения в будущую систему:

# mount /dev/sdb2 /mnt
# mount /dev/sdb6 /mnt/home

Скопируем изменения:

# rsync -xavv --delete /mnt/home/ /home/
# rsync -xavv --delete /mnt /

В прошлой статье я не останавливался подробно на моменте правильного переноса данных, поскольку считал, что статьёй воспользуются хорошо подготовленные пользователи, которые проделают ровно то же самое - синхронизируют изменения, загрузившись с флешки. В этот раз загрузка с флешки - необходимый этап, поэтому я решил чуть подробнее описать и момент переноса данных.

Теперь нужно сделать так, чтобы система загрузилась с нового диска. Сначала посмотрим идентификаторы UUID у имеющихся дисков и разделов:

# blkid

Впишем в файл /etc/fstab раздел подкачки, корневой раздел, разделы /boot и /home, указав их идентификаторы из вывода команды blkid:

# vim /etc/fstab

Обновим список RAID-массивов имеющихся в системе в образе initramfs:

# mdadm --examine --scan > /etc/mdadm/mdadm.conf
# update-initramfs -k all -u

Установим GRUB на новый диск и обновим его конфигурацию:

# grub-install /dev/sda
# update-grub

6. Загрузка новой системы

После этого можно выйти из оболочки и выбрать перезагрузку. В BIOS нужно выбрать загрузку с нового диска, а старый можно вообще для наглядности отсоединить, чтобы точно быть уверенным, что загрузка произошла с нового диска.

Если в процессе загрузки не появилось меню GRUB, то нужно проверить, что GRUB установлен, а его конфигурация обновлена. Для этого нужно снова загрузиться с флешки в режиме восстановления и убедиться, что grub-install сработал.

Если система не загрузилась и остановилась на этапе выполнения меню GRUB, то возможно дело в том, что GRUB не нашёл образ ядра или образ initramfs. В таком случае в загрузочной флешке нужно убедиться, что отработало обновление файла конфигурации GRUB при помощи команды grub-update.

Если система не загрузилась и перешла в оболочку initramfs, то скорее всего ядро не нашло корневой раздел. Нужно проверить, что корневой раздел определился в системе и имеется в каталоге /dev/stupin/ (stupin - имя логической группы) или в /dev/mapper/. Если он на месте, тогда нужно проверить, что он правильно указан в файле /etc/fstab.

В образе initramfs могут пригодиться следующие команды.

Поиск имеющихся RAID-массивов и обновление конфигурации:

# mdadm --examine --scan > /etc/mdadm/mdadm.conf

Сборка RAID-массивов вручную, после которой массивы должны появиться в каталогах /dev и /dev/md:

# mdadm --assemble /dev/md11
# mdadm --assemble /dev/md12

Определение доступных групп томов и логических томов LVM:

# vgchange -ay

Для редактирования файла /etc/fstab в образе initramfs имеется редактор vi.

После того, как вы убедились, что все RAID-массивы и логические тома определились системой, а в /etc/fstab указаны правильные разделы для монтирования, можно попробовать выйти из оболочки initramfs и продолжить загрузку системы.

В загрузившейся системе нужно повторить проделанные манипуляции, а затем обновить образ initramfs и файл конфигурации GRUB. После этого можно попробовать перезагрузить систему и проверить, грузится ли она автоматически, без ручного вмешательства. Когда система будет грузиться с нового раздела автоматически, можно подсоединить отсоединённый диск и продолжить. Если же вы не смогли добиться устойчивой автоматической загрузки системы, можно переключиться на загрузку со старого диска и вернуть всё обратно.

7. Добавление второй половины в новый RAID-массив

Теперь скопируем разбиение с нового диска на старый:

# sfdisk --dump /dev/sda | sfdisk /dev/sdb

И добавим разделы старого диска в зеркало:

# mdadm --manage /dev/md11 --add /dev/sdb1
# mdadm --manage /dev/md12 --add /dev/sdb2

Не забудьте поставить GRUB на второй диск:

# grub-install /dev/sdb

8. Переименование RAID-массивов

Есть ещё один не обязательный момент. Мне хотелось переименовать RAID-массивы так, чтобы они назывались md1 и md2, а не md11 и md12. Для этого я снова загрузился с флешки, разобрал RAID-массивы и собрал их уже под новыми именами:

# mdadm --stop /dev/md11
# mdadm --stop /dev/md12
# mdadm --assemble --update=name --name=1 /dev/md1 /dev/sda1 /dev/sdb1
# mdadm --assemble --update=name --name=2 /dev/md2 /dev/sda2 /dev/sdb2

Осталось обновить конфигурацию mdadm в initramfs:

# mdadm --examine --scan > /etc/mdadm/mdadm.conf
# update-initramfs -k all -u

Написать автору