Заключение: Уменьшение размера виртуального диска
В части 1 и части 2 мы подробно рассмотрели процесс создания загрузочного образа RDP-клиента на базе Debian 12. В результате у нас получился готовый к использованию образ, который можно записать на USB-носитель или установить на жёсткий диск.
В некоторых случаях требуется уменьшить размер виртуального диска — не просто сжать образ, а физически уменьшить объём виртуального qcow2-диска.
Самый надёжный способ — создать новый образ с меньшим диском и перенести туда систему.
Общий порядок действий
Смонтировать разделы исходного образа
src.qcow2Рассчитать минимальный необходимый размер диска
Создать новый образ
dst.qcow2с уменьшенным размеромРазметить новый диск вручную
Перенести данные с одного диска на другой
Сжать образ и проверить работоспособность
Чтобы избежать путаницы, основные термины:
Образ — файл (контейнер), содержащий виртуальный диск
Загрузочный раздел — первый раздел на виртуальном диске, содержит UEFI-загрузчик
Корневой раздел — второй раздел на виртуальном диске, содержит операционную систему
Гостевая система — система, работающая внутри виртуальной машины
Хостовая система — система, на которой запускается виртуальная среда QEMU
Уменьшение размера виртуального диска (для ext4)
Подготовка: подключение образа как блочное устройство
При установке пакета qemu-utils в системе появляется возможность подключать образы как Network Block Device (nbd).
1. Загрузите модуль ядра nbd:
$ sudo modprobe nbd max_part=2
После этого в системе появятся устройства /dev/nbd0, /dev/nbd1 и т.д. (исчезают после перезагрузки).
2. Подключите исходный образ к устройству /dev/nbd0:
$ sudo qemu-nbd --connect=/dev/nbd0 src.qcow2
После подключения будут доступны разделы:
/dev/nbd0p1— загрузочный раздел (fat32)/dev/nbd0p2— корневой раздел (ext4)
3. Создайте точки монтирования в рабочей директории:
$ mkdir -p src1 src2 dst1 dst2
src1,src2— для исходных разделовdst1,dst2— для новых разделов
4. Смонтируйте исходные разделы:
$ sudo mount /dev/nbd0p1 src1
$ sudo mount /dev/nbd0p2 src2
Узнайте UUID файловых систем:
$ sudo lsblk -f /dev/nbd0
Результат:
NAME FSTYPE LABEL UUID FSAVAIL FSUSE%
nbd0
├─nbd0p1 vfat C018-875A 34,7M 25%
└─nbd0p2 ext4 0b16dccf-ff74-4f52-b608-97ed3aa38b9f 1,4G 46%
Получите информацию об использовании дискового пространства:
$ sudo df -BM /dev/nbd0p*
Результат:
Файловая система 1M-блоков Использовано Доступно Использовано%
/dev/nbd0p1 47M 12M 35M 26%
/dev/nbd0p2 2903M 1326M 1411M 49%
Нам с запасом хватит 1500 Мб на новом виртуальном диске.
Создание нового образа
1. Создайте новый образ размером 1.5 ГБ:
$ qemu-img create -f qcow2 dst.qcow2 1500M
2. Подключите новый образ к /dev/nbd1:
$ sudo qemu-nbd --connect=/dev/nbd1 dst.qcow2
3. Теперь создайте таблицу разделов и два раздела.
Вариант 1: gparted (GUI):
$ sudo gparted /dev/nbd1
Настройки:
Таблица разделов: GPT
-
Раздел 1:
размер - 50 Мб
файловая система - не отформатировано
флаги -
bootиesp
-
Раздел 2:
Размер: оставшееся пространство
файловая система - не отформатировано

Вариант 2: parted (консоль)
$ sudo parted /dev/nbd1 -- mklabel gpt
$ sudo parted /dev/nbd1 -- mkpart ESP fat32 1MiB 51MiB
$ sudo parted /dev/nbd1 -- set 1 boot on
$ sudo parted /dev/nbd1 -- mkpart primary ext4 51MiB 100%
4. Форматирование загрузочного раздела:
$ sudo mkfs.fat -F32 -i C018875A /dev/nbd1p1
C018875A —
uuidраздела из старого образа
При копировании операционной системы проще скопировать старые uuid, чем в настройках прописывать новые.
5. Форматирование корневого раздела:
$ sudo mkfs.ext4 -N 50000 -m 0 \
-U 0b16dccf-ff74-4f52-b608-97ed3aa38b9f \
/dev/nbd1p2
-N 50000— задаёт количество индексных дескрипторов (inodes)-m 0— отключает резервирование блоков для root-U... — задаётuuidраздела
Чтобы понять какое количество индексных дескрипторов необходимо в файловой системе можно выполнить команду, которая в подробности даст информацию о файловой системе:
$ sudo tune2fs -l /dev/nbd0p2
В нашем случае параметры -N и -m дают дополнительную экономию в 50-70 Мб.
Копирование файловых систем
1. Смонтируйте новые разделы:
$ sudo mount /dev/nbd1p1 dst1
$ sudo mount /dev/nbd1p2 dst2
2. Копирование файлов загрузочного раздела:
$ sudo rsync -aAX ./src1/ ./dst1/
3. Копирование файлов корневого раздела:
$ sudo rsync -axHAWXS --numeric-ids --info=progress2 ./src2/ ./dst2/
-aрежим архивирования.-xне пересекает границы файловой системы.-Hсохраняет жёсткие ссылки.-Aсохраняет ACL.-Wотключает алгоритм дельта-передачи. Это удобный способ повысить скорость, когда и источник, и получатель находятся на локальном пути.-Xобновляет расширенные атрибуты назначения, делая их такими же, как в источнике.-Sпытается эффективно обрабатывать разреженные файлы, чтобы они занимали меньше места в месте назначения.-numeric-idsиспользует числовые идентификаторы вместо того, чтобы пытаться сопоставить их.-info=progress2выводит статистику по всей передаче, а не по отдельным файлам.
Сжатие образа
1. Обнулите свободное дисковое пространство (для лучшего сжатия):
$ sudo dd if=/dev/zero of=dst2/zero ; sudo rm -f dst2/zero
2. Отмонтируйте все разделы и отключите NBD-устройства:
$ sudo umount /dev/nbd0p1 /dev/nbd0p2 /dev/nbd1p1 /dev/nbd1p2
$ sudo qemu-nbd --disconnect /dev/nbd0
$ sudo qemu-nbd --disconnect /dev/nbd1
3. Сожмите финальный образ:
$ qemu-img convert -p -O qcow2 -c dst.qcow2 image.qcow2
Итоговый размер: 528 МБ
Проверка работоспособности
Запустите образ в QEMU:
$ qemu-system-x86_64 \
-m 2048M \
-enable-kvm \
-bios OVMF.fd \
-drive file=image.qcow2
Если система загружается — всё сделано правильно.
Уменьшение размера виртуального диска (для btrfs)
Если при установке Debian 12 вы выбрали файловую систему btrfs, то копирование системы имеет существенные отличия. Btrfs обладает дополнительными возможностями — подтомами, сжатием, дефрагментацией и смешанным режимом метаданных, — которые позволяют создавать ещё более компактные образы, но требуют особого подхода при клонировании. Этот раздел описывает пошаговый процесс уменьшения виртуального диска на основе btrfs с сохранением всех особенностей файловой системы.
Монтирование дисковых разделов старого образа:
$ sudo modprobe nbd max_part=2
$ sudo qemu-nbd --connect=/dev/nbd0 src.qcow2
$ mkdir src1 src2 dst1 dst2
$ sudo mount /dev/nbd0p1 src1
$ sudo mount -v -t btrfs -o nodatacow,subvol=@rootfs /dev/nbd0p2 src2
⚠️ Ключевое отличие от ext4: Debian при установке с btrfs создаёт подтом @rootfs.
Для переноса файловой системы необходимо учитывать наличие подтома @rootfs.
Дефрагментация и информация
Для того чтобы понять какой объём будет занимать операционная система на новом диске необходимо сначала дефрагментировать файловую систему btrfs:
$ sudo btrfs filesystem defragment -r -v -czstd src2
Помимо дефрагментация также будут существенно сжаты файлы.
Получите информацию об использовании дискового пространства:
$ sudo df -BM /dev/nbd0p*
Результат:
Файловая система 1M-блоков Использовано Доступно Использовано%
/dev/nbd0p1 47M 12M 35M 26%
/dev/nbd0p2 3023M 595M 1964M 24%
Подробная статистика btrfs покажет детали по выделению, сжатию и использованию блоков:
$ sudo btrfs filesystem usage src2
Получите uuidдисковых разделов:
$ sudo lsblk -f /dev/nbd0
Результат:
NAME FSTYPE LABEL UUID FSAVAIL
nbd0
├─nbd0p1 vfat 479A-BB3B 34,7M
└─nbd0p2 btrfs a6fe5032-b688-440c-b212-4d2805682997 1,9G
Создание нового образа
Для нового образа хватит размера 700 Мб:
qemu-img create -f qcow2 dst.qcow2 700M
$ sudo qemu-nbd --connect=/dev/nbd1 dst.qcow2
$ sudo gparted /dev/nbd1
Как и в предыдущем случае. Раздел 1: 50 Мб, не отформатирован флаги - boot, esp. Раздел 2: не отформатирован, весь оставшийся размер.

Форматирование и монтирование новых разделов
1. Форматирование EFI-раздела:
$ sudo mkfs.fat -F32 -i 479A-BB3B /dev/nbd1p1
$ sudo mount /dev/nbd1p1 dst1
2. Форматирование корневого раздела:
$ sudo mkfs.btrfs -M /dev/nbd1p2
-M— включает режим смешивания данных и метаданных, что уменьшает фрагментацию и экономит место.Система не позволяет одновременное использование нескольких разделов
btrfaс одинаковымuuid. Поэтомуuuidнеобходимо будет присвоить уже после переноса файлов.
3. Создание подтома @rootfs:
$ sudo mount /dev/nbd1p2 dst2
$ sudo btrfs subvolume create dst2/@rootfs
$ sudo umount /dev/nbd1p2
4. Монтирование с режимом сжатия файлов:
$ sudo mount -v -t btrfs \
-o nodatacow,subvol=@rootfs,compress=zstd:9 \
/dev/nbd1p2 dst2
nodatacow— отключает Copy-on-Write для системных файлов (ускоряет запись)compress=zstd:9— максимальное сжатиеsubvol=@rootfs— монтируем нужный подтом
Копирование разделов
1. Копирование файлов:
$ sudo rsync -aAX ./src1/ ./dst1/
$ sudo rsync -axHAWXS --numeric-ids --info=progress2 ./src2/ ./dst2/
При копировании во второй раздел файлы будут автоматически сжиматься.
2. Проверка использования btrfs:
$ sudo btrfs filesystem usage dst2
Результат:
Overall:
Device size: 648.00MiB
Device allocated: 647.00MiB
Used: 589.25MiB
Free (estimated): 51.80MiB
Укладываемся в 700 МБ с запасом.
Присвоить uuid для корневого раздела
Система не позволяет двум btrfs-разделам иметь одинаковый uuid одновременно. Поэтому.
1. Отмонтируйте и отключите старый образ:
$ sudo umount /dev/nbd0p1 /dev/nbd0p2
$ sudo qemu-nbd --disconnect /dev/nbd0
2. Назначьте uuid новому разделу:
$ sudo btrfstune -U a6fe5032-b688-440c-b212-4d2805682997 /dev/nbd1p2
3. Отключите новый образ:
$ sudo umount /dev/nbd1p1 /dev/nbd1p2
$ sudo qemu-nbd --disconnect /dev/nbd1
Cжатие образа
Размер образа получился 609 Мб. Можно попробовать ещё немного его ужать.
1. Подключите новый образ:
$ sudo qemu-nbd --connect=/dev/nbd1 dst.qcow2
$ sudo mount /dev/nbd1p2 dst2
2. Создайте и удалите файл из нулей:
$ sudo touch dst2/zero
$ sudo btrfs property set dst2/zero compression none
$ sudo dd if=/dev/zero of=dst2/zero
$ sudo rm -f dst2/zero
3. Отмонтируйте и сожмите:
$ sudo umount /dev/nbd1p2
$ sudo qemu-nbd --disconnect /dev/nbd1
$ qemu-img convert -p -O qcow2 -c dst.qcow2 image.qcow2
Итоговый размер: 487 МБ — на 122 МБ меньше.
Комментарии (2)

useribs
09.08.2025 01:52nodatacow должен отключать чексуммы и сжатие, он и compress взаимоисключающие флаги (можно проверить при помощи compsize). Точнее применится только последний из них (смотреть в findmnt). edit: лучше compress-force, на дистрибутиве debian разница ощутимая
igbs
Очень интересно... а чем wtware не нравиться?