Преобразовать каталог в образ виртуального диска QEMU / KVM

10

У меня есть каталог, заполненный данными, /var/backups/disk1который я хочу преобразовать в образ виртуального диска, который я затем смогу загрузить с помощью QEMU или KVM (каталог содержит файловую систему для виртуальной машины, скопированную с помощью rsync).

Хотя существует множество инструкций по преобразованию всего физического диска в виртуальный диск, упаковка только содержимого одного каталога в образ виртуального диска оказывается намного сложнее, чем я ожидал. Есть идеи?

Кстати, я знаю, что могу использовать qemu-imgдля преобразования блочного устройства в виртуальный диск (например, qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2), поэтому, если бы только я мог заставить каталог /var/backups/disk1казаться блочным устройством, то теоретически я должен быть в состоянии достичь своей цели, используя qemu-img, Однако я подумал о креативных способах представления каталога как блочного устройства с использованием NBD или устройства с обратной связью, но не увенчался успехом.

Крис
источник

Ответы:

16

Сначала создайте необработанное изображение необходимого размера. Я предполагаю, что 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, но это не обязательно.

Sciurus
источник
1
qemu-imgи fallocateнемного удобнее чем dd.
Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功
Как рассчитать минимально необходимый размер: unix.stackexchange.com/questions/353156/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功 法轮功
4

virt-make-fsиз qcow2примера libguestfs

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, если мы не сделаем обходной путь: /ubuntu/1046828/how-to-run-libguestfs-tools-tools-such-as- ВИРТ-макияж фс-без Суда / 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.

Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功
источник
1

Использование стратегии Майклса в 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 содержит все ваши файлы

Jauzus
источник
Если file.fsэто файл, mountкоманда не должна быть mount -o loop file.fs /mnt:?
Касперд
0

Как насчет доступа к каталогу как к сетевому ресурсу с виртуальной машины, которая также подключена к вашему целевому образу виртуального диска? Вы, чем просто выполнить простое копирование из общего ресурса на смонтированный образ диска.

user48838
источник
Это должно работать, и похоже на мою текущую стратегию, которая заключается в создании виртуальной машины и повторной синхронизации данных. Было бы здорово, если бы было более быстрое и более чистое решение. Копирование данных на новую машину становится довольно беспорядочным, потому что вам нужно заботиться о том, чтобы исключить некоторые файлы, которые не следует копировать, такие как fstab и большинство вещей в / boot
Chris
«исключить некоторые файлы, которые не следует копировать, такие как fstab и большинство других вещей в / boot» - может не быть большой проблемой, если целью виртуальной машины является дополнительный том.
user48838
0

Я предпочитаю (и использую) ответ Сиро Сантилли, но вот что работает с 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
rubicks
источник