Libvirt

Libvirt 池無法查看或創建 rbd 複製

  • June 4, 2019

在嘗試從我的作業系統快照執行複製磁碟時,我遇到了 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 admin 使用者的 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 管理員使用者,這使得 Operation not allowed 有點奇怪。

我是否在這裡缺少允許池使用複製的配置選項?到目前為止,我在文件中找不到任何關於此的資訊。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

可悲的是,這不是創建我要說的複製的非常有效的方法。

這最終是 libvirt 的一個錯誤。Michal Privoznik提供的一個簡單修復 解決了這個問題。

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 中

引用自:https://serverfault.com/questions/964586