【发布时间】:2012-09-12 10:42:59
【问题描述】:
qcow2支持copy-on-write的格式。关于qcow2的详细信息是here。 libvirt 是否支持使用写时复制克隆 qcow2 VM 映像。 我没有找到关于:
虚拟克隆
【问题讨论】:
qcow2支持copy-on-write的格式。关于qcow2的详细信息是here。 libvirt 是否支持使用写时复制克隆 qcow2 VM 映像。 我没有找到关于:
虚拟克隆
【问题讨论】:
至少从 RHEL 7 附带的 libvirt 开始,否,virt-manager GUI 和 virsh 命令行工具都不会进行复制操作用 qcow2 写出你想要的魔法。他们会将备份文件复制到一个新的、完全独立的、大小和内容相同的备份文件中。
你可以做的是:
qemu-img create -f qcow2 -o backing_file=master.qcow2 clone.qcow2
然后在 virt-manager 中创建一个新的虚拟机,导入 clone.qcow2 作为其备份文件。一旦您拥有所需的主映像,这在保留有限的存储空间以及非常快速地配置新虚拟机方面非常有效。
CAVEAT:主映像必须在您拥有将其用于写时复制后备存储的克隆后被视为只读。如果您启动 VM 并更改主映像,您将损坏所有引用它的克隆。如果您想进行更改,您所做的是将主映像克隆到一个新的独立映像(为了讨论,将其称为 new-master.qcow2),然后重新指向您在新图像上的克隆:
qemu-img rebase -f qcow2 -b new-master.qcow2 clone.qcow2
qemu-img 会将 master.qcow2 和 new-master.qcow2 之间的差异复制到 clone.qcow2 em>,之后您可以在所有写时复制克隆都更新后安全地删除 master.qcow2。
【讨论】:
virt-clone 现在有了--reflink,它在cp --reflink 的帮助下实现了类似的功能。这需要文件系统中的写时复制支持,但也可以通过 libvirt 的支持链概念来实现。但是volume cloning with --reflink for disk images in libvirt is not yet implemented in either way when the format is qcow2 即使它适用于存储在 btrfs 中的原始图像。
# virt-clone --reflink --auto-clone --original test
ERROR Couldn't create storage volume 'test-clone.qcow2': 'unsupported flags (0x2) in function virStorageBackendCreateQemuImg'`
# virsh
virsh # vol-clone --pool testpool test.qcow2 test-clone.qcow2 --reflink
error: Failed to clone vol from test.qcow2
error: unsupported flags (0x2) in function virStorageBackendCreateQemuImg
但是 libvirt 的后备链概念(或后备存储)与 qcow2 一起使用:
virsh # vol-create-as testpool test-clone.qcow2 20G --backing-vol-format qcow2 --format qcow2 --backing-vol test.qcow2
virsh # vol-dumpxml --pool testpool test-clone.qcow2
...
<backingStore>
<path>/testpool/test.qcow2</path>
<format type='qcow2'/>
...
virsh # domstats --backing testvm
block.0.name=vda
block.0.path=/testpool/test-clone.qcow2
...
block.1.name=vda
block.1.path=/testpool/test.qcow2
block.1.backingIndex=1
这也适用于通过指定后备存储映像使用 virt-manager 创建新卷。
这样一个使用 qemu-imq 独立于 libvirt 创建的克隆:
qemu-img create -f qcow2 -o backing_file=test.qcow2 test-clone.qcow2
然后在 libvirt 中使用的表示方式与上面使用 virsh vol-create-as 创建时相同。
【讨论】:
virt-clone 会将您的磁盘映像克隆为与原始文件格式相同的文件格式。
如果您的原始磁盘是 LVM 分区,那么您必须克隆到磁盘原始格式映像,因为 lvm 分区是原始设备
例如:
# virt-clone -d -o winxp -n winxpclone -f winxpclone.img
# qemu-img info winxpclone.img
image: winxpclone.img
file format: raw
virtual size: 5.0G (5368709120 bytes)
disk size: 3.1G
您可以将克隆的磁盘映像转换为 qcow2:
# qemu-img convert -f raw winxpclone.img -O qcow2 winxpclone.qcow2
# qemu-img info !$
qemu-img info winxpclone.qcow2
image: winxpclone.qcow2
file format: qcow2
virtual size: 5.0G (5368709120 bytes)
disk size: 3.1G
cluster_size: 65536
如果您的 VM 有 qcow2 文件格式的磁盘映像,那么 virt-clone 会将您的磁盘映像克隆为 qcow2 文件格式
# virt-clone -d -o winxpclone -n winxpcloneclone -f winxpcloneclone.img
# qemu-img info winxpcloneclone.img
image: winxpcloneclone.img
file format: qcow2
virtual size: 5.0G (5368709120 bytes)
disk size: 3.1G
cluster_size: 65536
继续:
virt-clone 将与原始磁盘保持相同的文件格式。
一个好的解决方案是使用 virt-sparsify
http://libguestfs.org/virt-sparsify.1.html
减小导出的磁盘映像大小
【讨论】: