9

qcow2 格式支持写时复制。关于 qcow2 的详细信息在这里。libvirt 是否支持使用写时复制克隆 qcow2 VM 映像。我没有找到关于:

虚拟克隆

4

3 回答 3

23

至少从 RHEL 7 附带的 libvirt 开始不,virt-manager GUI 和 virsh 命令行工具都没有执行您使用 qcow2 寻求的写时复制魔法。他们会将备份文件复制到一个新的、完全独立的、大小和内容相同的备份文件中。

你可以做的是:

qemu-img create -f qcow2 -o backing_file=master.qcow2 clone.qcow2

然后在 virt-manager 中创建一个新的虚拟机,导入clone.qcow2作为它的备份文件。一旦您以您想要的方式拥有主映像,这在保留有限的存储空间以及非常快速地配置新 VM 方面非常有效。

警告:一旦您拥有将主映像用作写时复制后备存储的克隆,则必须将主映像视为只读。如果您启动 VM 并更改主映像,您将损坏所有引用它的克隆。如果您想进行更改,您要做的是将主映像克隆到一个新的独立映像(为了讨论,将其称为new-master.qcow2),然后将您的克隆重新指向新映像:

qemu-img rebase -f qcow2 -b new-master.qcow2 clone.qcow2

qemu-img会将master.qcow2new-master.qcow2之间的差异复制到clone.qcow2中,之后您可以安全地删除master.qcow2一旦所有写时复制克隆都已更新。

于 2014-11-14T20:42:56.220 回答
4

virt-clone现在有了--reflink它的帮助下实现了类似的东西cp --reflink。这需要文件系统中的写时复制支持,但也可以通过 libvirt 的支持链概念来实现。但是,当格式为 qcow2 时,使用 --reflink 对 libvirt 中的磁盘映像进行卷克隆尚未以任何方式实现,即使它适用于存储在 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 创建的方式相同。

于 2017-01-31T21:41:01.260 回答
-2

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

如果你的虚拟机有一个 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

减小导出的磁盘映像大小

于 2012-10-17T07:36:47.257 回答