QEMU-image, Guestfs-tools (Libguestfs) краткое руководство по созданию, конвертации, сжатию, изменению размера образов и файловых систем дисков Виртуальных Машин

QEMU-image, Guestfs-tools (Libguestfs)

Предисловие:

Что лучше использовать и на что обратить внимание в статье:

  • qemu-img info - получение детальной информации о дисковом образе.
  • qemu-img create - создание нового образа диска.
  • virt-sparsify - уменьшение размера образов дисков виртуальных машин (ВМ).
  • virt-sparsify --compress - уменьшение размера и сжатие образов дисков ВМ.
  • virt-sparsify --convert - конвертация образов виртуальных дисков из одного формата в другой.
  • virt-filesystems - отображения списка файловых систем в образе виртуального диска.
  • virt-resize --expand - изменение размера (увеличения или уменьшения) разделов дисков ВМ.
  • guestmount - монтирование файловых систем виртуальных машин на хост-системе.

QEMU-image:

qemu-img — это утилита для работы с образами дисков виртуальных машин, входящая в состав проекта QEMU. Она позволяет создавать, преобразовывать, проверять и получать информацию об образах дисков, а также управлять снапшотами (снимками состояний) дисков.

Основные возможности и команды qemu-img:

  • info — получение детальной информации о дисковом образе.
  • create — создание нового образа диска.
  • convert — конвертация образа из одного формата в другой.
  • check — проверка дискового образа на ошибки.

Часто используемые опции:

  • -f <формат> — указывает формат входного образа (raw, qcow2, vmdk и др.).
  • -O <формат> — формат выходного образа при конвертации.
  • -o <опции> — специфичные опции формата (например, compression_type=zlib).
    • preallocation=off — не выделяет метаданные заранее, самый быстрый старт, но медленнее запись.
    • preallocation=falloc — предвыделяет место для метаданных и данных, используя системный вызов posix_fallocate(), баланс между временем создания и хорошей производительностью записи.
    • preallocation=full — выделяет всё пространство полностью (метаданные и данные), давая лучшую производительность записи, но занимает много времени и места при создании.
    • preallocation=metadata заранее выделяет место для метаданных, что ускоряет процесс создания образа по сравнению с полным предвыделением, но при этом улучшает производительность записи по сравнению с полностью динамическим (без предвыделения) вариантом.
  • -c — при конвертации включает сжатие (для форматa qcow2).
  • -p — отображает прогресс операции.
  • -U — удаляет информацию о связанном backing file (для qcow2).
  • Размеры указываются с суффиксами: G (гигабайты), M (мегабайты).

Поддерживаются различные форматы дисковых образов:

  • raw — простой формат без дополнительных метаданных;
  • qcow2 — популярный формат с функциями сжатия и поддержки снапшотов;
  • qcow, cow — другие варианты формата qcow;
  • vmdk — формат VMware;
  • cloop — сжатый образ;
  • vpc (или VHD) — формат Virtual PC.

Основные команды (подкоманды) и часто используемые опции утилиты qemu-img для работы с образами дисков:


info — выводит подробную информацию об образе (формат, размер, специфика формата и пр).

Формат:

qemu-img info <файл_образа>

create — создание нового образа диска.

Формат:

qemu-img create -f <формат> <имя_файла> <размер>

Пример:

qemu-img create -f qcow2 'disk.qcow2' 20G

convert — конвертация дискового образа из одного формата в другой.

Формат:

qemu-img convert -f <формат_исходника> -O <формат_назначения> [опции] <исходный_файл> <цель>

Пример:

qemu-img convert -f raw -O qcow2 -c 'disk.img' 'disk.qcow2'

check — проверка образа диска на наличие ошибок.

Формат:

qemu-img check <файл_образа>



Guestfs-tools (Libguestfs):

libguestfs — это набор инструментов для доступа и изменения образов дисков виртуальных машин (ВМ). Вы можете использовать его для просмотра и редактирования файлов внутри гостей, создания сценариев для изменений виртуальных машин, мониторинга статистики использования/свободного диска, создания гостей, P2V, V2V, выполнения резервного копирования, клонирования виртуальных машин, создания виртуальных машин, форматирования дисков, изменения размера дисков и многого другого.

libguestfs может получить доступ практически к любому образу диска, который только можно вообразить. Он может делать это безопасно — без необходимости root и с несколькими уровнями защиты от вредоносных образов дисков. Он может получить доступ к образам дисков на удалённых машинах или на компакт-дисках/USB-накопителях. Он может получить доступ к проприетарным системам, таким как VMware и Hyper-V.

Установка guestfs-tools:

На момент написания данной статьи app-emulation/guestfs-tools требует чтобы в зависимости app-misc/hivex был выключен флаг ocaml.
#

echo "app-misc/hivex ocaml" >> /etc/portage/package.use/custom

#

emerge -av app-emulation/guestfs-tools


virt-sparsify:

https://libguestfs.org/virt-sparsify.1.html
Уменьшение размера образов дисков виртуальных машин.


virt-sparsify — это утилита для уменьшения размера образов дисков виртуальных машин за счёт преобразования их в разрежённый (thin-provisioned) формат. Она анализирует и освобождает неиспользуемое место внутри файловой системы виртуального диска, заполняя его нулями и конвертируя в sparse-формат. Это позволяет фактически освободить пространство на хосте, занятое “пустым” пространством внутри образа диска.

Основные назначения virt-sparsify:

  • Уменьшение размера qcow2 или raw образов дисков виртуальных машин.
  • Освобождение места на хост-системе, возвращая незанятое пространство.
  • Конвертация между форматами образов (например, raw в qcow2 с тонким выделением).
  • Поддержка популярных файловых систем: ext2/3/4, btrfs, NTFS и др., а также LVM.
  • Перед использованием virt-sparsify виртуальная машина должна быть выключена, чтобы избежать повреждения данных.
  • Операция обычно требует свободного места в два раза больше размера исходного диска (для временной копии).

Формат:

virt-sparsify '/путь/к/директории/с/input.img' '/путь/к/директории/с/output-разреженный.img'

Формат использования для сжатия образа в директории с образом:

 virt-sparsify 'input.img' 'output-разреженный.img'
  • input.img — исходный образ (может быть любой поддерживаемый формат: raw, vmdk, и т.п.)
  • output-разреженный.img — результат разреженный образ.

Важно:

virt-sparsify нужно, чтобы в стандартной временной директории /tmp было достаточно свободного пространства для выполнения операции. Virt-sparsify требует большого количества временного хранилища — до полного виртуального размера входного образа диска — для безопасного создания sparse-копии.

Как исправить:

  • Задайте переменную окружения TMPDIR, указывающую на директорию с достаточным количеством свободного места, перед запуском virt-sparsify.

TMPDIR='/путь/к/директории/с/свободным/местом' virt-sparsify 'input.img' 'output-разреженный.img'

Или в запускаете из той же директории, где лежат input.img output-разреженный.img:

TMPDIR=$(pwd) virt-sparsify 'input.img' 'output-разреженный.img'

Примеры опций:

  • --in-place- Разрежает образ без создании копии:
  • --compress- сжимает образ
  • --convert- конвертирует образ в другой формат:

(Под вопросом ???)

Опция –in-place в virt-sparsify :

Позволяет выполнять операцию разрежения (sparsify) образа виртуального диска «на месте», то есть без создания нового выходного файла. Вместо копирования данных в новый образ, команда модифицирует существующий файл напрямую, освобождая неиспользуемое пространство и уменьшая занимаемый дисковый объем.

Основные особенности опции --in-place:

  • Работает только с одним исходным файлом — перезаписывает его, не создавая копию.
  • Требует значительно меньше временного пространства на диске, так как не создаётся временный образ.
  • Виртуальная машина при этом должна быть выключена, чтобы избежать риска повреждения данных.
  • Нельзя использовать совместно с опциями, которые меняют формат или компрессию образа, например, --compress, --convert, -o.
  • Использует поддержку discard/trim для очистки свободного пространства.
  • Хотя это более экономично с точки зрения ресурсов, --in-place обычно освобождает немного меньше места, чем конвертация в новый sparse-образ.

Пример использования virt-sparsify с опцией --in-place, которая позволяет преобразовать образ виртуального диска напрямую, без создания нового файла, выглядит так:

virt-sparsify --in-place 'input.img'
  • --in-place нельзя использовать одновременно с такими опциями, как --compress или --convert.

Опция –compress в virt-sparsify:

Используется для сжатия выходного файла образа виртуального диска. Она работает только если выходной формат образа — qcow2. При использовании этой опции virt-sparsify не просто освобождает и делает образ разрежённым (sparse), но дополнительно сжимает данные внутри образа с помощью встроенных алгоритмов сжатия qcow2. Это позволяет дополнительно уменьшить размер итогового файла на хосте.

Основные особенности опции --compress:

  • Работает только при создании нового файла образа (нельзя использовать вместе с --in-place).
  • Поддерживается только для формата qcow2.
  • Позволяет уменьшить размер итогового образа за счёт сжатия данных внутри qcow2-файла.
  • Требует больше времени на выполнение, так как происходит дополнительное сжатие.
  • По сути, объединяет операцию разрежения (удаления неиспользуемого пространства) и сжатия данных.

Пример использования virt-sparsify с опцией --compress:

TMPDIR=$(pwd) virt-sparsify --compress 'input.qcow2' 'output-сжатый.qcow2'

Таким образом, --compress добавляет к стандартной операции sparsify дополнительный уровень сжатия образа для более эффективного использования дискового пространства.


virt-sparsify позволяет не только очищать неиспользуемое пространство в образах, но и конвертировать их в разные форматы, включая qcow2.

Опция –convert в virt-sparsify:

Используется для конвертации образов виртуальных дисков из одного формата в другой во время операции разрежения (sparsify). Это удобно, если вы хотите одновременно уменьшить размер образа и изменить его формат, например, преобразовать raw образ в qcow2 с тонким выделением.

Основные особенности опции --convert:

  • Позволяет указать формат выходного файла (например, qcow2, raw и др.).
  • Часто рекомендуется использовать эту опцию, чтобы virt-sparsify не нужно было угадывать формат исходного образа.
  • Нельзя использовать совместно с опцией --in-place.
  • Позволяет совместить операцию освобождения свободного места с конвертацией формата, что удобно для миграции или оптимизации.
  • При необходимости можно дополнительно применять опции --compress или -o для управления форматированием и компрессией выходного образа.
    Таким образом, --convert расширяет возможности virt-sparsify, позволяя делать не только разрежение, но и менять формат образа виртуального диска в рамках одной операции

Пример использования virt-sparsify с опцией --convert:

TMPDIR=$(pwd) virt-sparsify --convert qcow2 'input.img' 'output.qcow2'

Вы можете дополнительно указать опции формата, например:

TMPDIR=$(pwd) virt-sparsify --convert qcow2 -o cluster_size=512,preallocation=metadata 'input.img' 'output.qcow2'
  • input.img — исходный образ (может быть любой поддерживаемый формат: raw, vmdk, и т.п.)
  • output.qcow2 — результат в формате qcow2


virt-filesystems:

https://libguestfs.org/virt-filesystems.1.html
virt-filesystems — это утилита из набора инструментов libguestfs, которая служит для получения информации о файловых системах и разделах, содержащихся внутри образа виртуального диска. Она позволяет исследовать структуру виртуального диска без необходимости монтирования и запуска гостевой ОС.

Просмотр разделов и файловых систем:

Команда выведет список распознанных разделов, устройств и файловых систем:

virt-filesystems -a '/путь/к/виртуальному/input.img'

Команда выведет список распознанных разделов, устройств и файловых систем.

Расширенная команда:

virt-filesystems --long -h --all -a '/путь/к/виртуальному/input.img'

Использует несколько опций:

  • -a input.img — указывает файл образа виртуального диска для анализа.
  • --long (или -l) — выводит расширенную таблицу с подробной информацией по каждому объекту (файловая система, раздел, устройство), включая тип файловой системы, размер, метки, UUID и родительские устройства.
  • --all — показывает все объекты, в том числе и разделы без файловых систем, а также устройства LVM, RAID и др.
  • -h — выводит размеры в удобочитаемом формате (человеко-читаемый, human-readable), например, в мегабайтах или гигабайтах.

В результате вы получите развернутый список всех разделов и файловых систем в образе с колонками, которые обычно включают.



virt-resize:

https://libguestfs.org/virt-resize.1.html
Изменение размера дискового пространства образов виртуальных машин.


Virt-resize — это консольная утилита из пакета libguestfs-tools, предназначенная для изменения размера (увеличения или уменьшения) дисков виртуальных машин. С помощью virt-resize вы можете расширять или сжимать как весь виртуальный диск, так и отдельные разделы в нём. Инструмент работает только с выключенными виртуальными машинами — это важно для предотвращения повреждения данных. Процесс происходит не на месте, а путём создания нового диска нужного размера и копирования туда содержимого с возможной коррекцией/масштабированием разделов. Старый диск при этом остаётся нетронутым и его можно использовать как резервную копию.

Общий синтаксис:

virt-resize [опции] 'input.img' 'output.img'

Примеры опций:

  • --expand /dev/sdaN — расширяет указанный раздел;
  • --shrink /dev/sdaN — сжимает раздел;
  • --ignore /dev/sdaN — не копирует раздел;
  • --delete /dev/sdaN — удаляет раздел.

Важные замечания

  • Требуется достаточно свободного дискового пространства для хранения нового образа.
  • virt-resize работает не со всеми типами разделов (например, LVM требует отдельного подхода.
  • Инструмент не работает с «живыми» (запущенными) виртуальными машинами.
  • Перед операцией убедитесь, что у диска выключены снапшоты.
  • Опцию --shrink нельзя использовать одновременно с --expand.

Краткая инструкция по использованию virt-resize:

  1. Выключите виртуальную машину.
  2. Для удобства перейдите в директорию в которой находится образ диска.

Применение опции --expand /dev/sdaN:

Увеличение раздела /dev/sdaN в образе:
  1. Создайте новый образ диска при помощи утилиты truncate, который должен быть больше исходного:
    Например, если вы хотите увеличить диск на 5ГБ:#
truncate -r 'input.img' 'output.img'
truncate -s +5G 'output.img'

В этом случае output.img будет иметь формат raw.
Или вместо команды [truncate]:

fallocate -l 20G 'outdisk.img'

QCOW2 и несжатые необработанные форматы:

Если входной диск имеет формат qcow2, то вы можете предпочесть, чтобы выходной диск также имел формат qcow2. В качестве альтернативы virt-resize может преобразовывать формат на лету. Выходной формат определяется форматом пустого выходного контейнера, который вы указываете. Таким образом, чтобы создать выходной файл в формате qcow2, используйте:

qemu-img create -f qcow2 -o preallocation=metadata 'output.qcow2' [size]

Пример:

qemu-img create -f qcow2 -o preallocation=metadata 'output.qcow2' 50G
  1. Определите название нужного раздела.
    Для этого можно использовать:
virt-filesystems --long -h --all -a 'input.img'
  1. Запустите virt-resize с опцией --expand /dev/sdaN:
  • Чтобы расширить раздел /dev/sdaN:
TMPDIR=$(pwd) virt-resize --expand /dev/sdaN 'input.img' 'output.qcow2'
Уменьшение раздела /dev/sdaN в образе:
  1. Создать образ нужного размера при помощи truncate, fallocateили qemu-img create :
    Пример:
    Исходный образ ‘input.img’ 40G, создадим ‘outdisk.qcow2’ 30G:

qemu-img create -f qcow2 -o preallocation=metadata 'output.qcow2' 30G
  1. Создадим копию образа ВМ:
  2. Запустим ВМ и при помощи gparted уменьшим нужный раздел /dev/sdaN например 25G
    чтобы он был меньше ‘outdisk.qcow2’ создаст нераспределенное пространство в образе:
  3. Определите название нужного раздела.
    Для этого можно использовать:
virt-filesystems --long -h --all -a 'input.img'
  1. Запустите virt-resize с опцией --expand /dev/sdaN:
  • Чтобы расширить раздел /dev/sdaN:
TMPDIR=$(pwd) virt-resize --expand /dev/sdaN 'input.img' 'output.qcow2'

--expand /dev/sdaN заполнит нераспределенное пространство.


(Под вопросом ???)

Применение опции --shrink /dev/sdaN:

  1. Уменьшите файловую систему внутри виртуальной машины (например, с помощью команды gparted на 5Гб) чтобы было неразмеченное место на диске, которое называется “дефицитом”. --shrink /dev/sdaN уменьшит указанный раздел по крайней мере на этот дефицит, чтобы новый диск стал меньшего размера.
  2. Определите название нужного раздела.
    Для этого можно использовать:
virt-filesystems --long -h --all -a 'input.img'
  1. Запустите virt-resize с опцией --shrink /dev/sdaN:
  • Например чтобы уменьшить раздел /dev/sdaN:
TMPDIR=$(pwd) virt-resize --shrink /dev/sdaN 'input.img' 'output.img'

Применение опции --ignore /dev/sdaN:

Опция --ignore /dev/sdaN в утилите virt-resize используется для того, чтобы не копировать содержимое указанного раздела на новый диск, хотя сам раздел при этом создаётся в итоговом образе. Проще говоря, указанный раздел будет выделен на новом диске, но его содержимое окажется пустым (все данные в этом разделе будут обнулены).


Применение опции --delete /dev/sdaN:

Опция --delete /dev/sdaN в утилите virt-resize используется для полного удаления указанного раздела при копировании диска на новый образ. То есть раздел не будет перенесён в новый диск, он будет полностью исключён из таблицы разделов нового образа.

  • При удалении раздела остальные разделы, идущие после удалённого, перенумеровываются, что может повлиять на загрузку гостевой ОС (например, изменятся номера устройств /dev/sda3, /dev/sda4 и т.д.).


guestmount:

https://libguestfs.org/guestmount.1.html
Монтирование образов виртуальных машин.


guestmount — это утилита из набора инструментов libguestfs, которая позволяет монтировать файловые системы виртуальных машин на хост-системе, делая их содержимое доступным так, как если бы это была обычная файловая система на вашем компьютере. Она работает поверх FUSE (файловая система в пространстве пользователя) и libguestfs (библиотеки для доступа к виртуальным дискам).

  • Позволяет монтировать виртуальные диски (файлы образов виртуальных машин) или файловые системы гостевых виртуальных машин в каталоги хоста.
  • Важная опция — монтирование в режиме только для чтения (--ro), чтобы избежать повреждения дисков гостевых машин, особенно если машина работает.
  • Используется для доступа к данным в образах виртуальных дисков без запуска самой ВМ, например, чтобы извлечь файлы, изменить конфигурации или произвести резервное копирование.

Общий синтаксис:

guestmount -a '/путь/до/виртуального/диска' -i --ro '/точка/монтажа'
  • -a '/путь/до/виртуального/диска' — указывает путь к виртуальному диску.
  • Опция -i или --inspector — автоматически находит и монтирует разделы с образа Операционной Системы внутри виртуального диска.
  • Опция --ro или -r — монтирование в режиме только для чтения (рекомендуется, чтобы не повредить диск).
  • ‘/точка/монтажа’ — директория в вашей системе, куда будет смонтирован диск.
  • Опция --rw — Монтирование в режиме записи (--rw) можно использовать, но следует быть очень осторожным, так как это может привести к повреждению данных, если виртуальная машина работает одновременно с монтированием.
  • Опция --live позволяет (экспериментально) подключаться к работающей ВМ, но стабильность не гарантирована.

Монтирования образа ОС:

Пример:

  1. Монтирование:

mkdir '/tmp/guest'
guestmount -a '/путь/до/виртуального/диска' -i --ro '/tmp/guest' 
ls '/tmp/guest'

После этого вы можете работать с файлами, как с обычной директорией.

  1. Размонтирование:

guestunmount '/tmp/guest'

Если же образ не содержит ОС, а содержит файловые системы с данными - опция -i (автоматическая инспекция и монтирование) не используется.

Пример:

  1. Монтирование:

mkdir '/tmp/guest'
virt-filesystems -a '/путь/до/виртуального/диска'
guestmount -a '/путь/до/виртуального/диска' -m /dev/sdaN --ro '/tmp/guest'
ls '/tmp/guest'

где /dev/sdaN — раздел, который вы получили из virt-filesystems.

  1. Размонтирование:

guestunmount '/tmp/guest'
1 Like