Пытаясь запустить клонированный диск из моего снимка ОС, я столкнулся с проблемой, что Libvirt не может видеть существующие изображения, клонированные из снимка. Создано через:
$ rbd -p vmdisks clone vmdisks/coreos_2023@base vmdisks/coreos00.disk
Базовый образ имеет один снимок «base» и защищен. Клонированный диск создается нормально:
$ 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 с пулом rbd, который использует пользователя с правами администратора ceph. Но я не вижу клонированный диск. Просто родитель:
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
К сожалению, я бы сказал, что это не очень эффективный способ создания клонов.
В конце концов, это была ошибка 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