Libvirt 池无法查看或创建 rbd 克隆

Libvirt 池无法查看或创建 rbd 克隆

当我尝试从我的操作系统快照运行克隆磁盘时,我遇到了 Libvirt 无法看到从快照克隆的现有映像的问题。创建方式:

$ rbd -p vmdisks clone vmdisks/coreos_2023@base vmdisks/coreos00.disk

基础映像具有一个快照“基础”,并且受到保护。克隆磁盘创建得很好:

$ rbd -p vmdisks info coreos00.disk
rbd image 'coreos00.disk':
        size 8.49GiB in 2174 objects
        order 22 (4MiB objects)
        block_name_prefix: rbd_data.48a99c6b8b4567
        format: 2
        features: layering
        flags: 
        create_timestamp: Thu Apr 25 14:46:52 2019
        parent: vmdisks/coreos_2023@base
        overlap: 8.49GiB

我暂时为 Libvirt 配置了一个使用 ceph 管理员用户的 rbd 池。但我看不到克隆的磁盘。只有父级:

virsh # vol-list --pool rbd_image_root
 Name                 Path                                    
------------------------------------------------------------------------------
 coreos_2023 vmdisks/coreos_2023     

如果我尝试从 virsh 内部创建克隆图像,我会遇到以下问题:

virsh # vol-clone --pool rbd_image_root coreos_2023 coreos00.disk
error: Failed to clone vol from coreos_2023
error: failed to iterate RBD snapshot coreos_2023@base: Operation not permitted

请注意,该池使用 Ceph 管理员用户,这使得不允许操作有点奇怪。

我是否遗漏了允许池使用克隆的配置选项?到目前为止,我在文档中找不到有关此内容的任何信息。而且 libvirt 的源代码看起来应该支持这两个功能。

版本:

Libvirt Machine: Ubuntu 18.04
Compiled against library: libvirt 4.0.0
Using library: libvirt 4.0.0
Using API: QEMU 4.0.0
Running hypervisor: QEMU 2.11.1

Ceph Machine: openSUSE Leap 42.3
Ceph 12.2.5

更新

当我创建这样的卷时:

<volume>
   <name>coreos00.disk</name>
   <capacity unit="bytes">9116319744</capacity>
   <target>
       <format type="raw"></format>
       <permissions>
           <mode>644</mode>
       </permissions>
   </target>
   <backingStore>
       <path>vmdisks/coreos_2023</path>
       <format type="raw"></format>
   </backingStore>
</volume>

这似乎也不适用于后备存储,因为它会创建一个没有底层父级的空卷。但是,当我现在通过 rbd 删除该卷并创建一个新的克隆时,它会显示在 libvirt 中,并且可以由机器使用。

$ rbd -p vmdisks rm coreos00.disk
$ rbd clone vmdisks/coreos_2023@basis vmdisks/coreos00.disk

遗憾的是,我认为这不是一种创建克隆的非常有效的方法。

答案1

最终这是 libvirt 的一个错误。米哈尔·普里沃兹尼克 解决了问题。

diff --git i/src/storage/storage_backend_rbd.c w/src/storage/storage_backend_rbd.c
index f8c968e682..08f8123678 100644
--- i/src/storage/storage_backend_rbd.c
+++ w/src/storage/storage_backend_rbd.c
@@ -1038,7 +1038,7 @@ virStorageBackendRBDIterateCb(uint64_t offset ATTRIBUTE_UNUSED,
      * searching any further.
      */
     *(int*) arg = 1;
-    return -1;
+    return 0;
 }

 static int

更新

官方补丁已更新并且应该包含在 libvirt 5.3.0 中

相关内容