В этой заметке мы научимся модифицировать образы дисков в формате qcow2 с помощью консольных утилит из библиотеки libguestfs-tools.
🖐️Эй!
Подписывайтесь на наш телеграм @r4ven_me📱, чтобы не пропустить новые публикации на сайте😉. А если есть вопросы или желание пообщаться по тематике — заглядывайте в Вороний чат @r4ven_me_chat🧐.
Формат заметки HowTo, поэтому меньше слов, больше команд🙃.
☝️ Примеры команд ниже выполнялись в консоли гипервизора Proxmox 9 (Debian 13).
Подключаемся к серверу по SSH:
ssh root@proxmox.lanОбновляем кэш пакетов и устанавливаем необходимые утилиты:
apt update
apt install -y wget qemu-utils libguestfs-toolsСкачиваем актуальный базовый образ Debian 13 в формате qcow2:
wget https://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-amd64.qcow2
ls -l ./debian-13-generic-amd64.qcow2
Выполняем ресайз диска (укажите подходящее вам значение):
qemu-img resize ./debian-13-generic-amd64.qcow2 20GТеперь кастомизируем наш образ под свои предпочтения.
Ниже я выполню обновление пакетов и установку некоторых утилит + настройка локали:
⚠️ Процесс может занять некоторое время.
virt-customize -a debian-13-generic-amd64.qcow2 --update \
--install qemu-guest-agent,locales,zsh,git,curl,neovim,bat,eza,fzf \
--run-command "echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen" \
--run-command "echo 'ru_RU.UTF-8 UTF-8' >> /etc/locale.gen" \
--run-command "locale-gen"
Готово.
Если вам нужно скопировать внешний файл внутрь образа, то делается это с помощью команды virt-copy-in.
Например, закинем в образ мой файл .zshrc:
curl -fsSL https://raw.githubusercontent.com/r4ven-me/dots/main/.zshrc \
--output /tmp/.zshrc
chmod 640 /tmp/.zshrc && chown root: /tmp/.zshrc
virt-copy-in -a ./debian-13-generic-amd64.qcow2 /tmp/.zshrc /root
virt-copy-in -a ./debian-13-generic-amd64.qcow2 /tmp/.zshrc /etc/skel/Если необходимо отредактировать какой-либо файл внутри образа, то пользуемся командой virt-edit.
Например, в качестве оболочки по умолчанию для новых пользователей укажем ZSH.
Для команды useradd:
virt-edit -a ./debian-13-generic-amd64.qcow2 /etc/default/useradd📝 Откроется редактор vi/vim.
Указываем SHELL=/usr/bin/zsh.

Теперь для команды adduser:
virt-edit -a ./debian-13-generic-amd64.qcow2 /etc/adduser.confУказываем DSHELL=/usr/bin/zsh.
Если вам нужно изменить множество файлов, то более удобным вариантом будет монтирование образа в хостовую систему, например, в /mnt/qcow2:
mkdir -p /mnt/qcow2
guestmount -i -a ./debian-13-generic-amd64.qcow2 /mnt/qcow2
ls -l /mnt/qcow2
Для отмонтирования используйте команду:
guestunmount /mnt/qcow2Если базовых операций вам недостаточно, можно запустить интерактивную оболочку прямо внутри образа:
guestfish -i -a ./debian-13-generic-amd64.qcow2Например, изменим оболочку пользователя root:
sh 'chsh -s /usr/bin/zsh'
sh 'grep root /etc/passwd'
Вот так всё просто и очень удобно😉. Используйте подготовленный образ для ваших новых виртуальных машин👨💻.
Ниже приведён расширенный список основных команды модификации образа:
# Просмотр содержимого каталогов в образе
virt-ls -a <image.img> /path
# Просмотр содержимого файла
virt-cat -a <image.img> /path/to/file
# Редактирование файла внутри образа
virt-edit -a <image.img> /path/to/file
# Копирование файла с хоста в образ
virt-copy-in -a <image.img> <host_file> /guest/path
# Копирование файла из образа на хост
virt-copy-out -a <image.img> /guest/path <host_path>
# Архивация содержимого образа
virt-tar-out -a <image.img> /path /host/archive.tar
# Распаковка tar в образ
virt-tar-in -a <image.img> archive.tar /guest/path
# Показать файловые системы, разделы, LVM
virt-filesystems -a <image.img>
# Извлечение ядра и initrd из гостевой ОС
virt-get-kernel -a <image.img>
# Чтение логов системы внутри образа
virt-log -a <image.img>
# Анализ образа: ОС, пакеты, сервисы, настройки
virt-inspector -a <image.img>
# Использование файловых систем (аналог df)
virt-df -a <image.img>
# Создание готовых образов ОС (builder)
virt-builder <os-name>
# Управление репозиторием образов для builder
virt-builder-repository
# Модификация образов: пакеты, ключи, команды, файлы
virt-customize -a <image.img> --install vim --ssh-inject root:file:id_rsa.pub
# Очистка образа перед дистрибуцией (sysprep)
virt-sysprep -a <image.img>
# Уменьшение qcow2, удаление нулевых блоков
virt-sparsify <in.qcow2> <out.qcow2>
# Изменение размера разделов/ФС
virt-resize --expand /dev/sda1 in.qcow2 out.qcow2В следующей заметке мы рассмотрим процедуру импорта подготовленного диска в гипервизор Proxmox. Не пропустите👨💻.


