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注意:用户名或 ID- libvirt将使用 ID- libvirt,而不是 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.keyring- #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 创建第一个域会更简单。
  
- 安装虚拟机管理器。 - #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 listId 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 editvm-domain-name 打开配置文件。- #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/qemu下的配置文件,- libvirtlibvirt 可能无法识别更改。如果- /etc/libvirt/qemu下的 XML 文件内容与- sudo virsh dumpxmlvm-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>
- 定义机密。 - #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。 - #virsh secret-set-value --secret uuid of secret \ --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml- 此外,必须通过将以下 - <auth>项添加到前面输入的- <disk>元素(请将 uuid 值替换为上述命令行示例的结果),来手动设置机密。- #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-undefineuuid。
26.5 摘要 #
配置要与 Ceph 搭配使用的 VM 之后,便可启动该 VM。要校验 VM 与 Ceph 是否可相互通讯,可执行以下过程。
- 检查 Ceph 是否在运行: - cephuser@adm >ceph health
- 检查 VM 是否在运行: - #virsh list
- 检查 VM 是否在与 Ceph 通讯。将 vm-domain-name 替换为 VM 域的名称: - #virsh qemu-monitor-command --hmp vm-domain-name 'info block'
- 检查 - /dev或- /proc/partitions下是否存在- &target dev='hdb' bus='ide'/>中的设备:- >ls /dev- >cat /proc/partitions