注意
本文档适用于 Ceph 的开发版本。
QEMU 与块设备
最常见的 Ceph 块设备用例是为虚拟机提供块设备映像。例如,用户可以创建一个“黄金”映像,其中包含一个操作系统和任何相关软件,并采用理想配置。然后用户拍摄该映像的快照。最后,用户克隆该快照(可能多次)。有关详细信息,请参阅快照。快照的写时复制克隆能力意味着 Ceph 可以快速为虚拟机提供块设备映像,因为客户端不必在每次启动新虚拟机时都下载整个映像。
Ceph 块设备连接到 QEMU 虚拟机。有关 QEMU 的详细信息,请参阅 QEMU 开源处理器模拟器。有关 QEMU 文档,请参阅 QEMU 手册。有关安装详细信息,请参阅 安装。
重要
要将 Ceph 块设备与 QEMU 一起使用,您必须能够访问正在运行的 Ceph 集群。
用法
QEMU 命令行要求您指定 Ceph 池和映像名称。您还可以指定快照。
QEMU 将假定 Ceph 配置位于默认位置(例如,/etc/ceph/$cluster.conf),并且您正在以默认的 client.admin 用户身份执行命令,除非您明确指定另一个 Ceph 配置文件路径或另一个用户。指定用户时,QEMU 使用 ID 而不是完整的 TYPE:ID。有关详细信息,请参阅用户管理 - 用户。不要将客户端类型(即 client.)添加到用户 ID 的开头,否则您将收到身份验证错误。您应该将 admin 用户的密钥或您使用 :id={user} 选项指定的另一个用户的密钥存储在默认路径(即 /etc/ceph)或具有适当文件所有权和权限的本地目录中的密钥环文件中。用法采用以下形式
qemu-img {command} [options] rbd:{pool-name}/{image-name}[@snapshot-name][:option1=value1][:option2=value2...]
例如,指定 id 和 conf 选项可能如下所示
qemu-img {command} [options] rbd:glance-pool/maipo:id=glance:conf=/etc/ceph/ceph.conf
提示
包含 :、@ 或 = 的配置值可以用前导 \ 字符转义。
使用 QEMU 创建映像
您可以从 QEMU 创建块设备映像。您必须指定 rbd、池名称以及您希望创建的映像名称。您还必须指定映像的大小。
qemu-img create -f raw rbd:{pool-name}/{image-name} {size}
例如
qemu-img create -f raw rbd:data/foo 10G
重要
raw 数据格式确实是唯一适合与 RBD 一起使用的 format 选项。从技术上讲,您可以使用 QEMU 支持的其他格式(例如 qcow2 或 vmdk),但这会增加额外的开销,并且在启用缓存(见下文)时也会使卷对于虚拟机实时迁移不安全。
使用 QEMU 调整映像大小
您可以从 QEMU 调整块设备映像的大小。您必须指定 rbd、池名称以及您希望调整大小的映像名称。您还必须指定映像的大小。
qemu-img resize rbd:{pool-name}/{image-name} {size}
例如
qemu-img resize rbd:data/foo 10G
使用 QEMU 获取映像信息
您可以从 QEMU 获取块设备映像信息。您必须指定 rbd、池名称和映像名称。
qemu-img info rbd:{pool-name}/{image-name}
例如
qemu-img info rbd:data/foo
使用 RBD 运行 QEMU
QEMU 可以将主机上的块设备传递给来宾,但自 QEMU 0.15 以来,无需将映像映射为主机上的块设备。相反,QEMU 通过 librbd 直接将映像作为虚拟块设备附加。此策略通过避免上下文切换并利用 RBD 缓存来提高性能。
您可以使用 qemu-img 将现有的虚拟机映像转换为 Ceph 块设备映像。例如,如果您有一个 qcow2 映像,您可以运行
qemu-img convert -f qcow2 -O raw debian_squeeze.qcow2 rbd:data/squeeze
要运行从该映像启动的虚拟机,您可以运行
qemu -m 1024 -drive format=raw,file=rbd:data/squeeze
RBD 缓存可以显著提高性能。自 QEMU 1.2 以来,QEMU 的缓存选项控制 librbd 缓存
qemu -m 1024 -drive format=rbd,file=rbd:data/squeeze,cache=writeback
如果您使用的是旧版本的 QEMU,您可以将 librbd 缓存配置(如任何 Ceph 配置选项)设置为“file”参数的一部分
qemu -m 1024 -drive format=raw,file=rbd:data/squeeze:rbd_cache=true,cache=writeback
重要
如果您设置 rbd_cache=true,则必须设置 cache=writeback,否则可能会丢失数据。如果没有 cache=writeback,QEMU 将不会向 librbd 发送刷新请求。如果 QEMU 在此配置中非正常退出,rbd 之上的文件系统可能会损坏。
启用 Discard/TRIM
自 Ceph 0.46 和 QEMU 1.1 版以来,Ceph 块设备支持 discard 操作。这意味着来宾可以发送 TRIM 请求以让 Ceph 块设备回收未使用的空间。这可以通过将来宾中挂载 ext4 或 XFS 并使用 discard 选项来启用。
为了使来宾可以使用此功能,必须为块设备明确启用它。为此,您必须指定与驱动器关联的 discard_granularity
qemu -m 1024 -drive format=raw,file=rbd:data/squeeze,id=drive1,if=none \
-device driver=ide-hd,drive=drive1,discard_granularity=512
请注意,这使用了 IDE 驱动程序。自 Linux 内核版本 5.0 以来,virtio 驱动程序支持 discard。
如果使用 libvirt,请使用 virsh edit 编辑 libvirt 域的配置文件,以包含 xmlns:qemu 值。然后,添加一个 qemu:commandline 块作为该域的子节点。以下示例显示了如何将具有 qemu id= 的两个设备设置为不同的 discard_granularity 值。
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
<qemu:commandline>
<qemu:arg value='-set'/>
<qemu:arg value='block.scsi0-0-0.discard_granularity=4096'/>
<qemu:arg value='-set'/>
<qemu:arg value='block.scsi0-0-1.discard_granularity=65536'/>
</qemu:commandline>
</domain>
QEMU 缓存选项
QEMU 的缓存选项对应于以下 Ceph RBD 缓存设置。
Writeback
rbd_cache = true
Writethrough
rbd_cache = true
rbd_cache_max_dirty = 0
None
rbd_cache = false
QEMU 的缓存设置会覆盖 Ceph 的缓存设置(包括在 Ceph 配置文件中明确设置的设置)。
注意
在 QEMU v2.4.0 之前,如果您在 Ceph 配置文件中明确设置了 RBD 缓存设置,则您的 Ceph 设置会覆盖 QEMU 缓存设置。