rbd 是个操纵 rados 块设备( RBD )映像的工具, QEMU/KVM 通过 Linux rbd 内核驱动和 rbd 存储驱动来使用。 RBD 映像是简单的块设备,它被条带化成小块对象后存储于 RADOS 对象存储集群。条带化后的对象尺寸必须是 2 的幂。
指定 ceph.conf 配置文件,而不是用默认的 /etc/ceph/ceph.conf 来确定启动时需要的 monitor 地址。
连接到指定 monitor,无需通过 ceph.conf 查找。
使用自定义的集群名字,即不是默认的 ceph 。
在指定存储池下操作,大多数命令都得指定。
不显示进度信息(有些命令会默认输出到标准错误)。
选择使用哪个对象布局,默认为 1 。
指定新 rbd 映像的大小,单位可以是 M/G/T 。
指定 object 对象的大小,单位可以是 B/K/M ,会向上取整为 2 的整数次幂。默认值是 4 MB,最小值是 4 KB,最大值是 32 MB。
指定条带单元尺寸,单位可以是 B/K/M 。详情见下面的条带化一节。
指定条带化要至少跨越多少对象后才能转回第一个。详情见条带化一节。
某些操作需要指定快照名。
指定 map 命令要用到的用户名(不含 client. 前缀)。
指定 map 命令所需的包含特定用户密钥的文件。如果未指定,去默认密钥环位置查找。
指定 map 命令所需的包含 --id user 用户密钥的文件。如果同时指定了 --keyring 选项(常用),本选项就会被覆盖。
lock add 选项允许使用同一标签的多个客户端同时锁住某个映像。标签是任意字符串。当需要从多个客户端同时打开某映像时,此选项很有用,像热迁移虚拟机时、或者在集群文件系统下使用时。
指定输出格式,默认: plain 、 json 、 xml 。
使 json 或 xml 格式的输出更易读。
指定 map 映像时所用的选项。选项格式为逗号分隔的字符串(类似于 mount(8) 的挂载选项)。详情见下面的 map 选项小节。
以只读方式 map 映像,等价于 -o ro 。
指定创建 format 2 格式的 RBD 映像时,要启用的特性。可以通过重复此选项来启用多个特性。当前支持下列特性:
指定该映像将被多个客户端同时使用。此选项将禁用那些依赖于独占映像所有权的功能。
把 diff 操作范围限定在完整的对象级别,而非对象内差异。当某一映像启用了 object-map 功能时,把 diff 操作限定到对象级别会显著地提高性能,因为通过检查驻留于内存中的对象映射就可以计算出差异,而无需针对映像内的各个对象去查询 RADOS 。
计算指定存储池内所有映像及其相关快照的磁盘使用量,包括预分配的和实际使用的。此命令也可用于单个映像和快照。
如果没启用 RBD 映像的 fast-diff 特性,此操作则需向多个 OSD 查询此映像涉及的每个对象。
创建一个父快照的克隆(写时复制子映像)。若不指定 object size,会采用父映像的值。克隆映像的大小和父快照相同。参数 –stripe-unit 和 –stripe-count 是可选的,但必须同时使用。
父快照必须已被保护(见 rbd snap protect )。 只适用于 format 2 格式的映像。
如果映像是个克隆,就从父快照拷贝所有共享的块,使子快照独立于父快照,切断父子快照间的联系。如果没有克隆映像引用此父快照了,就可以取消保护并删除它。
只适用于 format 2 格式的映像。
列出此映像指定快照的克隆品。它会检查各存储池、并输出存储池名/映像名。
只适用于 format 2 格式的映像。
创建映像,并从目的路径导入数据,用 - (短线)表示从标准输入导入。如果可能的话,导入操作会试着创建稀疏映像。如果从标准输入导入,稀疏化单位将是目标映像的数据块尺寸(即 object size )。
参数 –stripe-unit 和 –stripe-count 是可选的,但必须同时使用。
保护快照,以防删除,这样才能从它克隆(见 rbd clone )。做克隆前必须先保护快照,保护意味着存在有依赖于此快照的克隆。 rbd clone 不能在未保护的快照上操作。
只适用于 format 2 格式的映像。
取消对快照的保护(撤销 snap protect )。如果还有克隆出的子快照尚在, snap unprotect 命令会失效。(注意克隆和其父快照可能会位于不同的存储池。)
只适用于 format 2 格式的映像。
pool-name 的默认值是 rbd 。如果某个映像名包含斜杠字符( ’/‘ ),那么还必须指定 pool-name 。
你可以用 –pool 、 –image 和 –snap 选项分别指定各个名字,但是并不鼓励这种用法,大家还是倾向于上面的语法规则。
RBD 映像被条带化为多个对象,然后存储到 Ceph 分布式对象存储( RADOS )集群中。因此,对此映像的读、写请求会分散到集群内的很多节点,也就避免了映像巨大或繁忙时可能出现的单节点瓶颈。
条带化由三个参数控制:
条带化产生的对象大小是 2 的幂。会向上取整为最接近 2 的幂的值。默认值是 4 MB ,最小值是 4 KB,最大值是 32 MB。
各 [stripe_unit] 是一段连续的字节,相邻地存储于同一对象,放满后再去下一个对象。
我们写够 [stripe_count] 个长度为 [stripe_unit] 字节的对象后,再转回到第一个对象写另一轮条带,直到达到对象的最大尺寸。此时,我们再写下一轮 [stripe_count] 个对象。
默认情况下, [stripe_unit] 和对象尺寸相同、且 [stripe_count] 为 1 。指定 [stripe_unit] 为其他值,需支持 STRIPINGV2 特性( Ceph 0.53 起加入)并使用 format 2 格式的映像。
这里的大多数选项主要用于调试和基准测试。默认值设置于内核中,因此还与所用内核的版本有关。
libceph (每个客户端实例)选项:
映射(每个块设备)选项:
新建一个 100GB 的 rbd 映像:
rbd create mypool/myimage --size 102400
使用非默认对象尺寸( 8 MB ):
rbd create mypool/myimage --size 102400 --object-size 8M
删除 rbd 映像(慎重!):
rbd rm mypool/myimage
新建快照:
rbd snap create mypool/myimage@mysnap
创建已保护快照的写时复制克隆:
rbd clone mypool/myimage@mysnap otherpool/cloneimage
查看快照有哪些克隆:
rbd children mypool/myimage@mysnap
删除快照:
rbd snap rm mypool/myimage@mysnap
通过启用了 cephx 的内核映射一映像:
rbd map mypool/myimage --id admin --keyfile secretfile
通过内核,映射使用非默认名字 ceph 集群中的某一映像:
rbd map mypool/myimage --cluster *cluster name*
取消映射:
rbd unmap /dev/rbd0
创建一个映像并克隆:
rbd import --image-format 2 image mypool/parent
rbd snap create mypool/parent@snap
rbd snap protect mypool/parent@snap
rbd clone mypool/parent@snap otherpool/child
使用较小的 stripe_unit 值来创建映像(在某些情况下可更好地分布小块写):
rbd create mypool/myimage --size 102400 --stripe-unit 65536B --stripe-count 16
更改映像的格式,先导出、再导入为期望格式:
rbd export mypool/myimage@snap /tmp/img
rbd import --image-format 2 /tmp/img mypool/myimage2
给映像加互斥锁:
rbd lock add mypool/myimage mylockid
释放锁:
rbd lock remove mypool/myimage mylockid client.2485
rbd 是 Ceph 的一部分,这是个大规模可伸缩、开源、分布式的存储系统,更多信息参见 http://ceph.com/docs 或 http://docs.ceph.org.cn/。