Chr*_*ris 11 virtualization linux qemu kvm-virtualization
我有一个装满数据的目录/var/backups/disk1,我想将其转换为虚拟磁盘映像,然后我就可以使用 QEMU 或 KVM 启动(该目录包含虚拟机的文件系统,通过 rsync 复制出来)。
虽然有很多关于将完整的物理磁盘转换为虚拟磁盘的说明,但将单个目录的内容打包到虚拟磁盘映像中比我预期的要困难得多。有任何想法吗?
顺便说一句,我知道我可以使用qemu-img将块设备转换为虚拟磁盘(例如,qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2),所以如果我能让目录/var/backups/disk1看起来像块设备,那么理论上我应该能够使用qemu-img. 然而,我已经考虑过使用 NBD 或环回设备将目录公开为块设备的创造性方法,但并没有成功。
sci*_*rus 18
首先,创建所需大小的原始图像。我会假设10G就足够了。使用seek创建一个稀疏文件,从而节省空间。
dd if=/dev/null of=example.img bs=1M seek=10240
Run Code Online (Sandbox Code Playgroud)
接下来,在其上创建一个文件系统。
mkfs.ext4 -F example.img
Run Code Online (Sandbox Code Playgroud)
(请注意,您需要-F的选项mkfs.ext4对文件进行操作,而不是一个磁盘分区)
然后,安装它。
mkdir /mnt/example
mount -t ext4 -o loop example.img /mnt/example
Run Code Online (Sandbox Code Playgroud)
现在您可以将文件复制到 /mnt/example。完成后,卸载它,您可以使用 example.img 作为虚拟机中的驱动器。如果您愿意,可以使用 qemu-img 将其从原始图像转换为另一种格式,例如 qcow2e,但这不是必需的。
virt-make-fs来自 libguestfsqcow2示例
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
Run Code Online (Sandbox Code Playgroud)
请注意 howsudo不是必需的,除了安装和 Ubuntu 错误解决方法。
然后我验证了 QEMU 实际上可以读取它:
qemu-system-x86_64 -drive file=sysroot.ext2.qcow2,format=qcow2,if=virtio,snapshot ...
Run Code Online (Sandbox Code Playgroud)
然后我就可以在 QEMU Linux 中挂载映像并读取文件。
virt-make-fs 分机示例
这个很棒的工具还可以制作原始的 ext 文件系统,例如:
virt-make-fs --format=raw --type=ext2 sysroot sysroot.ext2
virt-make-fs --format=raw --type=ext4 sysroot sysroot.ext4
Run Code Online (Sandbox Code Playgroud)
我们可以直接在主机上验证:
mkdir -p mnt
dev="$(sudo losetup --show -f -P sysroot.ext4)"
sudo mount -o loop "$dev" mnt
cmp sysroot/myfile mnt/myfile
Run Code Online (Sandbox Code Playgroud)
图像尺寸最小化
一个非常好的功能virt-make-fs是,如果这是我们想要的,它会自动尝试最小化图像大小:
Virt-make-fs 默认最小化额外空间,但如果需要,您可以使用 --size 标志在文件系统中留出空间。
所以:
df -h
Run Code Online (Sandbox Code Playgroud)
告诉我图像已填充 82%:
/dev/loop17 1.5M 1.1M 244K 82% /home/ciro/test/guestfs/mnt
Run Code Online (Sandbox Code Playgroud)
我们可以轻松地在最小值之上添加一些额外的空间--size-=+:
virt-make-fs --format=raw --size=+8M --type=ext2 sysroot sysroot.ext2
Run Code Online (Sandbox Code Playgroud)
ext4 日志开销
该手册还提到:
请注意,ext3 文件系统包含一个日志,大小通常为 1-32 MB。如果您不打算以需要日志的方式使用文件系统,那么这只是浪费开销。
用以下方法验证这一点很有趣:
du -bs *
Run Code Online (Sandbox Code Playgroud)
它产生:
1052672 sysroot
1446297 sysroot.ext2
2599731 sysroot.ext4
Run Code Online (Sandbox Code Playgroud)
所以我们看到 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.
Run Code Online (Sandbox Code Playgroud)
之后,如果没有我们的解决方法,18.04(但不是 16.04)会失败:https ://bugzilla.redhat.com/show_bug.cgi?id = 1591617
libguestfs: error: tar_in: write error on directory: /:
Run Code Online (Sandbox Code Playgroud)
由于上游已经修复的错误。
在 Ubuntu 18.04、libguestfs-tools 1:1.36.13-1ubuntu3、QEMU 1:2.11+dfsg-1ubuntu7.3 中测试。