Как стать автором
Поиск
Написать публикацию
Обновить

Создаём образ RDP-клиента для запуска с USB-флешки (часть 3)

Время на прочтение6 мин
Количество просмотров748

Заключение: Уменьшение размера виртуального диска

В части 1 и части 2 мы подробно рассмотрели процесс создания загрузочного образа RDP-клиента на базе Debian 12. В результате у нас получился готовый к использованию образ, который можно записать на USB-носитель или установить на жёсткий диск.

В некоторых случаях требуется уменьшить размер виртуального диска — не просто сжать образ, а физически уменьшить объём виртуального qcow2-диска.

Самый надёжный способ — создать новый образ с меньшим диском и перенести туда систему.

Общий порядок действий

  1. Смонтировать разделы исходного образа src.qcow2

  2. Рассчитать минимальный необходимый размер диска

  3. Создать новый образ dst.qcow2 с уменьшенным размером

  4. Разметить новый диск вручную

  5. Перенести данные с одного диска на другой

  6. Сжать образ и проверить работоспособность

Чтобы избежать путаницы, основные термины:

  • Образ — файл (контейнер), содержащий виртуальный диск

  • Загрузочный раздел — первый раздел на виртуальном диске, содержит 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:

    • Размер: оставшееся пространство

    • файловая система - не отформатировано

Gparted - удобно и наглядно
Gparted - удобно и наглядно

Вариант 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: не отформатирован, весь оставшийся размер.

Разбивка под btrfs
Разбивка под btrfs

Форматирование и монтирование новых разделов

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 МБ меньше.

Теги:
Хабы:
+1
Комментарии2

Публикации

Ближайшие события