26 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
作为存储池名称、用户名和映像名称。您可以根据个人喜好使用任何值,但在执行后续过程中的命令时,请务必替换这些值。
26.1 配置 Ceph 与 libvirt
搭配使用 #
要将 Ceph 配置为与 libvirt
搭配使用,请执行以下步骤:
创建存储池。下面的示例使用存储池名称
libvirt-pool
和 128 个归置组。cephuser@adm >
ceph osd pool create libvirt-pool 128 128校验该存储池是否存在。
cephuser@adm >
ceph osd lspools创建 Ceph 用户。下面的示例使用 Ceph 用户名
client.libvirt
并引用libvirt-pool
。cephuser@adm >
ceph auth get-or-create client.libvirt mon 'profile rbd' osd \ 'profile rbd pool=libvirt-pool'校验该名称是否存在。
cephuser@adm >
ceph auth list注意:用户名或 IDlibvirt
将使用 IDlibvirt
,而不是 Ceph 名称client.libvirt
来访问 Ceph。有关 ID 与名称之间的差别的详细说明,请参见第 30.2.1.1 节 “用户”。使用 QEMU 在 RBD 池中创建映像。下面的示例使用映像名称
new-libvirt-image
并引用libvirt-pool
。提示:密钥环文件位置libvirt
用户密钥存储在/etc/ceph
目录下的密钥环文件中。需要为密钥环文件指定适当的名称,其中应包含其所属 Ceph 集群的名称。如果集群名称为默认名称“ceph”,则密钥环文件名为/etc/ceph/ceph.client.libvirt.keyring
。如果该密钥环不存在,请使用以下命令创建它:
cephuser@adm >
ceph auth get client.libvirt > /etc/ceph/ceph.client.libvirt.keyringroot #
qemu-img create -f raw rbd:libvirt-pool/new-libvirt-image:id=libvirt 2G校验该映像是否存在。
cephuser@adm >
rbd -p libvirt-pool ls
26.2 准备 VM 管理器 #
虽然您可以单独使用 libvirt
,而不借助 VM 管理器,但您可能会发现,使用 virt-manager
创建第一个域会更简单。
安装虚拟机管理器。
root #
zypper in virt-manager准备/下载要运行虚拟化的系统的 OS 映像。
起动虚拟机管理器。
virt-manager
26.3 创建 VM #
要使用 virt-manager
创建 VM,请执行以下步骤:
从列表中选择连接,右键点击该连接,然后选择
。通过提供现有存储的路径来
。指定 OS 类型和内存设置,并给虚拟机 ,例如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 并将其停止。
26.4 配置 VM #
本章重点介绍如何使用 virsh
配置 VM,以与 Ceph 集成。virsh
命令通常需要 root 特权 (sudo
),它不会返回相应的结果,也不会告知您需要 root 特权。有关 virsh
命令的参考信息,请参见 man 1 virsh
(需要安装 libvirt-client )。
使用
virsh edit
vm-domain-name 打开配置文件。root #
virsh edit libvirt-virtual-machine<devices> 下面应有一个 <disk> 项。
<devices> <emulator>/usr/bin/qemu-system-SYSTEM-ARCH</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)。保存文件。
如果 Ceph 集群已启用身份验证(默认会启用),则您必须生成机密。打开所选的编辑器,并创建包含以下内容的
secret.xml
文件:<secret ephemeral='no' private='no'> <usage type='ceph'> <name>client.libvirt secret</name> </usage> </secret>
定义机密。
root #
virsh secret-define --file secret.xml <uuid of secret is output here>获取
client.libvirt
密钥,并将密钥字符串保存到某个文件中。cephuser@adm >
ceph auth get-key client.libvirt | sudo tee client.libvirt.key设置机密的 UUID。
root #
virsh secret-set-value --secret uuid of secret \ --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml此外,必须通过将以下
<auth>
项添加到前面输入的<disk>
元素(请将 uuid 值替换为上述命令行示例的结果),来手动设置机密。root #
virsh edit libvirt-virtual-machine然后,在域配置文件中添加
<auth></auth>
元素:... </source> <auth username='libvirt'> <secret type='ceph' uuid='9ec59067-fdbc-a6c0-03ff-df165c0587b8'/> </auth> <target ...
注意示例 ID 为
libvirt
,而不是在第 26.1 节 “配置 Ceph 与libvirt
搭配使用”的步骤 2 中生成的 Ceph 名称client.libvirt
。请务必使用所生成的 Ceph 名称的 ID 组成部分。如果出于某种原因需要重新生成机密,则在再次执行sudo virsh secret-set-value
之前,需要执行sudo virsh secret-undefine
uuid。
26.5 摘要 #
配置要与 Ceph 搭配使用的 VM 之后,便可启动该 VM。要校验 VM 与 Ceph 是否可相互通讯,可执行以下过程。
检查 Ceph 是否在运行:
cephuser@adm >
ceph health检查 VM 是否在运行:
root #
virsh list检查 VM 是否在与 Ceph 通讯。将 vm-domain-name 替换为 VM 域的名称:
root #
virsh qemu-monitor-command --hmp vm-domain-name 'info block'检查
/dev
或/proc/partitions
下是否存在&target dev='hdb' bus='ide'/>
中的设备:tux >
ls /devtux >
cat /proc/partitions