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:
Уменьшение размера образов дисков виртуальных машин.
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:
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:
Изменение размера дискового пространства образов виртуальных машин.
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:
Монтирование образов виртуальных машин.
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'