【问题标题】:Does libvirt support clone qcow2 with copy on writelibvirt 是否支持写入时复制的克隆 qcow2
【发布时间】:2012-09-12 10:42:59
【问题描述】:

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

虚拟克隆

【问题讨论】:

    标签: qemu kvm libvirt


    【解决方案1】:

    至少从 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.qcow2new-master.qcow2 之间的差异复制到 clone.qcow2 em>,之后您可以在所有写时复制克隆都更新后安全地删除 master.qcow2

    【讨论】:

    • 在我的情况下,我还必须使用 -F 选项将支持文件格式指定为 qcow2。否则,当我尝试在 virt-manager 中创建 VM 时,我会收到错误“未在映像元数据中指定支持映像的格式”。
    【解决方案2】:

    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 创建时相同。

    【讨论】:

      【解决方案3】:

      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

      减小导出的磁盘映像大小

      【讨论】:

      • OP 要求写时复制,您的示例都没有解决
      • 更不用说,LVM 也支持写时复制快照,因此使用 QCOW2 或 LVM 克隆 VM 可以支持快速写时复制快照是有意义的。
      猜你喜欢
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多