У меня есть каталог с данными по адресу /var/backups/disk1
который я хочу преобразовать в образ виртуального диска, который затем я смогу загрузить с помощью QEMU или KVM (каталог содержит файловую систему для виртуальной машины, скопированную через rsync).
Хотя существует множество инструкций по преобразованию полного физического диска в виртуальный, упаковка только содержимого одного каталога в образ виртуального диска оказывается намного сложнее, чем я ожидал. Любые идеи?
Кстати, я знаю, что могу использовать qemu-img
для преобразования блочного устройства в виртуальный диск (например, qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2
), так что если бы я только мог получить каталог /var/backups/disk1
казаться блочным устройством, то теоретически я смогу достичь своей цели, используя qemu-img
. Однако я думал о творческих способах раскрытия каталога как блочного устройства с использованием NBD или устройства обратной связи, но безуспешно.
Сначала создайте необработанное изображение необходимого размера. Я предполагаю, что 10G будет достаточно. С помощью искать создает разреженный файл, что экономит место.
dd if=/dev/null of=example.img bs=1M seek=10240
Затем создайте на нем файловую систему.
mkfs.ext4 -F example.img
(Обратите внимание, что вам понадобится -F
вариант для mkfs.ext4
для работы с файлом, а не с разделом диска)
Затем установите его.
mkdir /mnt/example
mount -t ext4 -o loop example.img /mnt/example
Теперь вы можете скопировать свои файлы в / mnt / example. Как только это будет сделано, размонтируйте его, и вы сможете использовать example.img в качестве диска на виртуальной машине. Если вы хотите, вы можете преобразовать его из необработанного изображения в другой формат, например qcow2e, с помощью qemu-img, но это не обязательно.
Похоже, libguestfs может это сделать, см. virt-make-fs (1) и возможно виртуальное копирование (1).
virt-make-fs
из libguestfs qcow2
пример
https://serverfault.com/a/332114/163884 упомянул об этом, но вот полный пример:
sudo apt-get install libguestfs-tools
# Workarounds for Ubuntu 18.04 bugs. See section below.
sudo rm -rf /var/cache/.guestfs-*
echo dash | sudo tee /usr/lib/x86_64-linux-gnu/guestfs/supermin.d/zz-dash-packages
sudo chmod +r /boot/vmlinuz-*
mkdir sysroot
# Just a test file.
dd if=/dev/urandom of=sysroot/myfile bs=1024 count=1024
virt-make-fs --format=qcow2 --type=ext2 sysroot sysroot.ext2.qcow2
Обратите внимание, как sudo
не требуется, за исключением установки и обходных путей в Ubuntu.
Затем я подтвердил, что QEMU действительно может читать его с помощью:
qemu-system-x86_64 -drive file=sysroot.ext2.qcow2,format=qcow2,if=virtio,snapshot ...
Затем я могу смонтировать образ внутри QEMU Linux и прочитать файл.
virt-make-fs
пример ext
Этот замечательный инструмент также может создавать необработанные файловые системы ext, например:
virt-make-fs --format=raw --type=ext2 sysroot sysroot.ext2
virt-make-fs --format=raw --type=ext4 sysroot sysroot.ext4
что мы можем проверить прямо на хосте:
mkdir -p mnt
dev="$(sudo losetup --show -f -P sysroot.ext4)"
sudo mount -o loop "$dev" mnt
cmp sysroot/myfile mnt/myfile
Минимизация размера изображения
Действительно хорошая особенность virt-make-fs
заключается в том, что он автоматически пытается минимизировать размер изображения, если мы этого хотим:
Virt-make-fs по умолчанию минимизирует лишнее пространство, но вы можете использовать флаг --size, чтобы оставить место в файловой системе, если хотите.
так:
df -h
сообщает мне, что изображение заполнено на 82%:
/dev/loop17 1.5M 1.1M 244K 82% /home/ciro/test/guestfs/mnt
Мы можем легко добавить дополнительное пространство к минимуму с помощью --size-=+
:
virt-make-fs --format=raw --size=+8M --type=ext2 sysroot sysroot.ext2
накладные расходы журнала ext4
В руководстве также упоминается, что:
Обратите внимание, что файловые системы ext3 содержат журнал, обычно размером 1-32 МБ. Если вы не собираетесь использовать файловую систему так, как требует журнал, то это просто лишняя трата времени.
и интересно проверить это с помощью:
du -bs *
который производит:
1052672 sysroot
1446297 sysroot.ext2
2599731 sysroot.ext4
Итак, мы видим, что ext4 получилась значительно больше.
Ошибки libguestfs Ubuntu
А теперь обратная сторона: похоже, в настоящее время нет разработчика Ubuntu а библиотека обычно глючит на Ubuntu.
sudo
теоретически не требуется, но это необходимо из-за ошибки упаковки Ubuntu, если мы не сделаем обходной путь: https://askubuntu.com/questions/1046828/how-to-run-libguestfs-tools-tools-such-as-virt-make-fs-without-sudo/1046829#1046829
libguestfs: error: /usr/bin/supermin exited with error status 1.
To see full error messages you may need to enable debugging.
Do:
export LIBGUESTFS_DEBUG=1 LIBGUESTFS_TRACE=1
and run the command again. For further information, read:
http://libguestfs.org/guestfs-faq.1.html#debugging-libguestfs
You can also run 'libguestfs-test-tool' and post the *complete* output
into a bug report or message to the libguestfs mailing list.
libguestfs: error: /usr/bin/supermin exited with error status 1.
После этого без наших обходных путей 18.04 (но не 16.04) не сработает: https://bugzilla.redhat.com/show_bug.cgi?id=1591617
libguestfs: error: tar_in: write error on directory: /:
из-за ошибки, которая уже была исправлена в апстриме.
Протестировано в Ubuntu 18.04, libguestfs-tools 1: 1.36.13-1ubuntu3, QEMU 1: 2.11 + dfsg-1ubuntu7.3.
Использование стратегии Майклза в Fedora 23:
# dnf install -y libguestfs-tools-c
# virt-make-fs --format=raw --label mylabel the_directory myfs.raw
Это создает файловую систему ext2, которую вы можете смонтировать в какой-либо каталог:
# mount file.fs /mnt
Теперь / mnt содержит все ваши файлы
Как насчет доступа к каталогу как к общему сетевому ресурсу с виртуальной машины, которая также подключена к вашему целевому образу виртуального диска? Вы чем просто выполняете простое копирование с общего ресурса на смонтированный образ диска.
Я предпочитаю (и использую) ответ Чиро Сантилли, но вот кое-что, что работает с guestfish
оболочка:
# assumes extant directory "rootfs"
tar -cf rootfs.tar -C rootfs .
guestfish <<EOF
disk-create rootfs.qcow2 qcow2 "$((2 * $(stat -c%s rootfs.tar)))"
add-drive rootfs.qcow2
run
part-disk /dev/sda gpt
mkfs ext4 /dev/sda
mount /dev/sda /
tar-in rootfs.tar /
umount-all
exit
EOF