题 将目录转换为QEMU / KVM虚拟磁盘映像


我在/ var / backups / disk1上有一个目录,我想将其转换为虚拟磁盘映像,然后我可以使用QEMU或KVM启动(该目录包含虚拟机的文件系统,已复制通过rsync)。

虽然有很多说明可以将完整的物理磁盘转换为虚拟磁盘,但只将单个目录的内容打包成虚拟磁盘映像会比我预期的要困难得多。有任何想法吗?

顺便说一句,我知道我可以使用qemu-img将块设备转换为虚拟磁盘(例如,“qemu-img convert -f / dev / sdc -O qcow2 disk.qcow2”),所以如果我能得到的话目录/ var / backups / disk1似乎是一个块设备,然后理论上我应该能够使用qemu-img实现我的目标。我已经考虑过使用NBD或环回设备将目录公开为块设备的创造性方法,但是并没有取得成功。


8
2018-03-13 11:38






答案:


首先,创建所需大小的原始图像。我假设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用作虚拟机中的驱动器。如果你想要你可以使用qemu-img将它从原始图像转换为另一种格式,如qcow2e,但这不是必需的。


15
2018-03-16 03:43



qemu-img 和 fallocate 比一个稍微方便一点 dd。 - Ciro Santilli 新疆改造中心 六四事件 法轮功
如何计算所需的最小尺寸: unix.stackexchange.com/questions/353156/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


似乎libguestfs可以做到,请参阅 VIRT-MAKE-FS(1) 有可能 VIRT - 复制 - (1)中


4
2017-11-17 20:15





在Fedora 23中使用Michaels策略:

# dnf install -y libguestfs-tools-c
# virt-make-fs --format=raw --label mylabel the_directory myfs.raw

这将创建ext2文件系统,您可以将其挂载到某个目录:

# mount file.fs /mnt 

现在/ mnt包含所有文件


1
2017-11-09 13:56



如果 file.fs 是一个文件,不应该 mount 命令是: mount -o loop file.fs /mnt? - kasperd


如何从也安装到目标虚拟磁盘映像的VM访问目录作为网络共享?您不仅可以执行从共享到装入磁盘映像的简单复制。


0
2018-03-13 18:17



这应该有效,并且类似于我目前的策略,即构建VM并对数据进行rsync。但是,如果有更快更清洁的解决方案,那将会很棒。将数据复制到新机器变得相当混乱,因为您必须担心确保排除某些不应复制的文件,例如fstab和/ boot中的大多数内容 - Chris
“排除某些不应复制的文件,如fstab和/ boot中的大多数内容” - 当VM目标是一个额外的卷时,可能不会出现太多问题。 - user48838


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 bug变通方法之外,不是必需的。

然后我验证了QEMU实际上可以读取它:

qemu-system-x86_64 -drive file=sysroot.ext2.qcow2,format=qcow2,if=virtio,snapshot ...

然后我可以将图像挂载到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

我们可以直接在主机上验证:

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 MB。如果您不打算以需要日志的方式使用文件系统,那么这只是浪费的开销。

并通过以下方式验证:

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。


0
2018-06-14 15:32