Под капотом · Виртуализация · Хранилища

Диск в 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
libvirt API virSecretSetValue(), virDomainAttachDeviceFlags()

После выполнения команд диск записан в определение ВМ, а на хосте нет ни файла образа, ни /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, ни сеть хранилища ему не видны и не нужны.