Под капотом · Виртуализация · Хранилища
Диск в Ceph RBD
Пользователь подключает к ВМ диск, который лежит в кластере Ceph, а не в локальном файле. Для этого он вводит несколько команд:
virsh secret-define --file secret.xml
virsh secret-set-value --secret 2ec115d7-3a88-3ceb-bc12-0ac909a6fd87 \
--base64 $(cat client.libvirt.key)
virsh attach-device vm1 disk-ceph.xml --config
После выполнения команд диск записан в определение ВМ, а на хосте нет ни файла образа, ни /dev/rbd: образ живёт в кластере.
- Команда secret-define заводит в libvirt место для ключа cephx;
- Команда secret-set-value кладёт туда сам ключ, и QEMU получает его от libvirt;
- Команда attach-device добавляет в XML диск type='network' с protocol='rbd';
- При старте QEMU соединяется с мониторами и отдаёт гостю /dev/vdb.
-
пользователь 1. Пользователь готовит ключ и XML диска
ceph auth get-key client.libvirt <secret ephemeral='no' private='no'> <usage type='ceph'><name>client.libvirt secret</name></usage> </secret>
Ключ cephx не хранят в XML домена открытым текстом - там остаётся только ссылка на секрет. Ключ из ceph auth get-key уже в base64, поэтому secret-set-value вызывают с --base64: libvirt декодирует значение и хранит его как есть.
-
libvirt 2. Демон сохраняет ключ cephx
virsh secret-define --file secret.xml ← Secret 2ec115d7-3a88-3ceb-bc12-0ac909a6fd87 created
Секрет - отдельный объект libvirt: его можно выдать другой ВМ, не копируя ключ в её XML.
-
libvirt 3. Демон добавляет сетевой диск в определение
<disk type='network' device='disk'> <source protocol='rbd' name='libvirt-pool/vm1'> <host name='mon1.example.com' port='6789'/> </source> <auth username='libvirt'> <secret type='ceph' uuid='2ec115d7-…'/> </auth> <target dev='vdb' bus='virtio'/> </disk>В username указывают ID пользователя Ceph (libvirt), а не полное имя client.libvirt.
-
QEMU 4. QEMU открывает образ через librbd
-drive file=rbd:libvirt-pool/vm1:conf=/etc/ceph/ceph.conf,format=raw
Блочное устройство собирает библиотека librbd внутри процесса QEMU - отдельного /dev/rbdN на хосте не появляется.
-
сеть 5. QEMU идёт к мониторам кластера
mon1:6789, mon2:6789, mon3:6789 ключ cephx -> из секрета libvirt
Адреса мониторов берутся из <host> в XML; если мониторы недоступны, диск не откроется даже при целом образе.
-
диск / RAM 6. Кластер отдаёт блоки
OSD -> placement group -> объекты по 4 МиБ
Для QEMU это обычное блочное устройство: ни файловой системы, ни локального кэша у него нет.
-
гость 7. В госте появляется второй диск
dmesg | grep vdb [vdb] 200 GiB
Гость видит virtio-блок; ни Ceph, ни сеть хранилища ему не видны и не нужны.