Как переезжал на диск с меньшим размером XFS

Как переезжал на диск с меньшим размером XFS

Все началось с жадности, провайдер VDS предложил цены ниже моего на 2$ с единственным неподходящим для меня параметром, меньшим объемом диска, на 10 Гб был меньше.

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

Для себя я четко решил что от такой FS надо избавляться, мало ли на какие размеры и серверы придется перекочёвывать. В качестве решения выбрал LVM, но в принципе она может быть любой, главное было перекопировать систему без потерь. Итак приступим.

Шаг 1. Разрешение удалённого доступа (опционально)

Загружаемся с Live образа на нашей новой машине или виртуалке.

https://buildlogs.centos.org/centos/7/isos/x86_64/CentOS-7-livecd-GNOME-x86_64.iso
Для того, чтобы разрешить удалённый доступ, необходимо задать пароль для пользователя root и запустить SSH демон:

su

passwd

systemctl start sshd

Теперь можно подключиться к целевой машине вашим SSH клиентом (например, PuTTY).

Шаг 2. Разбивка диска на разделы

Вы можете использовать вашу любимую утилиту для этого. Например, в Gnome есть предустановленная утилита для управления дисками. Также в интернетах хвалят gparted, однако я намеренно использовал fdisk, т.к, например, gparted просто не распознавал мой NVMe SSD-диск.

Диск следует разбить по образу и подобию прежнего диска. Я не маньяк партиционирования, поэтому моя схема партиционирования была стандартной:

  • /boot— стандартный раздел размером 1GB;
  • swap раздел размером 4G;
  • /— корневой раздел, LVM volume group с наименованием “main”, занимающий оставшееся пространство на диске.

 

lsblk # проверим какое наименование в системе получил новый диск, в моём случае это nvme0n1

fdisk /dev/nvme0n1

n # добавить новый раздел (для /boot)

p # primary partition

# оставляем по умолчанию (1-й раздел)

# оставляем по умолчанию (от начала диска)

+1G # размер для раздела /boot

# готово

n # добавить новый раздел (для новой LVM volume group)

p # primary partition

# оставляем по умолчанию (2-й раздел)

# оставляем по умолчанию (от начала предыдущего раздела)

# оставляем по умолчанию (100% оставшегося места)

# готово

a # установка флага “bootable”

1 # для 10го раздела

p # проверим, всё ли в порядке

w # записываем таблицу партиционирования на диск

 

Раздел /boot должен быть стандартным линукс-разделом, поэтому сразу создаём файловую систему на нём:

 

mkfs.xfs /dev/nvme0n1p1 -f

 

И теперь нам необходимо создать LVM-структуру для второго раздела на диске. Назовём новую LVM-группу newmain (впоследствии переименуем):

pvcreate /dev/nvme0n1p2 # создаем новый физический LVM-диск для раздела

vgcreate newmain /dev/nvme0n1p2 # создаем новую LVM-группу и добавляем в неё только что добавленный физический LVM-диск

lvcreate -L 4G -n swap newmain # создаем логический раздел размером 4 ГБ под swap

lvcreate -l 100%FREE -n root newmain # создаем логический раздел на всё оставшееся место под корень

 

Теперь мы готовы к созданию файловой системы на новых логических разделах:

 

mkfs.xfs /dev/newmain/root # создание файловой системы для корневого раздела

mkswap -L swap /dev/newmain/swap # создание swap на новом разделе

swapon /dev/newmain/swap

 

Шаг 3. Активная фаза

 

Прежде чем мы начнём, сделаем обе LVM-группы активными (т.к. мы работаем из под Live CD):

vgchange -a y main

vgchange -a y newmain

Создадим директории для точек монтирования, и примонтируем к системе старые и новые разделы наших дисков:

mkdir -p /mnt/old/boot

mkdir -p /mnt/old/root

mkdir -p /mnt/new/boot

mkdir -p /mnt/new/root

mount /dev/sda1 /mnt/old/boot

mount /dev/nvme0n1p1 /mnt/new/boot

mount /dev/main/root /mnt/old/root

mount /dev/newmain/root /mnt/new/root

Убедимся, что всё в порядке при помощи команды lsblk:

lsblk

NAME             MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT

sda                8:0    0 931.5G  0 disk

├─sda1             8:1    0     1G  0 part /mnt/old/boot

└─sda2             8:2    0 930.5G  0 part

  ├─main-swap    253:0    0   3.6G  0 lvm  [SWAP]

  └─main-root    253:1    0 926.9G  0 lvm  /mnt/old/root

nvme0n1          259:0    0 119.2G  0 disk

├─nvme0n1p1      259:3    0     1G  0 part /mnt/new/boot

└─nvme0n1p2      259:4    0 118.2G  0 part

  ├─newmain-swap 253:5    0     4G  0 lvm  [SWAP]

  └─newmain-root 253:6    0 114.2G  0 lvm  /mnt/new/root

 

Если вы видите что-то наподобие этого, вы всё сделали верно. И здесь начинается настоящая магия — мы собираемся использовать xfsdump для миграции наших данных. Эта утилита достаточно умная и знает о внутреннем устройстве файловой системы xfs, что позволяет ей копировать только занятые данными блоки, что, в свою очередь, во-первых, позволяет нам копировать данные на диск меньшего размера, а во-вторых сильно ускоряет процесс переноса. Итак, давайте сделаем дамп данных при помощи этой утилиты, и на лету развернём эти данные на новом месте:

 

xfsdump -l0 -J – /mnt/old/boot | xfsrestore -J – /mnt/new/boot

xfsdump -l0 -J – /mnt/old/root | xfsrestore -J – /mnt/new/root

В моем случае тип файловой системы ext4

Копирование с /boot на другой диск:

cp -p -r /boot/* /mnt/new/boot

 

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

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

Шаг 4. Делаем новый диск загрузочным

 

Первое, что нужно сделать, это узнать UUID для старого и нового загрузочных разделов (/boot) при помощи команды blkid:

blkid

/dev/nvme0n1p1: UUID=”3055d690-7b2d-4380-a3ed-4c78cd0456ba” TYPE=”xfs”

/dev/sda1: UUID=”809fd5ba-3754-4c2f-941a-ca0b6fb5c86e” TYPE=”xfs”

 

Предполагая, что sda1 — прежний раздел \boot, и nvme0n1p1 — новый, производим замену UUID в конфигурационных файлах на новой точке монтирования:

 

sed -i “s/809fd5ba-3754-4c2f-941a-ca0b6fb5c86e/3055d690-7b2d-4380-a3ed-4c78cd0456ba/g” /mnt/new/root/etc/fstab

sed -i “s/809fd5ba-3754-4c2f-941a-ca0b6fb5c86e/3055d690-7b2d-4380-a3ed-4c78cd0456ba/g” /mnt/new/boot/grub2/grub.cfg

 

Эти две команды подготовят ваши системные файлы конфигурации к новому диску.

 

Теперь самое время переименовать LVM-группы и отмонтировать диски:

 

umount /mnt/{old,new}/{boot,root}

vgrename -v {,old}main

vgrename -v {new,}main

 

Единственное, что осталось сделать, это переустановить загрузчик. Это необходимо делать с использованием chroot:

 

mount /dev/main/root /mnt

mkdir -p /mnt/boot

mount /dev/nvme0n1p1 /mnt/boot

mount -t devtmpfs /dev /mnt/dev

mount -t proc /proc /mnt/proc

mount -t sysfs /sys /mnt/sys

chroot /mnt/ grub2-install /dev/nvme0n1

 

Шаг 5. Последний штрих

 

На данном этапе все данные уже должны быть перенесены и новый диск должен стать загрузочным. Нужно только перезапуститься, вынуть Live CD из привода, и выбрать новый диск в BIOS для загрузки:

 

systemctl reboot -f

 

Если что-то пошло не так и система не загружается, вы всегда можете “откатиться” на старый диск, просто запустившись с Live CD повторно и переименовав LVM-группы обратно, выполнив vgrename -v {,new}main и vgrename -v {old,}main, и затем снова перезапуститься.

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

 

 

 

запуск lsinitrd -m -k -p {file}  показывает, что внутри ramdisk нет модуля lvm

 

cp /etc/dracut.conf /etc/dracut.conf.bak

 

nano /etc/dracut.conf

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

# dracut modules to add to the default

add_dracutmodules+=”lvm”

 

# install local /etc/mdadm.conf

mdadmconf=”yes”

 

# install local /etc/lvm/lvm.conf

lvmconf=”yes”

 

 

  • Монтируем корневой раздел

mount /dev/mapper/centos-root /mnt/sysimage

  • монтируем системные пути

mount -o bind /dev /mnt/sysimage/dev

mount -o bind /sys /mnt/sysimage/sys

mount -o bind /proc /mnt/sysimage/proc

mount /dev/sda1 /mnt/sysimage/boot

  • переходим в режим chroot и пересоздаем initfamfs для нужной версии ядра

chroot /mnt/sysimage

cd /boot
dracut -f initramfs-3.10.0-1160.11.1.el7.x86_64.img 3.10.0-1160.11.1.el7.x86_64

  • пересобираем конфигурацию загрузки GRUB2

grub2-mkconfig -o /boot/grub2/grub.cfg

  • После этого выходим из chroot и перезагружаемся

exit
shutdown -r now

Ссылки на истоки:

https://habr.com/ru/post/352400/

https://serverfault.com/questions/893721/centos7-dracut-lvm-command-not-found

https://xhop.ru/nix-sistemyi/centos-7-dracut-boot-recovery/