27 Ceph 用作 QEMU KVM 实例的后端 #
最常见的 Ceph 用例涉及到向虚拟机提供块设备映像。例如,在理想的配置中,用户可以创建包含 OS 和所有相关软件的“黄金”映像。然后,用户可以创建该映像的快照。最后,用户可以克隆该快照(通常要克隆多次,有关详细信息,请参见第 20.3 节 “快照”)。能够创建快照的写入时复制克隆,就意味着 Ceph 能够快速向虚拟机供应块设备映像,因为客户端不需要在每次运转新的虚拟机时都下载整个映像。
Ceph 块设备可与 QEMU 虚拟机集成。有关 QEMU KVM 的详细信息,请参见 https://documentation.suse.com/sles/15-SP2/html/SLES-all/part-virt-qemu.html。
27.1 安装 qemu-block-rbd
#
要使用 Ceph 块设备,需在 QEMU 上安装相应的驱动程序。请检查是否已安装 qemu-block-rbd
包,并根据需要予以安装:
root #
zypper install qemu-block-rbd
27.2 使用 QEMU #
使用 QEMU 命令行时,您需要指定存储池名称和映像名称。您也可以指定快照名称。
qemu-img command options \ rbd:pool-name/image-name@snapshot-name:option1=value1:option2=value2...
例如,可按如下所示指定 id 和 conf 选项:
qemu-img command options \
rbd:pool_name/image_name:id=glance:conf=/etc/ceph/ceph.conf
27.3 使用 QEMU 创建映像 #
可以通过 QEMU 创建块设备映像。必须指定 rbd
、存储池名称,以及要创建的映像的名称。此外,必须指定映像的大小。
qemu-img create -f raw rbd:pool-name/image-name size
例如:
qemu-img create -f raw rbd:pool1/image1 10G Formatting 'rbd:pool1/image1', fmt=raw size=10737418240 nocow=off cluster_size=0
事实上,raw
数据格式是可对 RBD 使用的唯一合理格式选项。从技术上讲,您也可以使用 QEMU 支持的其他格式(例如 qcow2
),但这会增加额外的开销,如果启用了缓存,还会在实时迁移虚拟机时让卷变得不安全。
27.4 使用 QEMU 调整映像大小 #
可以通过 QEMU 调整块设备映像的大小。必须指定 rbd
、存储池名称,以及要调整大小的映像的名称。此外,必须指定映像的大小。
qemu-img resize rbd:pool-name/image-name size
例如:
qemu-img resize rbd:pool1/image1 9G Image resized.
27.5 使用 QEMU 检索映像信息 #
可以通过 QEMU 检索块设备映像的信息。必须指定 rbd
、存储池名称和映像名称。
qemu-img info rbd:pool-name/image-name
例如:
qemu-img info rbd:pool1/image1 image: rbd:pool1/image1 file format: raw virtual size: 9.0G (9663676416 bytes) disk size: unavailable cluster_size: 4194304
27.6 使用 RBD 运行 QEMU #
QEMU 可以通过 librbd
直接将映像作为虚拟块设备来访问。这可以避免额外的环境切换,并可利用 RBD 缓存的优势。
您可以使用 qemu-img
将现有的虚拟机映像转换成 Ceph 块设备映像。例如,如果您有一个 qcow2 映像,则可以运行:
qemu-img convert -f qcow2 -O raw sles12.qcow2 rbd:pool1/sles12
要运行从该映像引导的虚拟机,可以运行:
root #
qemu -m 1024 -drive format=raw,file=rbd:pool1/sles12
RBD 缓存可大幅提高性能。QEMU 的缓存选项可控制 librbd
缓存:
root #
qemu -m 1024 -drive format=rbd,file=rbd:pool1/sles12,cache=writeback
有关 RBD 缓存的详细信息,请参见第 20.5 节 “缓存设置”。
27.7 启用丢弃和 TRIM #
Ceph 块设备支持丢弃操作。这意味着,guest 可以发送 TRIM 请求,让 Ceph 块设备回收未使用的空间。可以通过结合 discard 选项装入 XFS
,在 guest 中启用此功能。
要让 guest 可使用此功能,必须为块设备显式启用此功能。为此,您必须指定与驱动器关联的 discard_granularity
:
root #
qemu -m 1024 -drive format=raw,file=rbd:pool1/sles12,id=drive1,if=none \
-device driver=ide-hd,drive=drive1,discard_granularity=512
上面的示例使用 IDE 驱动程序。Virtio 驱动程序不支持丢弃功能。
如果使用 libvirt
,请使用 virsh edit
编辑 libvirt 域的配置文件,以包含 xmlns:qemu
值。然后,将 qemu:commandline block
添加为该域的子级。下面的示例说明如何将包含 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>
27.8 设置 QEMU 缓存选项 #
QEMU 的缓存选项与以下 Ceph RBD 缓存设置对应。
写回:
rbd_cache = true
直写:
rbd_cache = true rbd_cache_max_dirty = 0
无:
rbd_cache = false
QEMU 的缓存设置会覆盖 Ceph 的默认设置(未在 Ceph 配置文件中显式指定的设置)。如果在 Ceph 配置文件中明确指定了 RBD 缓存设置(请参见第 20.5 节 “缓存设置”),您的 Ceph 设置将会覆盖 QEMU 缓存设置。如果在 QEMU 命令行中指定了缓存设置,则 QEMU 命令行设置会覆盖 Ceph 配置文件设置。