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:
- Выключите виртуальную машину.
- Для удобства перейдите в директорию в которой находится образ диска.
Применение опции --expand /dev/sdaN
:
Увеличение раздела /dev/sdaN
в образе:
- Создайте новый образ диска при помощи утилиты
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
- Определите название нужного раздела.
Для этого можно использовать:
virt-filesystems --long -h --all -a 'input.img'
- Запустите virt-resize с опцией
--expand /dev/sdaN
:
- Чтобы расширить раздел /dev/sdaN:
TMPDIR=$(pwd) virt-resize --expand /dev/sdaN 'input.img' 'output.qcow2'
Уменьшение раздела /dev/sdaN
в образе:
- Создать образ нужного размера при помощи
truncate
,fallocate
илиqemu-img create
:
Пример:
Исходный образ ‘input.img’ 40G, создадим ‘outdisk.qcow2’ 30G:
qemu-img create -f qcow2 -o preallocation=metadata 'output.qcow2' 30G
- Создадим копию образа ВМ:
- Запустим ВМ и при помощи
gparted
уменьшим нужный раздел/dev/sdaN
например 25G
чтобы он был меньше ‘outdisk.qcow2’ создаст нераспределенное пространство в образе: - Определите название нужного раздела.
Для этого можно использовать:
virt-filesystems --long -h --all -a 'input.img'
- Запустите virt-resize с опцией
--expand /dev/sdaN
:
- Чтобы расширить раздел /dev/sdaN:
TMPDIR=$(pwd) virt-resize --expand /dev/sdaN 'input.img' 'output.qcow2'
--expand /dev/sdaN
заполнит нераспределенное пространство.
(Под вопросом ???)
Применение опции --shrink /dev/sdaN
:
- Уменьшите файловую систему внутри виртуальной машины (например, с помощью команды
gparted
на 5Гб) чтобы было неразмеченное место на диске, которое называется “дефицитом”.--shrink /dev/sdaN
уменьшит указанный раздел по крайней мере на этот дефицит, чтобы новый диск стал меньшего размера. - Определите название нужного раздела.
Для этого можно использовать:
virt-filesystems --long -h --all -a 'input.img'
- Запустите 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
позволяет (экспериментально) подключаться к работающей ВМ, но стабильность не гарантирована.
Монтирования образа ОС:
Пример:
- Монтирование:
mkdir '/tmp/guest'
guestmount -a '/путь/до/виртуального/диска' -i --ro '/tmp/guest'
ls '/tmp/guest'
После этого вы можете работать с файлами, как с обычной директорией.
- Размонтирование:
guestunmount '/tmp/guest'
Если же образ не содержит ОС, а содержит файловые системы с данными - опция -i
(автоматическая инспекция и монтирование) не используется.
Пример:
- Монтирование:
mkdir '/tmp/guest'
virt-filesystems -a '/путь/до/виртуального/диска'
guestmount -a '/путь/до/виртуального/диска' -m /dev/sdaN --ro '/tmp/guest'
ls '/tmp/guest'
где /dev/sdaN
— раздел, который вы получили из virt-filesystems
.
- Размонтирование:
guestunmount '/tmp/guest'