将目录转换为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或回送设备将目录公开为块设备的创新方法,但是没有成功。

Answers:


16

首先,创建所需大小的原始图像。我认为10G就足够了。使用seek创建一个稀疏文件,从而节省空间。

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等其他格式,但这不是必需的。


1
qemu-img并且fallocatedd
Ciro Santilli冠状病毒审查六四事件法轮功



4

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文件系统,例如:

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.31.36.13-1ubuntu3,QEMU 1:2.11 + dfsg-1ubuntu7.3中进行了测试。


1

在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包含所有文件


如果file.fs是文件,则mount命令不应为:mount -o loop file.fs /mnt吗?
kasperd 2015年

0

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


这应该行得通,并且与我当前的策略类似,即构建VM并重新同步数据。但是,如果有一个更快,更干净的解决方案,那就太好了。将数据复制到新机器上变得非常混乱,因为您必须担心要确保排除某些不应复制的文件,例如fstab和/ boot中的大多数内容
Chris

“排除不应该复制的某些文件,例如fstab和/ boot中的大多数内容”-当VM目标是附加卷时,这可能不是什么大问题。
user48838 2011年

0

我更喜欢(并使用)Ciro Santilli的答案,但这是一些可用于guestfishshell 的东西:

# 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.