- PVSM.RU - https://www.pvsm.ru -
В части 1 [1]и части 2 [2]мы подробно рассмотрели процесс создания загрузочного образа RDP-клиента на базе Debian 12. В результате у нас получился готовый к использованию образ, который можно записать на USB-носитель или установить на жёсткий диск.
В некоторых случаях требуется уменьшить размер виртуального диска — не просто сжать образ, а физически уменьшить объём виртуального qcow2-диска.
Самый надёжный способ — создать новый образ с меньшим диском и перенести туда систему.
Смонтировать разделы исходного образа src.qcow2
Рассчитать минимальный необходимый размер диска
Создать новый образ dst.qcow2 с уменьшенным размером
Разметить новый диск вручную
Перенести данные с одного диска на другой
Сжать образ и проверить работоспособность
Образ — файл (контейнер), содержащий виртуальный диск
Загрузочный раздел — первый раздел на виртуальном диске, содержит UEFI-загрузчик
Корневой раздел — второй раздел на виртуальном диске, содержит операционную систему
Гостевая система — система, работающая внутри виртуальной машины
Хостовая система — система, на которой запускается виртуальная среда QEMU
При установке пакета 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
Если система загружается — всё сделано правильно.
Если при установке 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 МБ с запасом.
Система не позволяет двум 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
Размер образа получился 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 МБ меньше.
Автор: dign
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/427552
Ссылки в тексте:
[1] части 1 : https://habr.com/ru/articles/935022/
[2] части 2 : https://habr.com/ru/articles/935226/
[3] Источник: https://habr.com/ru/articles/935484/?utm_campaign=935484&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.