Как уменьшить корневой раздел XFS на LVM

Обновлено и опубликовано Опубликовано:

Каждый, кто сталкивался с задачей уменьшения XFS знает, что нет штатного решения это сделать. Для изменения размера в меньшую сторону нужно сдампить во временный раздел содержимое текущего и поменять точку монтирования. Затем уменьшить исходный раздел, сдампить уже временный раздел в новый исходный, вернуть точку монтирования.

Данные операции проще сделать, если это раздел с данными и есть возможность отмонировать его в процессе работы операционной системы. Однако, при работе с корневым разделом, это сделать сложнее. Рассмотрим, как это делается.

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

Описание процесса

План действий такой:

  1. Создаем временный раздел XFS на новом томе LVM. Переносим корневой раздел на временный том и загружаемся с него.
  2. Уменьшаем исходный том до нужного размера, возвращаем на него данные. Загружаемся с нового раздела.
  3. Удаляем временный том.

В нашем примере будут такие разделы:

lsblk

NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0   10G  0 disk 
  sda1        8:1    0    1G  0 part /boot
  sda2        8:2    0    9G  0 part 
    vg-root 253:0    0    8G  0 lvm  /
    vg-swap 253:1    0    1G  0 lvm  [SWAP]
sdb           8:16   0    8G  0 disk

* в данном примере корневой раздел находится на физическом диске sda и его разделе sda2.

Мы попробуем уменьшить раздел с 8 Гб до 6. Диск sdb будем использовать как временный.

Подготовка

Для решения нашей задачи нам понадобятся две утилиты — установим их.

а) если используем CentOS / Red Hat:

yum install lvm2 xfsdump

б) если используем Ubuntu / Debian:

apt-get install lvm2 xfsdump

Затем рекомендую сделать резервную копию всех важных данных, которые находятся на компьютере. Также стоит выбрать подходящее время для работы, например, в выходные (чтобы было время настроить компьютер или сервер по новой, в случае неудачи).

1. Загрузка с временного раздела

Подготовим временный раздел для корневого тома:

pvcreate /dev/sdb

vgcreate vg_tmp_root /dev/sdb

lvcreate -n lv_tmp_root -l +100%FREE /dev/vg_tmp_root

* данными командами мы создали группу томов vg_tmp_root и сделали из нее один логический раздел lv_tmp_root.

Создадим файловую систему XFS и смонтируем ее в каталог /mnt:

mkfs.xfs /dev/vg_tmp_root/lv_tmp_root

mount /dev/vg_tmp_root/lv_tmp_root /mnt

Смотрим расположение корневого раздела командой:

lvdisplay

... 
--- Logical volume ---
  LV Path                /dev/vg/root
  LV Name                root
  VG Name                vg
...

Находим среди результатов корневой раздел — нам нужен параметр LV Path.

Сдампим содержимое текущего корневого раздела в наш временный:

xfsdump -J - /dev/vg/root | xfsrestore -J - /mnt

* где /dev/vg/root — то, что мы получили в параметре LV Path командой lvdisplay/mnt — каталог, в который мы смонтировали наш временный раздел.

Заходим в окружение chroot нашего временного корня:

for i in /proc/ /sys/ /dev/ /run/ /boot/; do mount --bind $i /mnt/$i; done

chroot /mnt/

Запишем новый загрузчик:

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

Обновляем образы загрузки:

cd /boot ; for i in `ls initramfs-*img`; do dracut -v $i `echo $i|sed "s/initramfs-//g; s/.img//g"` --force; done

Открываем конфигурационный файл grub:

vi /boot/grub2/grub.cfg

Меняем все значения, которые задействуют старый том lvm — в моем случае, все совпадения:

...
...  lv=vg/root ...
...

... менялись на:

...
... lv=vg_tmp_root/lv_tmp_root ...
...

* так как у меня корневой раздел был в группе vg и имел название root (команда lvdisplay), то под замену попадает vg/root. В вашем случае это будет другое значение.

Этот момент крайне важен. Неправильное редактирование приведет к невозможности загрузки.

Выходим из окружения chroot и перезагружаем компьютер:

exit

shutdown -r now

... мы должны загрузиться с временного раздела:

lsblk

NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                         8:0    0   10G  0 disk 
  sda1                      8:1    0    1G  0 part /boot
  sda2                      8:2    0    9G  0 part 
    vg-swap               253:1    0    1G  0 lvm  [SWAP]
    vg-root               253:2    0    8G  0 lvm  
sdb                         8:16   0    8G  0 disk 
  vg_tmp_root-lv_tmp_root 253:0    0    8G  0 lvm  /

* как видим, теперь корневой раздел на sdb.

2. Уменьшаем раздел и возвращаем с него загрузку

И так, у нас есть раздел, который нужно уменьшить и который теперь не примонтирован в качестве корня.

Удаляем его логический том:

lvremove /dev/vg/root

* напомню, что /dev/vg/root используется в конкретном случае и данный путь нужно подставить свой.

На запрос:

Do you really want to remove active logical volume vg/root? [y/n]:

... отвечаем утвердительно — y;

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

lvcreate -n root -L 6G vg

* мы создали новый том LVM со старым именем root в группе томов vg.

На предупреждение:

WARNING: xfs signature detected on /dev/vg/root at offset 0. Wipe it? [y/n]:

... отвечаем утвердительно — y;

Создаем на нем файловую систему и монтируем его:

mkfs.xfs /dev/vg/root

mount /dev/vg/root /mnt

Возвращаем обратно содержимое корня:

xfsdump -J - /dev/vg_tmp_root/lv_tmp_root | xfsrestore -J - /mnt

Заходим в окружение chroot нашего временного корня:

for i in /proc/ /sys/ /dev/ /run/ /boot/; do mount --bind $i /mnt/$i; done

chroot /mnt/

Запишем новый загрузчик:

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

Обновляем образы загрузки:

cd /boot ; for i in `ls initramfs-*img`; do dracut -v $i `echo $i|sed "s/initramfs-//g; s/.img//g"` --force; done

Открываем конфигурационный файл grub:

vi /boot/grub2/grub.cfg

Проверяем все значения, которые задействуют старый том lvm — в моем случае должны быть:

...
...  lv=vg/root ...
...

* так как у меня корневой раздел в группе vg и имеет название root (команда lvdisplay), то корневой раздел имеет точку монтирования lvm vg/root. В вашем случае это будет другое значение.

Выходим из окружения chroot и перезагружаем компьютер:

exit

shutdown -r now

... мы должны загрузиться с нашего уменьшенного раздела:

lsblk

NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                         8:0    0   10G  0 disk 
  sda1                      8:1    0    1G  0 part /boot
  sda2                      8:2    0    9G  0 part 
    vg-root               253:0    0    6G  0 lvm  /
    vg-swap               253:1    0    1G  0 lvm  [SWAP]
sdb                         8:16   0    8G  0 disk 
  vg_tmp_root-lv_tmp_root 253:2    0    8G  0 lvm  

* как видим, корневой раздел вернулся назад и его размер уменьшен.

3. Удаление временного тома

Для порядка, вернем прежнее состояние без временного тома.

Удаляем том, группу и снимаем lvm-метку с диска, который нами использовался как временный (sdb):

lvremove /dev/vg_tmp_root/lv_tmp_root

Do you really want to remove active logical volume vg_tmp_root/lv_tmp_root? [y/n]: y

vgremove vg_tmp_root

pvremove /dev/sdb

# Linux
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет