注意

本文档适用于 Ceph 的开发版本。

使用 libvirt 与 Ceph RBD

libvirt 库在管理程序接口和使用它们的软件应用程序之间创建了一个虚拟机抽象层。通过 libvirt,开发人员和系统管理员可以专注于一个通用的管理框架、通用的 API 和通用的 shell 接口(即 virsh),用于许多不同的管理程序,包括

  • QEMU/KVM

  • XEN

  • LXC

  • VirtualBox

  • 等等。

Ceph 块设备支持 QEMU/KVM。您可以将 Ceph 块设备与通过 libvirt 接口的软件一起使用。下面的堆栈图说明了 libvirt 和 QEMU 如何通过 librbd 使用 Ceph 块设备。

最常见的 libvirt 用例涉及向 OpenStack、OpenNebula 或 CloudStack 等云解决方案提供 Ceph 块设备。云解决方案使用 libvirt 与 QEMU/KVM 交互,而 QEMU/KVM 通过 librbd 与 Ceph 块设备交互。有关详细信息,请参阅 块设备和 OpenStack块设备和 OpenNebula 以及 块设备和 CloudStack。有关安装详细信息,请参阅 安装 Ceph

您还可以将 Ceph 块设备与 libvirtvirshlibvirt API 一起使用。有关详细信息,请参阅 libvirt 虚拟化 API

要创建使用 Ceph 块设备的 VM,请使用以下各节中的过程。在本示例中,我们使用 libvirt-pool 作为池名称,client.libvirt 作为用户名,new-libvirt-image 作为镜像名称。您可以使用任何您喜欢的值,但在执行后续过程中的命令时,请确保替换这些值。

配置 Ceph

要配置 Ceph 以与 libvirt 一起使用,请执行以下步骤

  1. 创建池。以下示例使用池名称 libvirt-pool

    ceph osd pool create libvirt-pool
    

    验证池是否存在。

    ceph osd lspools
    
  2. 使用 rbd 工具初始化池供 RBD 使用

    rbd pool init <pool-name>
    
  3. 创建 Ceph 用户(对于 0.9.7 及更早版本,请使用 client.admin)。以下示例使用 Ceph 用户名 client.libvirt 并引用 libvirt-pool

    ceph auth get-or-create client.libvirt mon 'profile rbd' osd 'profile rbd pool=libvirt-pool'
    

    验证名称是否存在。

    ceph auth ls
    

    注意libvirt 将使用 ID libvirt 访问 Ceph,而不是 Ceph 名称 client.libvirt。有关 ID 和名称之间区别的详细说明,请参阅 用户管理 - 用户用户管理 - CLI

  4. 使用 QEMU 在 RBD 池中创建镜像。以下示例使用镜像名称 new-libvirt-image 并引用 libvirt-pool

    qemu-img create -f rbd rbd:libvirt-pool/new-libvirt-image 2G
    

    验证镜像是否存在。

    rbd -p libvirt-pool ls
    

    注意: 您也可以使用 rbd create 创建镜像,但我们建议确保 QEMU 正常工作。

提示

可选地,如果您希望为此客户端启用调试日志和 admin socket,您可以将以下部分添加到 /etc/ceph/ceph.conf

[client.libvirt]
log file = /var/log/ceph/qemu-guest-$pid.log
admin socket = /var/run/ceph/$cluster-$type.$id.$pid.$cctid.asok

client.libvirt 部分名称应与您在上面创建的 cephx 用户匹配。如果启用了 SELinux 或 AppArmor,请注意这可能会阻止客户端进程(通过 libvirt 的 qemu)执行某些操作,例如写入日志或对目标位置(/var/ log/ceph/var/run/ceph)操作镜像或 admin socket。此外,请确保 libvirt 和 qemu 用户对指定的目录具有适当的访问权限。

准备 VM 管理器

您可以在没有 VM 管理器的情况下使用 libvirt,但您可能会发现使用 virt-manager 创建第一个域更简单。

  1. 安装虚拟机管理器。有关详细信息,请参阅 KVM/VirtManager

    sudo apt-get install virt-manager
    
  2. 下载操作系统镜像(如果需要)。

  3. 启动虚拟机管理器。

    sudo virt-manager
    

创建 VM

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

  1. 创建新虚拟机 按钮。

  2. 命名新的虚拟机域。在本示例中,我们使用名称 libvirt-virtual-machine。您可以使用任何您喜欢的名称,但在后续的命令行和配置示例中,请确保将 libvirt-virtual-machine 替换为您选择的名称。

    libvirt-virtual-machine
    
  3. 导入镜像。

    /path/to/image/recent-linux.img
    

    注意: 导入最近的镜像。一些较旧的镜像可能无法正确重新扫描虚拟设备。

  4. 配置并启动 VM。

  5. 您可以使用 virsh list 来验证 VM 域是否存在。

    sudo virsh list
    
  6. 登录到 VM (root/root)

  7. 在配置 VM 以使用 Ceph 之前停止它。

配置 VM

在配置 VM 以使用 Ceph 时,在适当的情况下使用 virsh 非常重要。此外,virsh 命令通常需要 root 权限(即 sudo),并且不会返回适当的结果或通知您需要 root 权限。有关 virsh 命令的参考,请参阅 Virsh 命令参考

  1. 使用 virsh edit 打开配置文件。

    sudo virsh edit {vm-domain-name}
    

    <devices> 下应该有一个 <disk> 条目。

    <devices>
            <emulator>/usr/bin/kvm</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 镜像的路径。使用更快的 virtio 总线的最低内核版本是 2.6.25。有关详细信息,请参阅 Virtio

    重要提示: 使用 sudo virsh edit 而不是文本编辑器。如果您使用文本编辑器编辑 /etc/libvirt/qemu 下的配置文件,libvirt 可能无法识别更改。如果 /etc/libvirt/qemu 下的 XML 文件内容与 sudo virsh dumpxml {vm-domain-name} 的结果之间存在差异,则您的 VM 可能无法正常工作。

  2. 添加您创建的 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='vdb' bus='virtio'/>
    </disk>
    

    {monitor-host} 替换为主机名,并根据需要替换池和/或镜像名称。您可以为 Ceph monitor 添加多个 <host> 条目。 dev 属性是在 VM 的 /dev 目录下显示的逻辑设备名称。可选的 bus 属性指示要模拟的磁盘设备类型。有效设置为驱动程序特定的(例如,“ide”、“scsi”、“virtio”、“xen”、“usb”或“sata”)。

    有关 <disk> 元素及其子元素和属性的详细信息,请参阅 磁盘

  3. 保存文件。

  4. 如果您的 Ceph 存储集群启用了 CephX 配置参考(默认情况下启用),您必须生成一个 secret。

    cat > secret.xml <<EOF
    <secret ephemeral='no' private='no'>
            <usage type='ceph'>
                    <name>client.libvirt secret</name>
            </usage>
    </secret>
    EOF
    
  5. 定义 secret。

    sudo virsh secret-define --file secret.xml
    {uuid of secret}
    
  6. 获取 client.libvirt 密钥并将密钥字符串保存到文件中。

    ceph auth get-key client.libvirt | sudo tee client.libvirt.key
    
  7. 设置 secret 的 UUID。

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

    您还必须通过将以下 <auth> 条目添加到您前面输入的 <disk> 元素中来手动设置 secret(将 uuid 值替换为上面命令行示例的结果)。

    sudo virsh edit {vm-domain-name}
    

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

    ...
    </source>
    <auth username='libvirt'>
            <secret type='ceph' uuid='{uuid of secret}'/>
    </auth>
    <target ...
    

    注意: 示例 ID 是 libvirt,而不是在 配置 Ceph 的第 2 步中生成的 Ceph 名称 client.libvirt。确保您使用生成的 Ceph 名称的 ID 部分。如果由于某种原因需要重新生成 secret,则必须在再次执行 sudo virsh secret-set-value 之前执行 sudo virsh secret-undefine {uuid}

总结

配置 VM 以使用 Ceph 后,您可以启动 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. 检查 <target dev='vdb' bus='virtio'/> 中的设备是否存在

    virsh domblklist {vm-domain-name} --details
    

如果一切正常,您可以开始在 VM 中使用 Ceph 块设备。

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入