Заключение: Уменьшение размера виртуального диска
В части 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 МБ меньше.