适用于 SUSE Enterprise Storage 5

16 libvirt 与 Ceph 搭配使用

libvirt 库在超级管理程序接口与使用这些接口的软件应用之间建立了一个虚拟机抽象层。使用 libvirt,开发人员和系统管理员可将工作重心放在通用管理框架、通用 API、通用外壳接口 (virsh) 以及诸多不同的超级管理程序(包括 QEMU/KVM、Xen、LXC 或 VirtualBox)上。

Ceph 块设备支持 QEMU/KVM。您可以通过与 libvirt 连接的软件来使用 Ceph 块设备。云解决方案使用 libvirt 来与 QEMU/KVM 交互,而 QEMU/KVM 通过 librbd 来与 Ceph 块设备交互。

要创建使用 Ceph 块设备的 VM,请按以下各节中所述的过程操作。在示例中,我们分别使用了 libvirt-poolclient.libvirtnew-libvirt-image 作为存储池名称、用户名和映像名称。您可以根据个人喜好使用任何值,但在执行后续过程中的命令时,请务必替换这些值。

16.1 配置 Ceph

要将 Ceph 配置为与 libvirt 搭配使用,请执行以下步骤:

  1. 创建存储池。下面的示例使用存储池名称 libvirt-pool 和 128 个归置组。

    ceph osd pool create libvirt-pool 128 128

    校验该存储池是否存在。

    ceph osd lspools
  2. 创建 Ceph 用户。下面的示例使用 Ceph 用户名 client.libvirt 并引用 libvirt-pool

    ceph auth get-or-create client.libvirt mon 'allow r' osd \
     'allow class-read object_prefix rbd_children, allow rwx pool=libvirt-pool'

    校验该名称是否存在。

    ceph auth list
    注意
    注意

    libvirt 将使用 ID libvirt,而不是 Ceph 名称 client.libvirt 来访问 Ceph。有关 ID 与名称之间的差别的详细说明,请参见 http://docs.ceph.com/docs/master/rados/operations/user-management/#user

  3. 使用 QEMU 在 RBD 池中创建映像。下面的示例使用映像名称 new-libvirt-image 并引用 libvirt-pool

    提示
    提示:密钥环文件位置

    确保在 /etc/ceph/ceph.conf 中指定“libvirt”用户密钥环路径,例如:

    keyring = /etc/ceph/client.libvirt.keyring

    如果该密钥环不存在,请使用以下命令创建它:

    root # ceph auth get client.libvirt > /etc/ceph/client.libvirt.keyring
    qemu-img create -f raw rbd:libvirt-pool/new-libvirt-image:id=libvirt 2G

    校验该映像是否存在。

    rbd -p libvirt-pool ls

16.2 准备 VM 管理器

虽然您可以单独使用 libvirt,而不借助 VM 管理器,但您可能会发现,使用 virt-manager 创建第一个域会更简单。

  1. 安装虚拟机管理器。

    sudo zypper in virt-manager
  2. 准备/下载要运行虚拟化的系统的 OS 映像。

  3. 起动虚拟机管理器。

    virt-manager

16.3 创建 VM

要使用 virt-manager 创建 VM,请执行以下步骤:

  1. 从列表中选择连接,右键点击该连接,然后选择新建

  2. 通过提供现有存储的路径来导入现有的磁盘映像。指定 OS 类型和内存设置,并给虚拟机命名,例如 libvirt-virtual-machine

  3. 完成配置并启动 VM。

  4. 使用 sudo virsh list 校验新建的域是否存在。如果需要,请指定连接字符串,例如

    virsh -c qemu+ssh://root@vm_host_hostname/system list
    Id    Name                           State
    -----------------------------------------------
    [...]
     9     libvirt-virtual-machine       running
  5. 在将 VM 配置为与 Ceph 搭配使用前,登录 VM 并将其停止。

16.4 配置 VM

本章重点介绍如何使用 virsh 配置 VM,以与 Ceph 集成。virsh 命令通常需要 root 特权 (sudo),它不会返回相应的结果,也不会告知您需要 root 特权。有关 virsh 命令的参考,请参见 Virsh 命令参考

  1. 使用 virsh edit vm-domain-name 打开配置文件。

    sudo virsh edit libvirt-virtual-machine
  2. <devices> 下面应有一个 <disk> 项。

    <devices>
        <emulator>/usr/bin/qemu-system-x86_64</emulator>
        <disk type='file' device='disk'>
          <driver name='qemu' type='raw'/>
          <source file='/path/to/image/recent-linux.img'/>
          <target dev='vda' bus='virtio'/>
          <address type='drive' controller='0' bus='0' unit='0'/>
        </disk>

    /path/to/image/recent-linux.img 替换为 OS 映像的路径。

    重要
    重要

    请使用 sudo virsh edit,不要使用文本编辑器。如果使用文本编辑器编辑 /etc/libvirt/qemu 下的配置文件,libvirt 可能无法识别更改。如果 /etc/libvirt/qemu 下的 XML 文件内容与 sudo virsh dumpxml vm-domain-name 返回的结果有差异,则表示 VM 可能没有正常工作。

  3. 将之前创建的 Ceph RBD 映像添加为 <disk> 项。

    <disk type='network' device='disk'>
            <source protocol='rbd' name='libvirt-pool/new-libvirt-image'>
                    <host name='monitor-host' port='6789'/>
            </source>
            <target dev='vda' bus='virtio'/>
    </disk>

    monitor-host 替换为主机的名称,并根据需要替换存储池名称和/或映像名称。可为 Ceph monitor 添加多个 <host> 项。dev 属性是逻辑设备名称,将显示在 VM 的 /dev 目录下。可选的 bus 属性表示要模拟的磁盘设备类型。有效的设置都特定于驱动程序(例如 ide、scsi、virtio、xen、usb 或 sata)。有关 <disk> 元素及其子元素和属性的详细信息,请参见磁盘

  4. 保存文件。

  5. 如果 Ceph 集群已启用身份验证(默认会启用),则您必须生成机密。打开所选的编辑器,并创建包含以下内容的 secret.xml 文件:

    <secret ephemeral='no' private='no'>
            <usage type='ceph'>
                    <name>client.libvirt secret</name>
            </usage>
    </secret>
  6. 定义机密。

    sudo virsh secret-define --file secret.xml
    <uuid of secret is output here>
  7. 获取 client.libvirt 密钥,并将密钥字符串保存到某个文件中。

    ceph auth get-key client.libvirt | sudo tee client.libvirt.key
  8. 设置机密的 UUID。

    sudo virsh secret-set-value --secret uuid of secret \
    --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml

    此外,必须通过将以下 <auth> 项添加到前面输入的 <disk> 元素(请将 uuid 值替换为上述命令行示例的结果),来手动设置机密。

    sudo virsh edit libvirt-virtual-machine

    然后,在域配置文件中添加 <auth></auth> 元素:

    ...
    </source>
    <auth username='libvirt'>
            <secret type='ceph' uuid='9ec59067-fdbc-a6c0-03ff-df165c0587b8'/>
    </auth>
    <target ...
    注意
    注意

    示例 ID 为 libvirt,而不是在第 16.1 节 “配置 Ceph”的步骤 2 中生成的 Ceph 名称 client.libvirt。请务必使用所生成的 Ceph 名称的 ID 组成部分。如果出于某种原因需要重新生成机密,则在再次执行 sudo virsh secret-set-value 之前,需要执行 sudo virsh secret-undefine uuid

16.5 总结

配置要与 Ceph 搭配使用的 VM 之后,便可启动该 VM。要校验 VM 与 Ceph 是否可相互通讯,可执行以下过程。

  1. 检查 Ceph 是否在运行:

    ceph health
  2. 检查 VM 是否在运行:

    sudo virsh list
  3. 检查 VM 是否在与 Ceph 通讯。将 vm-domain-name 替换为 VM 域的名称:

    sudo virsh qemu-monitor-command --hmp vm-domain-name 'info block'
  4. 检查 /dev/proc/partitions 下是否存在 &target dev='hdb' bus='ide'/> 中的设备:

    ls /dev
    cat /proc/partitions
打印此页