Каждый, кто сталкивался с задачей уменьшения XFS знает, что нет штатного решения это сделать. Для изменения размера в меньшую сторону нужно сдампить во временный раздел содержимое текущего и поменять точку монтирования. Затем уменьшить исходный раздел, сдампить уже временный раздел в новый исходный, вернуть точку монтирования.
Данные операции проще сделать, если это раздел с данными и есть возможность отмонировать его в процессе работы операционной системы. Однако, при работе с корневым разделом, это сделать сложнее. Рассмотрим, как это делается.
Хочу обратить внимание, что данная операция крайне опасна — любое неверное действие или нюанс в ранней настройке операционной системы приведет к падению системы без возможности загрузки. Перед началом работы стоит обкатать действия на тестовой машине.
Как будем это делать
Готовимся к процессу
Настройка загрузки с временного раздела
Уменьшение раздела и возврат загрузки с него
Удаление временного тома
План действий такой:
В нашем примере будут такие разделы:
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
Затем рекомендую сделать резервную копию всех важных данных, которые находятся на компьютере. Также стоит выбрать подходящее время для работы, например, в выходные (чтобы было время настроить компьютер или сервер по новой, в случае неудачи).
Подготовим временный раздел для корневого тома:
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 .
И так, у нас есть раздел, который нужно уменьшить и который теперь не примонтирован в качестве корня.
Удаляем его логический том:
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
* как видим, корневой раздел вернулся назад и его размер уменьшен.
Для порядка, вернем прежнее состояние без временного тома.
Удаляем том, группу и снимаем 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
Zulip — программное обеспечение для реализации корпоративного чата. Разработан в 2012 году, в 2014 был…
Zookeeper — cервис-координатор, который позволяет обеспечить контроль синхронизации данных. Разработан на Java компанией Apache Software…
Zimbra — программное обеспечение для реализации почтового сервиса или, если сказать точнее, автоматизации совместной деятельности…
Zabbix — бесплатная система мониторинга. Позволяет отслеживать состояние сетевых узлов, компьютеров и серверов. Возможности: Поддержка…
YouTube — компания-владелец одноименного портала для просмотра и хранения видео. Чтобы пользоваться данным порталом достаточно…
Yota — провайдер, предоставляющий доступ к сети Интернет по беспроводной связи. Впервые, сервис начал работать…