Попал в нестандартную ситуацию когда нужно на AlmaLinux 8.5 уйти от LVM. Ниже небольшой гайд по пунктам как это можно сделать. Думаю подойдет для любой Linux подобной системы.

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

Разметка старого диска:

  • EFI (VFAT) — 600 Mb
  • Boot (XFS) — 1 Gb
  • LVM: Root (XFS) — 145 Gb, SWAP — 5 Gb

Планируемая разметка:

  • EFI (VFAT) — 600 Mb
  • Root (XFS) — 145 Gb
  • SWAP — 5 Gb

Я буду переносить раздел Boot в раздел Root.

1. Подготовка.

  • Качаем LiveCD дистрибутив с необходимой ОС.
  • Подключаем к компьютеру неразмеченный жесткий диск, либо если у Вас VM то создаём второй виртуальный жесткий диск.

2. Бекап.

Сломать систему — как два пальца. Поэтому подготавливаемся к ситуации когда всё пойдёт не по сценарию. Любым доступным и известным способом создаём бекап системы и откладываете его в сторонку.

3. LiveCD.

И так, начинается основная часть переноса.

3.1. Загружаемся с LiveCD.

Нужно добраться до консоли. В моём случае на CentOS подобных системах загрузить надо Rescue Mode:

Troubleshooting ---> Rescue a AlmaLinux system

ВАЖНО !!! Загрузка должна быть выполнена с LiveCD.

3.2. fdisk.

Попав в консоль начинаем разметку второго диска (на который будет осуществлён перенос). В моём примере будет минимально необходимый список разделов. Вы размечаете диск как Вам удобно.

3.2.1. Через fdisk ищем как он называется:

# fdisk -l

В моём случае неразмеченый диск был: /dev/sdb

3.2.2. Заходим в режим разметки:

# fdisk /dev/sdb

Для просмотра всех команд в режиме разметки нужно нажать кнопку ‘m’.

3.2.3. Создаём GPT разметку:

  • Нажать кнопку ‘g’.

3.2.4. Создаём раздел EFI:

  • Нажать кнопку ‘n’
  • Номере раздела оставляем по умолчанию: (Нажать кнопку ‘Enter’)
  • Первый сектор оставляем по умолчанию: (Нажать кнопку ‘Enter’)
  • Последнем сектор задаём размер раздела: +600M

3.2.5. Создаём раздел с системой:

  • Нажать кнопку ‘n’
  • Номере раздела оставляем по умолчанию: (Нажать кнопку ‘Enter’)
  • Первый сектор оставляем по умолчанию: (Нажать кнопку ‘Enter’)
  • Последнем сектор задаём размер раздела: +145G

3.2.6. Создаём swap раздел:

  • Нажать кнопку ‘n’
  • Номере раздела оставляем по умолчанию: (Нажать кнопку ‘Enter’)
  • Первый сектор оставляем по умолчанию: (Нажать кнопку ‘Enter’)
  • Последнем сектор по умолчанию для использования оставшегося пространства: (Нажать кнопку ‘Enter’)

3.2.7. Меняем тип первого раздела на EFI:

  • Нажать кнопку ‘t’
  • Номер раздела, тип которого будем менять: 1
  • Тип раздела (все типы можно посмотреть нажав кнопку L): 1

3.2.8. Проверяем разметку:

  • Нажать кнопку ‘p’

3.2.7. Выходим их утилиты fdisk с записью всех изменений:

  • Нажать кнопку ‘w’

3.3. Форматирование новых разделов.

Для форматирование используем утилиту mkfs и mkswap:

# mkfs.vfat /dev/sdb1
# mkfs.xfs /dev/sdb2
# mkswap /dev/sdb3

3.4. Создание папок и монтирование разделов.

3.4.1. Переходим в папку mnt и создаём все необходимые для переноса папки:

# cd /mnt
# mkdir oldefi
# mkdir oldboot
# mkdir oldroot
# mkdir newefi
# mkdir newroot

3.4.2. Далее подготовим LVM к монитированию.

  • Для начала нам нужно просканировать физические носители (Physical Volume)
# pvscan
  • Сканируем Volume Groups
# vgscan
  • Прошлые команды должны показать список PV и VG вашей локальной системы. Далее активируем найденные Volume Groups
# vgchange -a y
  • Далее нужно просканировать логические разделы Logical Volume
# lvscan
  • Теперь системе видны локальные Logical Volume из найденных Volume Groups и осталось их примонтировать. В зависимости от именования VG и LV, монтируем поштучно.

После lvscan вы увидите точку монтирования root и swap раздела. В данной ситуации нам нужен только root раздел. Запоминаем путь к точке монтирования. В моём случае это:

/dev/almalinux/root

3.5. Монтирование всех необходимых для переноса разделов:

# mount /dev/sda1 /mnt/oldefi
# mount /dev/sda2 /mnt/oldboot
# mount /dev/almalinux/root /mnt/oldroot
# mount /dev/sdb1 /mnt/newefi
# mount /dev/sdb2 /mnt/newroot

3.6. Перенос файлов на новые разделы.

3.6.1. Переносим root раздел с помощью xfsdump и xfsrestore:

xfsdump -l0 -J - /mnt/oldroot | xfsrestore -J - /mnt/newroot

Пару слов об использованных флагах:

  • «-J» уменьшает размер фидбека;
  • «-» сообщает xfsdump и xfsrestore использовать стандартные потоки stdout и stdin соответственно вместо файлов.

3.6.2. Переносим boot раздел:

# cd /mnt/oldboot
# cp -r * /mnt/newroot/boot/

3.6.3. Переносим EFI раздел:

# cd /mnt/oldefi
# cp -r * /mnt/newefi/

3.7. Правка fstab на новой системе.

Теперь необходимо поправить UUID монтируемых при загрузке дисков в файле fstab. С помощью blkid смотрим UUID дисков и заменяем их. Решений данной проблемы много вплоть до переписывания идентификаторов на листочек. Я решил пойти путём чуть быстрее.

3.7.1. Заносим вывод blkid по каждому новому разделу в конец файла fstab:

# blkid | grep sdb1 | awk '{print $2}' >> /mnt/newroot/etc/fstab
# blkid | grep sdb2 | awk '{print $2}' >> /mnt/newroot/etc/fstab
# blkid | grep sdb3 | awk '{print $2}' >> /mnt/newroot/etc/fstab

3.7.2. Далее открываем fstab через vim:

# vi /mnt/newroot/etc/fstab

3.7.3. Редактируем и сохраняем.

  • Для редактирования в самом vim нажимаем кнопку Insert.
  • Далее необходимо привести fstab в порядок
  • После того как прописали все UUID выходим из режима правки кнопкой Esc.
  • Для выхода из Vim с сохранением пишем :wq —> Enter

4. Загружаемся в новую систему.

4.1. Выключаем компьютер, вынимаем/отключаем LiveCD и старый диск. Включаем компьютер.

4.2. Когда появится меню загрузки нажимаем ‘e’.

  • Параметр linux приводим к виду:

Было:

linux ($root)/vmlinuz-.......x86_64 root=UUID=9dc......38 ro crashkernel=auto

Стало:

linux (hd0,gpt2)/boot/vmlinuz-.......x86_64 root=/dev/sda2
  • Параметр initrd приводим к виду:

Было:

initrd ($root)/initramfs-.......x86_64.img $turned_initrd

Стало:

initrd (hd0,gpt2)/boot/initramfs-.......x86_64.img

Далее остаётся нажать Ctrl + X и пойдет загрузка ОС. Если загрузка не начинается или перерывается с ошибками. Значит где-то промахнулись.

4.3. Настройка GRUB2.

Заключительная часть — это восстановление меню загрузки GRUB2.

4.3.1. Редактируем файл /etc/default/grub (покажу на примере утилиты nano):

# nano /etc/default/grub

и приводим параметр GRUB_CMDLINE_LINUX к следующему виду:

GRUB_CMDLINE_LINUX="crashkernel=auto"

Для выхода с сохранение нажимаем Ctrl + O —> Enter —> Ctrl + X

4.3.2. Генерируем новый grub.cfg:

# grub2-mkconfig -o /boot/efi/EFI/almalinux/grub.cfg

4.3.3. Создаём новый пункт загрузки в меню (все старые пункты становяться неработоспособны)

# grubby --add-kernel=/boot/vmlinuz-4.18.0-348.12.2.el8_5.x86_64 --title 'AlmaLinux (4.18.0-348.12.2.el8_5.x86_64) 8.5 (Arctic Sphynx)'
  • —add-kernel подставляете то ядро которое хотите чтобы загружалось
  • —title подставляете своё название пункта в меню

После этого перезагружаете компьютер и выбираете свой созданный пункт меню. По этой аналогии можно поправить все пункты меню.

5. Генерация initrd. (Опционально)

Может возникнуть ситуация когда ОС всё равно не грузится после всех проделанных манипуляци. Тогда можно попробовать пересобрать initrd.

5.1. Загружаемся с загрузочной флешки в Rescue mode.

5.2. Монтируем разделы с системой.

# mkdir /mnt/system
# mount --bind /dev /mnt/system/dev
# mount --bind /proc /mnt/system/proc
# mount --bind /sys /mnt/system/sys

5.2 Заходим в окружение командой chroot:

# chroot /mnt/system

5.3. Смотрим какие файлы лежат в каталоге /boot:

# ls /boot

Пример вывода:

......
initramfs-4.18.0-348.20.1.el8_5.x86_64.img
initramfs-4.18.0-348.20.1.el8_5.x86_64kdump.img
initramfs-4.18.0-348.7.1.el8_5.x86_64.img
initramfs-4.18.0-348.7.1.el8_5.x86_64kdump.img
........

Ищем названия файлов initramfs- либо initrd-

5.4. Пересобираем initrd (initramfs):

# mkinitrd /boot/initramfs-4.18.0-348.20.1.el8_5.x86_64.img 4.18.0-348.20.1.el8_5.x86_64 --force

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

5.5. Остаётся перезагрузить ВМ.