Ранее я уже писал о том, как перевести установленную на диск систему на два диска, объединённые в программный массив RAID1: Перевод работающей системы Debian на RAID 1. На этот раз я задумался о том, чтобы переделать DOS-разделы диска в логические тома LVM. LVM может пригодиться для размещения виртуальных машин под управлением Xen, для более безболезненного переноса системы на другие физические диски, для изменения размеров разделов, их создания и уничтожения.
Стратегия перехода была такая:
В комментариях к прошлой статье о переходе на RAID1 мне писали, что статья не годится, т.к. кто-то сломал систему и теперь не может её загрузить. Сам я по той статье переводил три системы и с проблемами не сталкивался. Насчёт этой статьи хочу сразу предупредить, что здесь нет готового на 100% работающего рецепта. Мне самому пришлось изрядно помучиться на этапе загрузки системы с флешки и последующей загрузки новой системы, т.к. нужно хорошо разбираться в нюансах ручной сборки RAID-массивов, определения LVM-томов, генерации файлов конфигурации загрузчика GRUB, создания загрузочных образов системы initramfs и работы с режимом восстановления на загрузочной флешке. Для этого этапа я лишь приведу несколько команд, которые наверняка пригодятся вам, если вы всё-таки решите попробовать проделать то же самое.
Приступим.
Посмотрим на разделы одного из двух дисков:
# 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
Я решил воспользоваться консервативной схемой разбивки, когда 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
Для копирования 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/
Этот этап копирования имеет целью уменьшить количество файлов, которые нужно будет скопировать во время загрузки системы с флешки. После загрузки системы с флешки копирование будет повторено с тем чтобы скопировать изменившиеся файлы.
Для копирования 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
Этот момент - самый сложный и ответственный. По идее, если у вас ничего не получится, вы можете загрузить систему со старого диска, переразбить диск, который планировали использовать под 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
После этого можно выйти из оболочки и выбрать перезагрузку. В 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. После этого можно попробовать перезагрузить систему и проверить, грузится ли она автоматически, без ручного вмешательства. Когда система будет грузиться с нового раздела автоматически, можно подсоединить отсоединённый диск и продолжить. Если же вы не смогли добиться устойчивой автоматической загрузки системы, можно переключиться на загрузку со старого диска и вернуть всё обратно.
Теперь скопируем разбиение с нового диска на старый:
# 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
Есть ещё один не обязательный момент. Мне хотелось переименовать 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