注意
本文档适用于 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 块设备与 libvirt、virsh 和 libvirt API 一起使用。有关详细信息,请参阅 libvirt 虚拟化 API。
要创建使用 Ceph 块设备的 VM,请使用以下各节中的过程。在本示例中,我们使用 libvirt-pool 作为池名称,client.libvirt 作为用户名,new-libvirt-image 作为镜像名称。您可以使用任何您喜欢的值,但在执行后续过程中的命令时,请确保替换这些值。
配置 Ceph
要配置 Ceph 以与 libvirt 一起使用,请执行以下步骤
创建池。以下示例使用池名称
libvirt-pool。ceph osd pool create libvirt-pool
验证池是否存在。
ceph osd lspools
使用
rbd工具初始化池供 RBD 使用rbd pool init <pool-name>
创建 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将使用 IDlibvirt访问 Ceph,而不是 Ceph 名称client.libvirt。有关 ID 和名称之间区别的详细说明,请参阅 用户管理 - 用户 和 用户管理 - CLI。使用 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 创建第一个域更简单。
安装虚拟机管理器。有关详细信息,请参阅 KVM/VirtManager。
sudo apt-get install virt-manager
下载操作系统镜像(如果需要)。
启动虚拟机管理器。
sudo virt-manager
创建 VM
要使用 virt-manager 创建 VM,请执行以下步骤
按 创建新虚拟机 按钮。
命名新的虚拟机域。在本示例中,我们使用名称
libvirt-virtual-machine。您可以使用任何您喜欢的名称,但在后续的命令行和配置示例中,请确保将libvirt-virtual-machine替换为您选择的名称。libvirt-virtual-machine
导入镜像。
/path/to/image/recent-linux.img
注意: 导入最近的镜像。一些较旧的镜像可能无法正确重新扫描虚拟设备。
配置并启动 VM。
您可以使用
virsh list来验证 VM 域是否存在。sudo virsh list
登录到 VM (root/root)
在配置 VM 以使用 Ceph 之前停止它。
配置 VM
在配置 VM 以使用 Ceph 时,在适当的情况下使用 virsh 非常重要。此外,virsh 命令通常需要 root 权限(即 sudo),并且不会返回适当的结果或通知您需要 root 权限。有关 virsh 命令的参考,请参阅 Virsh 命令参考。
使用
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 可能无法正常工作。添加您创建的 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>元素及其子元素和属性的详细信息,请参阅 磁盘。保存文件。
如果您的 Ceph 存储集群启用了 CephX 配置参考(默认情况下启用),您必须生成一个 secret。
cat > secret.xml <<EOF <secret ephemeral='no' private='no'> <usage type='ceph'> <name>client.libvirt secret</name> </usage> </secret> EOF
定义 secret。
sudo virsh secret-define --file secret.xml {uuid of secret}
获取
client.libvirt密钥并将密钥字符串保存到文件中。ceph auth get-key client.libvirt | sudo tee client.libvirt.key
设置 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 是否正在通信,您可以执行以下过程。
检查 Ceph 是否正在运行
ceph health
检查 VM 是否正在运行。
sudo virsh list
检查 VM 是否正在与 Ceph 通信。将
{vm-domain-name}替换为您的 VM 域名称sudo virsh qemu-monitor-command --hmp {vm-domain-name} 'info block'
检查
<target dev='vdb' bus='virtio'/>中的设备是否存在virsh domblklist {vm-domain-name} --details
如果一切正常,您可以开始在 VM 中使用 Ceph 块设备。