Подбиваю хвосты уходящего года. Есть одиночный гипервизор, где изначально не оптимальным образом распределили дисковое пространство. Точнее, неправильно предсказали потребление разных виртуалок. В итоге через некоторое время сложилась ситуация, когда в одной осталось много лишнего места, а в другой недостаток.
Виртуалки на дефолтных разбиениях дисков в Centos 7: корневой раздел под lvm, отдельно /boot и xfs поверх них. Как известно, файловая система xfs не поддерживает уменьшение размера. Мне пришлось переносить систему с сохранением всей структуры дисков, просто уменьшив размер корня. Делал это так.
1️⃣ Добавил в систему новый диск /dev/sdb меньшего размера. Разбил через fdisk также, как текущий sda: sdb1 - /boot, sdb2 - lvm.
2️⃣ Создал новую группу томов и логический раздел под новый корень.
# pvcreate /dev/sdb2# vgcreate vg_root /dev/sdb2# lvcreate -n lv_root -l +100%FREE /dev/vg_root
Создал файловые системы:
# mkfs.xfs /dev/vg_root/lv_root# mkfs.xfs /dev/sdb1
3️⃣ Смонтировал новые разделы и скопировал туда данные с текущих:
# mount /dev/vg_root/lv_root /mnt# mount /dev/sdb1 /mnt/boot# xfsdump -J - /dev/centos/root | xfsrestore -J - /mnt# xfsdump -J - /dev/sda1 | xfsrestore -J - /mnt/boot
/dev/centos/root - текущий корневой логический раздел.
4️⃣ Зашёл в окружение chroot нового корня:
# for i in /proc/ /sys/ /dev/ /run/ ; do mount --bind $i /mnt/$i; done# chroot /mnt/
Обновил загрузчик и заменил в текущем раздел centos/root на vg_root/lv_root.
# grub2-mkconfig -o /boot/grub2/grub.cfg# mcedit /boot/grub2/grub.cfg
Руками сделал автозамену centos/root на vg_root/lv_root.
# grub2-install /dev/sdb
Также в /etc/fstab надо изменить UUID или имена устройств на новые. Раздел /boot лучше указать по UUID устройства /dev/sdb1, а корень как /dev/vg_root/lv_root.
После этого вышел из chroot и перезагрузил систему, отключив старый диск. У меня она не загрузилась, вывалившись в grub rescue. Я не понял, почему. Тем не менее, в grub rescue я указал раздел с /boot и вручную дал команду на загрузку. Система загрузилась. Уже в ней ещё раз сделал:
# grub2-install /dev/sdb
и после этого система стала нормально перезагружаться. Возможно где-то ошибся, когда с загрузчиком работал. Это не пошаговое руководство, потому что я его не отлаживал. Написал по памяти, когда уже закончил. Рассказал просто саму идею.
❗️Если будете повторять, то потренируйтесь сначала на тестовых виртуалках. Я подобные манипуляции делал много раз, на разных ОС, разделах и файловых системах, начиная ещё с Freebsd (моя самая первая статья на сайте). Идея везде примерно одинаковая, разница в нюансах.
Нужно более ли менее понимать, что делать, если система совсем не грузится, если грузится grub, но не загружается ОС, если загружается ОС, но падает в emergency mode. В Linux в плане загрузки всё последовательно и чаще всего понятно, где проблема. Это не Windows, которая если падает при загрузке, то начинается какое-то шаманство, чтобы понять, в чём проблема.
#linux