Заключение: Уменьшение размера виртуального диска
В части 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 МБ меньше.
ссылка на оригинал статьи https://habr.com/ru/articles/935484/
Добавить комментарий