Как безопасно уменьшить размер виртуального диска (образа) виртуальной машины с Ubuntu в Proxmox VE 9?

В PVE есть образ виртуальной машины на базе старой Ubuntu 16 (Zentyal 5.1) объёмом 350 ГБ. Ранее админ хранил почту прямо в диске образа — эту проблему я исправил, перенёс почту на постоянный монтируемый шар, свободного места там много; фактическое занятое пространство внутри ВМ примерно 10–20 ГБ. Осталась задача: как безопасно уменьшить размер текущего виртуального диска до ~70–100 ГБ, не потеряв данные? <br/> На Windows у меня был опыт уменьшения разделов (например, Paragon Disk Manager помог вырезать 500 МБ для восстановления загрузки при проблеме с EFI/Boot). На Linux я знаю, как расширять диск, но не умею его сжимать — есть ли надёжные методы или пошаговая процедура для уменьшения виртуального диска в PVE? Бэкапить такой «монстр» в PBS затруднительно, а машина — контроллер домена и критична.
  • 6 мая 2026 г. 12:01
Ответы на вопрос 1
Коротко — уменьшать «внутреннюю» занятость и копировать систему на новый меньший диск (attach new disk → rsync → пересоздать загрузчик) — это самый надёжный путь. Прямое «усечение» виртуального диска (особенно LVM/raw) рискованно и легко ведёт к неработающей системе. Ниже — подробные варианты и шаги.

Важно (читайте сначала)
- Сделайте хотя бы одну резервную копию конфигурации VM и, если возможно, снимок/backup диска. Без резервной копии любые операции на разделах/загрузчике — риск.  
- Выясните тип файловой системы и разметки: XFS нельзя уменьшить, ext2/3/4 — можно; root в LVM — добавляет сложностей. Выполните lsblk -f и df -h в госте.  
- Планируйте окно простоя — потребуется перезагрузка/выключение VM. Для безопасности работайте с выключенной VM при манипуляциях на уровне хоста.

Рекомендованный (и наиболее безопасный) метод — создать новый диск меньшего размера и скопировать систему
1. Подготовка в Proxmox:
   - Создайте новый диск нужного размера (например 80G) и добавьте его в VM (через GUI или CLI):
     qm set VMID --scsi1 local-lvm:80G
     (или используйте storage и контроллер, который у вас в VM).  
2. Внутри VM:
   - Очистите ненужные данные: apt-get clean, удалите лог-файлы, почту, кэш.  
   - Нулейте свободное пространство (полезно для последующего образа qcow2):
     sudo dd if=/dev/zero of=/zerofile bs=1M || true; sync; sudo rm -f /zerofile; sync
   - Убедитесь, что используемое место < нового диска (оставьте запас ~5-10 GB). df -h
3. Разметьте и отформатируйте новый диск:
   - lsblk — найдите /dev/sdb (новый диск).
   - parted /dev/sdb mklabel gpt; parted /dev/sdb mkpart primary ext4 1MiB 100%
   - mkfs.ext4 /dev/sdb1
4. Смонтируйте и скопируйте систему (rsync сохраняет права, xattrs):
   - sudo mount /dev/sdb1 /mnt/new
   - sudo rsync -aAXHv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /mnt/new
5. Подготовьте chroot и установите загрузчик:
   - sudo mount --bind /dev /mnt/new/dev
     sudo mount --bind /dev/pts /mnt/new/dev/pts
     sudo mount --bind /proc /mnt/new/proc
     sudo mount --bind /sys /mnt/new/sys
   - проверьте /mnt/new/etc/fstab — замените UUID старого диска на UUID нового (/sbin/blkid /dev/sdb1)
   - sudo chroot /mnt/new /bin/bash
     update-grub
     grub-install /dev/sdb   (для BIOS/legacy)
     Для UEFI: смонтируйте EFI раздел и установите grub-efi (apt-get install grub-efi-amd64; grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu)
     exit
   - Отмонтируйте bind-монты.
6. Тест и переключение:
   - Выключите VM.
   - В настройках VM Proxmox сделайте новый диск первичным для загрузки (поменяйте контроллер/порядок).
   - Запустите VM и проверьте, загружается ли система корректно, все сервисы (особенно Zentyal/AD) работают.
   - Если всё ок — удалите старый диск.

Плюсы этого метода:
- Минимальный риск для старого диска — до последнего момента он остаётся подключённым.
- Работает с XFS и LVM (копирование уровня файлов обходят многие ограничения).
- Даёт контроль над fstab, grub и UUID.

Альтернативный метод (более «прямой», подходящий если диск qcow2 и FS — ext4)
Только если диск QCOW2 (файл) и файловая система поддерживает сжатие/уменьшение (ext4), можно:
1. В госте:
   - Проверьте/очистите и уменьшите FS: boot с LiveCD или в однопользовательском режиме.
   - e2fsck -f /dev/sda1
   - resize2fs /dev/sda1 70G
   - скорректировать раздел (parted/fdisk) — убедитесь, что начало раздела не меняется.
2. На хосте Proxmox (VM остановлена):
   - Сделайте копию файла диска: qemu-img convert -p -O qcow2 old.qcow2 new.qcow2
     (qemu-img convert автоматически создаст файл минимального размера, если внутри много нулей).  
   - Подмените диск VM на новый new.qcow2 (проверьте права и ownership).
3. Запустите VM и проверьте загрузку.

Ограничения/риски альтернативного метода:
- raw/LVM-хранилища: qemu-img convert в случае LVM-thin требует дополнительных шагов (создать новый LV, импортировать образ туда).
- Нельзя уменьшать XFS; нельзя безопасно уменьшить filesystem без её проверки и корректного уменьшения внутри гостя.
- Неправильное изменение таблицы разделов может сделать систему не загрузочной.

Если корневой том в LVM внутри гостя
- Придётся уменьшать файловую систему, затем lvreduce, затем pvresize — все эти операции нужно выполнять осторожно, лучше в LiveCD. Иногда проще копировать на новый диск (первый метод).

Контрольный список перед началом
- Убедитесь, что занятое место существенно меньше целевого размера.
- Сделайте снимок/копию конфигурации VM.
- План простоя.
- Проверьте, нет ли сервисов с жёсткими ссылками снаружи (например, резервное копирование на основе UUID).
- Особая осторожность: это контроллер домена — продумайте перенос ролей/репликацию, если возможно, прежде чем экспериментировать.

Если хотите — могу:
- Прописать конкретную пошаговую инструкцию под вашу конфигурацию (скажетe: storage тип в Proxmox — qcow2 файл или local-lvm? VMID? файловая система внутри — ext4/XFS? root в LVM?).  
С этими данными дам точный набор команд и возможный сценарий «копирования на новый диск» или «shrink qcow2».
Похожие вопросы