最常见的Ceph Block Device用例是向虚拟机提供block device images。例如,用户可以创建”golden” image。 然后,对image做snapshot。最后,用户clone snapshot(通常多次)。 有关详细信息,请参见 Snapshots。snapshot的clone具有copy-on-write能力,意味着Ceph可以快速将block device images配置给虚拟机,因为客户端不必在每次启动新虚拟机时都下载整个映像。
Ceph Block Devices可以与QEMU虚拟机集成。 有关QEMU的详细信息,请参阅QEMU Open Source Processor Emulator。 有关QEMU文档,请参见QEMU Manual。 有关安装的详细信息,请参见 Installation。
1 | 重要说明要将Ceph Block Devices与QEMU一起使用,你必须能够访问正在运行的Ceph的集群。 |
USAGE(用法)
QEMU命令行要求您指定pool名称和image名称。 您也可以指定snapshot名称。
QEMU将假设Ceph configuration文件位于默认位置(例如,/etc/ceph/$cluster.conf
),并且您以默认的client.admin
user身份执行命令,除非您明确指定另一个Ceph configuration文件路径或另一个user。指定user时,QEMU使用ID
而不是完整的TYPE:ID
。有关详细信息,请参见User Management - User。请勿在user ID的开头添加客户端类型(即,client
),否则您将收到验证错误。您应该具有admin user的key,或者使用:id={user}
选项指定的另一个user的key,存储在默认路径中的keyring文件中。(即,/etc/ceph或具有适当文件所有权和权限的本地目录)用法如下:
1 | qemu-img {command} [options] rbd:{pool-name}/{image-name}[@snapshot-name][:option1=value1][:option2=value2...] |
例如,指定id和conf选项如下所示:
1 | qemu-img {command} [options] rbd:glance-pool/maipo:id=glance:conf=/etc/ceph/ceph.conf |
提示:包含:
, @
, 或 =
可以使用\开头的字符进行转义。
CREATING IMAGES WITH QEMU(使用QEMU创建IMAGES)
可以从QEMU创建block device image。 必须指定rbd,pool名称和要创建的image名称。 还必须指定image的size。
1 | qemu-img create -f raw rbd:{pool-name}/{image-name} {size} |
例如:
1 | qemu-img create -f raw rbd:data/foo 10G |
重要说明:raw data format(原始数据格式)实际上是与RBD一起使用的唯一明智格式选项。从技术上讲,您可以使用其他QEMU支持的格式(例如qcow2或vmdk),但是这样做会增加额外的开销,并且在启用缓存(请参阅下文)时,对于虚拟机实时迁移也将使该卷不安全。
RESIZING IMAGES WITH QEMU(使用QEMU调整IMAGES大小)
您可以从QEMU调整block device image的大小。 您必须指定rbd,pool名称以及要调整大小的image名称。 您还必须指定image的size。
1 | qemu-img resize rbd:{pool-name}/{image-name} {size} |
例如:
1 | qemu-img resize rbd:data/foo 10G |
RETRIEVING IMAGE INFO WITH QEMU(使用QEMU检索IMAGE信息)
您可以从QEMU中检索block device image信息。 您必须指定rbd,pool名称和image名称。
1 | qemu-img info rbd:{pool-name}/{image-name} |
例如:
1 | qemu-img info rbd:data/foo |
RUNNING QEMU WITH RBD(运行QEMU与RBD)
QEMU可以将block device从host传递到guest,但是从QEMU 0.15开始,无需将image映射为host上的block device。相反,QEMU可以直接通过librbd作为virtual block device访问image。这样会更好,因为它避免了额外的context(上下文)切换,并且可以利用RBD caching。
您可以使用qemu-img将现有的virtual machine images转换为Ceph block device images。例如,如果您有一个qcow2 image,则可以运行:
1 | qemu-img convert -f qcow2 -O raw debian_squeeze.qcow2 rbd:data/squeeze |
要运行从该image启动的virtual machine,可以运行:
1 | qemu -m 1024 -drive format=raw,file=rbd:data/squeeze |
RBD caching可以明显提高性能。 从QEMU 1.2开始,QEMU的cache选项控制librbd
caching:
1 | qemu -m 1024 -drive format=rbd,file=rbd:data/squeeze,cache=writeback |
如果您使用的是较旧版本的QEMU,则可以将librbd cache configuration设置为”file”参数的一部分(如任何Ceph配置选项一样):
1 | 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 顶部的文件系统可能会损坏。
ENABLING DISCARD/TRIM(启用DISCARD/TRIM)
从Ceph 0.46版和QEMU 1.1版开始,Ceph Block Devices支持discard(丢弃)操作。这意味着guest可以发送TRIM请求,让Ceph block device回收未使用的空间。在客户机中mount ext4
或XFS
时,通过discard
选项启用它。
为了使此功能可供guest使用,必须为block device显式启用它。 为此,必须指定与drive关联的dispatch_granularity
:
1 | qemu -m 1024 -drive format=raw,file=rbd:data/squeeze,id=drive1,if=none \ |
请注意,这使用了IDE driver。 virtio driver不支持discard。
如果使用libvirt,请使用virsh edit
编辑domain的配置文件,以包含xmlns:qemu
值。然后,添加qemu:commandline
block作为该domain的子级。以下示例为如何将qemu id=
设置到两个不同的devices,并且discard_granularity值不同。
1 | <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> |
QEMU CACHE OPTIONS(QEMU缓存选项)
QEMU的cache选项与以下Ceph RBD Cache设置相对应。
Writeback:
1 | rbd_cache = true |
Writethrough:
1 | rbd_cache = true |
None:
1 | rbd_cache = false |
QEMU的cache设置会覆盖Ceph的cache设置(包括在Ceph配置文件中设置)。
实验
1 | [root@ceph ~]# qemu-img create -f raw rbd:rbd/yujiang 10G |