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-pool
、client.libvirt
和 new-libvirt-image
作为存储池名称、用户名和映像名称。您可以根据个人喜好使用任何值,但在执行后续过程中的命令时,请务必替换这些值。
要将 Ceph 配置为与 libvirt
搭配使用,请执行以下步骤:
创建存储池。下面的示例使用存储池名称 libvirt-pool
和 128 个归置组。
ceph osd pool create libvirt-pool 128 128
校验该存储池是否存在。
ceph osd lspools
创建 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。
使用 QEMU 在 RBD 池中创建映像。下面的示例使用映像名称 new-libvirt-image
并引用 libvirt-pool
。
确保在
中指定“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
虽然您可以单独使用 libvirt
,而不借助 VM 管理器,但您可能会发现,使用 virt-manager
创建第一个域会更简单。
安装虚拟机管理器。
sudo zypper in virt-manager
准备/下载要运行虚拟化的系统的 OS 映像。
起动虚拟机管理器。
virt-manager
要使用 virt-manager
创建 VM,请执行以下步骤:
从列表中选择连接,右键点击该连接,然后选择
。
通过提供现有存储的路径来libvirt-virtual-machine
。
完成配置并启动 VM。
使用 sudo virsh list
校验新建的域是否存在。如果需要,请指定连接字符串,例如
virsh -c qemu+ssh://root@vm_host_hostname/system list
Id Name State
-----------------------------------------------
[...]
9 libvirt-virtual-machine running
在将 VM 配置为与 Ceph 搭配使用前,登录 VM 并将其停止。
本章重点介绍如何使用 virsh
配置 VM,以与 Ceph 集成。virsh
命令通常需要 root 特权 (sudo
),它不会返回相应的结果,也不会告知您需要 root 特权。有关 virsh
命令的参考,请参见 Virsh 命令参考。
使用 virsh edit
vm-domain-name 打开配置文件。
sudo virsh edit libvirt-virtual-machine
<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 可能没有正常工作。
将之前创建的 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> 元素及其子元素和属性的详细信息,请参见磁盘。
保存文件。
如果 Ceph 集群已启用身份验证(默认会启用),则您必须生成机密。打开所选的编辑器,并创建包含以下内容的 secret.xml
文件:
<secret ephemeral='no' private='no'> <usage type='ceph'> <name>client.libvirt secret</name> </usage> </secret>
定义机密。
sudo virsh secret-define --file secret.xml <uuid of secret is output here>
获取 client.libvirt
密钥,并将密钥字符串保存到某个文件中。
ceph auth get-key client.libvirt | sudo tee client.libvirt.key
设置机密的 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。
配置要与 Ceph 搭配使用的 VM 之后,便可启动该 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'
检查 /dev
或 /proc/partitions
下是否存在 &target dev='hdb' bus='ide'/>
中的设备:
ls /dev cat /proc/partitions