rbd – 管理 RADOS 块设备( RBD )映像

摘要

rbd [ -c ceph.conf ] [ -m monaddr ] [–cluster cluster name] [ -p | –pool pool ] [–size size ] [ –order bits ] [ command ... ]

描述

rbd 是个操纵 rados 块设备( RBD )映像的工具, QEMU/KVM 通过 Linux rbd 内核驱动和 rbd 存储驱动来使用。 RBD 映像是简单的块设备,它被条带化成小块对象后存储于 RADOS 对象存储集群。条带化后的对象尺寸必须是 2 的幂。

选项

-c ceph.conf, --conf ceph.conf

指定 ceph.conf 配置文件,而不是用默认的 /etc/ceph/ceph.conf 来确定启动时需要的 monitor 地址。

-m monaddress[:port]

连接到指定 monitor,无需通过 ceph.conf 查找。

--cluster cluster name

使用自定义的集群名字,即不是默认的 ceph

-p pool-name, --pool pool-name

在指定存储池下操作,大多数命令都得指定。

--no-progress

不显示进度信息(有些命令会默认输出到标准错误)。

参数

--image-format format-id

选择使用哪个对象布局,默认为 1 。

  • format 1 - (废弃)新建 rbd 映像时使用最初的格式。此格式兼容所有版本的 librbd 和内核模块,但是不支持诸如克隆这样较新的功能。
  • format 2 - 使用第二版 rbd 格式, librbd 和 3.11 版以上内核模块才支持(除非是分拆的模块)。此格式增加了对克隆的支持,日后扩展以增加新功能也变得更加容易。
--size size-in-M/G/T

指定新 rbd 映像的大小,单位可以是 M/G/T 。

--object-size B/K/M

指定 object 对象的大小,单位可以是 B/K/M ,会向上取整为 2 的整数次幂。默认值是 4 MB,最小值是 4 KB,最大值是 32 MB。

--stripe-unit size-in-B/K/M

指定条带单元尺寸,单位可以是 B/K/M 。详情见下面的条带化一节。

--stripe-count num

指定条带化要至少跨越多少对象后才能转回第一个。详情见条带化一节。

--snap snap

某些操作需要指定快照名。

--id username

指定 map 命令要用到的用户名(不含 client. 前缀)。

--keyring filename

指定 map 命令所需的包含特定用户密钥的文件。如果未指定,去默认密钥环位置查找。

--keyfile filename

指定 map 命令所需的包含 --id user 用户密钥的文件。如果同时指定了 --keyring 选项(常用),本选项就会被覆盖。

--shared lock-tag

lock add 选项允许使用同一标签的多个客户端同时锁住某个映像。标签是任意字符串。当需要从多个客户端同时打开某映像时,此选项很有用,像热迁移虚拟机时、或者在集群文件系统下使用时。

--format format

指定输出格式,默认: plain 、 json 、 xml 。

--pretty-format

使 json 或 xml 格式的输出更易读。

-o map-options, --options map-options

指定 map 映像时所用的选项。选项格式为逗号分隔的字符串(类似于 mount(8) 的挂载选项)。详情见下面的 map 选项小节。

--read-only

以只读方式 map 映像,等价于 -o ro 。

--image-feature feature-name

指定创建 format 2 格式的 RBD 映像时,要启用的特性。可以通过重复此选项来启用多个特性。当前支持下列特性:

  • layering: 支持分层
  • striping: 支持条带化 v2
  • exclusive-lock: 支持独占锁
  • object-map: 支持对象映射(依赖 exclusive-lock )
  • fast-diff: 快速计算差异(依赖 object-map )
  • deep-flatten: 支持快照扁平化操作
  • journaling: 支持记录 IO 操作(依赖独占锁)
--image-shared

指定该映像将被多个客户端同时使用。此选项将禁用那些依赖于独占映像所有权的功能。

--whole-object

把 diff 操作范围限定在完整的对象级别,而非对象内差异。当某一映像启用了 object-map 功能时,把 diff 操作限定到对象级别会显著地提高性能,因为通过检查驻留于内存中的对象映射就可以计算出差异,而无需针对映像内的各个对象去查询 RADOS 。

命令

ls [-l | –long] [pool-name]
列出 rbd_directory 对象中的所有 rbd 映像。加 -l 选项后也显示快照,并用长格式输出,包括大小、父映像(若是克隆)、格式等等。
du [-p | –pool pool-name] [image-spec | snap-spec]

计算指定存储池内所有映像及其相关快照的磁盘使用量,包括预分配的和实际使用的。此命令也可用于单个映像和快照。

如果没启用 RBD 映像的 fast-diff 特性,此操作则需向多个 OSD 查询此映像涉及的每个对象。

info image-spec | snap-spec
显示指定 rbd 映像的信息(如映像大小和对象大小)。若映像是克隆品,会显示其父快照的信息。若指定了快照,会显示是否被保护。
create (-s | –size size-in-M/G/T) [–image-format format-id] [–object-size B/K/M] [–stripe-unit size-in-B/K/M –stripe-count num] [–image-feature feature-name]... [–image-shared] image-spec
新建 rbd 映像。必须用 –size 指定尺寸。 –strip-unit 和 –strip-count 参数是可选项,但必须同时使用。
clone [–object-size B/K/M] [–stripe-unit size-in-B/K/M –stripe-count num] [–image-feature feature-name] [–image-shared] parent-snap-spec child-image-spec

创建一个父快照的克隆(写时复制子映像)。若不指定 object size,会采用父映像的值。克隆映像的大小和父快照相同。参数 –stripe-unit 和 –stripe-count 是可选的,但必须同时使用。

父快照必须已被保护(见 rbd snap protect )。 只适用于 format 2 格式的映像。

flatten image-spec

如果映像是个克隆,就从父快照拷贝所有共享的块,使子快照独立于父快照,切断父子快照间的联系。如果没有克隆映像引用此父快照了,就可以取消保护并删除它。

只适用于 format 2 格式的映像。

children snap-spec

列出此映像指定快照的克隆品。它会检查各存储池、并输出存储池名/映像名。

只适用于 format 2 格式的映像。

resize (-s | –size size-in-M/G/T) [–allow-shrink] image-spec
调整 rbd 映像的大小。必须指定 size 参数。 –allow-shrink 选项允许缩小。
rm image-spec
删除 rbd 映像,包括所有数据块。如果映像有快照,此命令会失效。
export (image-spec | snap-spec) [dest-path]
把映像导出到目的路径,用 - (短线)输出到标准输出。
import [–image-format format-id] [–object-size B/K/M] [–stripe-unit size-in-B/K/M –stripe-count num] [–image-feature feature-name]... [–image-shared] src-path [image-spec]

创建映像,并从目的路径导入数据,用 - (短线)表示从标准输入导入。如果可能的话,导入操作会试着创建稀疏映像。如果从标准输入导入,稀疏化单位将是目标映像的数据块尺寸(即 object size )。

参数 –stripe-unit 和 –stripe-count 是可选的,但必须同时使用。

export-diff [–from-snap snap-name] [–whole-object] (image-spec | snap-spec) dest-path
导出映像的增量差异,用 - 表示导出到标准输出。若指定了起始快照,就只包含与此快照的差异部分;否则包含映像的所有数据部分。结束快照用 –snap 选项或 @snap 语法(见下文)指定。此映像的差异格式包含了映像尺寸变更的元数据、起始和结束快照,它高效地表达了被丢弃的或映像内的全 0 区域。
merge-diff first-diff-path second-diff-path merged-diff-path
把两个连续的增量差异合并为单个差异。前一个差异的结束快照必须与后一个差异的起始快照相同。前一个差异可以是标准输入 - ,合并后的差异可以是标准输出 - ,这样就可以合并多个差异文件,像这样: ‘rbd merge-diff first second - | rbd merge-diff - third result’ 。注意,当前此命令仅支持 stripe_count == 1 这样的源增量差异。
import-diff src-path image-spec
导入一个映像的增量差异并应用到当前映像。如果此差异是在起始快照基础上生成的,我们会先校验那个已存在快照再继续;如果指定了结束快照,在应用这些变更前,我们还要检查它是否不存在,完成后再创建结束快照。
diff [–from-snap snap-name] [–whole-object] image-spec | snap-spec
打印出从指定快照点起、或从映像创建点起,映像内的变动区域。输出的各行都包含起始偏移量(按字节)、数据块长度(按字节)、还有 zero 或 data ,用来指示此区域是 0 还是包含有其它数据。
cp (src-image-spec | src-snap-spec) dest-image-spec
把源映像内容复制进新建的目标映像,目标映像和源映像将有相同的大小、object size 和格式。
mv src-image-spec dest-image-spec
映像重命名。注:不支持跨存储池。
image-meta list image-spec
显示此映像持有的元数据。第一列是关键字、第二列是值。
image-meta get image-spec key
获取关键字对应的元数据值。
image-meta set image-spec key value
设置元数据关键字的值,会显示在 metadata-list 中。
image-meta remove image-spec key
删除元数据关键字及其值。
object-map rebuild image-spec | snap-spec
为指定映像重建无效的对象映射关系。指定映像快照时,将为此快照重建无效的对象映射关系。
snap ls image-spec
列出指定映像内的快照。
snap create snap-spec
新建快照。需指定快照名。
snap rollback snap-spec
把指定映像回滚到某个快照。此动作会递归整个块阵列,并把数据头内容更新到快照版本。
snap rm snap-spec
删除指定快照。
snap purge image-spec
删除某个映像的所有快照。
snap protect snap-spec

保护快照,以防删除,这样才能从它克隆(见 rbd clone )。做克隆前必须先保护快照,保护意味着存在有依赖于此快照的克隆。 rbd clone 不能在未保护的快照上操作。

只适用于 format 2 格式的映像。

snap unprotect snap-spec

取消对快照的保护(撤销 snap protect )。如果还有克隆出的子快照尚在, snap unprotect 命令会失效。(注意克隆和其父快照可能会位于不同的存储池。)

只适用于 format 2 格式的映像。

map [-o | –options map-options ] [–read-only] image-spec | snap-spec
通过内核 rbd 模块把指定映像映射到某一块设备。
unmap image-spec | snap-spec | device-path
取消通过内核 rbd 模块的所做的块设备映射。
showmapped
显示通过内核 rbd 模块映射的 rbd 映像。
nbd map [–device device-path] [–read-only] image-spec | snap-spec
通过 rbd-nbd 工具把指定映像映射成一个块设备。
nbd unmap device-path
取消通过 rbd-nbd 工具映射的块设备。
nbd list
显示使用中的通过 rbd-nbd 工具映射的 nbd 设备。
status image-spec
显示映像状态,包括哪个客户端打开着它。
feature disable image-spec feature-name...
禁用指定镜像的某些特性,可以一次指定多个。
feature enable image-spec feature-name...
启用指定镜像的某些特性,可以一次指定多个。
lock list image-spec
显示加在映像上的锁,第一列是 lock remove 可以使用的锁名。
lock add [–shared lock-tag] image-spec lock-id
为映像加锁。锁标识是用户所选的任意名字。默认加的是互斥锁,这意味着如果映像已经加过锁的话此命令会失败。 –shared 选项会改变此行为。注意,加锁操作不影响除加锁之外的任何操作,也不会保护映像、防止它被删除。
lock remove image-spec lock-id locker
释放映像上的锁。锁标识和其持有者来自 lock ls 。
bench-write [–io-size size-in-B/K/M/G/T] [–io-threads num-ios-in-flight] [–io-total total-size-to-write-in-B/K/M/G/T] [–io-pattern seq | rand] image-spec
向某一映像生成一系列写操作,以此测量写吞吐量和延时。默认参数为 –io-size 4096 、 –io-threads 16 、 –io-total 1G 、 –io-pattern seq 。

映像名和快照名规则

image-spec 代表 [pool-name]/image-name
snap-spec 代表 [pool-name]/image-name@snap-name

pool-name 的默认值是 rbd 。如果某个映像名包含斜杠字符( ’/‘ ),那么还必须指定 pool-name

你可以用 –pool 、 –image 和 –snap 选项分别指定各个名字,但是并不鼓励这种用法,大家还是倾向于上面的语法规则。

条带化

RBD 映像被条带化为多个对象,然后存储到 Ceph 分布式对象存储( RADOS )集群中。因此,对此映像的读、写请求会分散到集群内的很多节点,也就避免了映像巨大或繁忙时可能出现的单节点瓶颈。

条带化由三个参数控制:

-size

条带化产生的对象大小是 2 的幂。会向上取整为最接近 2 的幂的值。默认值是 4 MB ,最小值是 4 KB,最大值是 32 MB。

stripe_unit

各 [stripe_unit] 是一段连续的字节,相邻地存储于同一对象,放满后再去下一个对象。

stripe_count

我们写够 [stripe_count] 个长度为 [stripe_unit] 字节的对象后,再转回到第一个对象写另一轮条带,直到达到对象的最大尺寸。此时,我们再写下一轮 [stripe_count] 个对象。

默认情况下, [stripe_unit] 和对象尺寸相同、且 [stripe_count] 为 1 。指定 [stripe_unit] 为其他值,需支持 STRIPINGV2 特性( Ceph 0.53 起加入)并使用 format 2 格式的映像。

Map 选项

这里的大多数选项主要用于调试和基准测试。默认值设置于内核中,因此还与所用内核的版本有关。

libceph (每个客户端实例)选项:

  • fsid=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee - 应该由客户端提供的 FSID 。
  • ip=a.b.c.d[:p] - 客户端使用的 IP 和可选端口。
  • share - 允许与其它映射共享客户端实例(默认)。
  • noshare - 禁止与其它映射共享客户端实例。
  • crc - 在写入数据时计算 CRC32C 校验值(默认)。
  • nocrc - 在写入数据时不计算 CRC32C 校验值。
  • cephx_require_signatures - 要求对 cephx 消息签名(从 3.19 起,默认开启)。
  • nocephx_require_signatures - 不要求对 cephx 消息签名(从 3.19 起)。
  • tcp_nodelay - 在客户端套接字禁用 Nagle’s 算法(从 4.0 起,默认开启)。
  • notcp_nodelay - 在客户端套接字启用 Nagle’s 算法(从 4.0 起)。
  • cephx_sign_messages - 启用消息签名(从 4.4 起,默认开启)。
  • nocephx_sign_messages - 禁用消息签名(从 4.4 起)。
  • mount_timeout=x - 执行 rbd maprbd unmap 时所涉及的各操作步骤的超时值(默认为 60 秒)。特别是从 4.2 起,与集群间没有连接时,使用此选项可确保 rbd unmap 操作最终超时了。
  • osdkeepalive=x - OSD 保持连接的期限(默认为 5 秒)。
  • osd_idle_ttl=x - OSD 闲置 TTL (默认为 60 秒)。

映射(每个块设备)选项:

  • rw - 以读写方式映射映像(默认)。
  • ro - 以只读方式映射映像,等价于 –read-only 。
  • queue_depth=x - 队列深度(从 4.2 起,默认为 128 个请求)。

样例

新建一个 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/docshttp://docs.ceph.org.cn/

另请参阅

ceph(8), rados(8)