Libvirt
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 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 中