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 命令所需的包含 —iduser 用户密钥的文件。如果同时指定了 —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 查询此映像涉及的每个对象。

  • infoimage-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 格式的映像。

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

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

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

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

  • resize (-s | –size size-in-M/G/T) [–allow-shrink] image-spec
  • 调整 rbd 映像的大小。必须指定 size 参数。 –allow-shrink 选项允许缩小。
  • rmimage-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-difffirst-diff-pathsecond-diff-pathmerged-diff-path
  • 把两个连续的增量差异合并为单个差异。前一个差异的结束快照必须与后一个差异的起始快照相同。前一个差异可以是标准输入 - ,合并后的差异可以是标准输出 - ,这样就可以合并多个差异文件,像这样: ‘rbd merge-diff first second - | rbd merge-diff - third result’ 。注意,当前此命令仅支持 stripe_count == 1 这样的源增量差异。
  • import-diffsrc-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 和格式。
  • mvsrc-image-spec__dest-image-spec
  • 映像重命名。注:不支持跨存储池。
  • image-meta listimage-spec
  • 显示此映像持有的元数据。第一列是关键字、第二列是值。
  • image-meta getimage-spec__key
  • 获取关键字对应的元数据值。
  • image-meta setimage-speckeyvalue
  • 设置元数据关键字的值,会显示在 metadata-list 中。
  • image-meta removeimage-spec__key
  • 删除元数据关键字及其值。
  • object-map rebuildimage-spec | snap-spec
  • 为指定映像重建无效的对象映射关系。指定映像快照时,将为此快照重建无效的对象映射关系。
  • snap lsimage-spec
  • 列出指定映像内的快照。
  • snap createsnap-spec
  • 新建快照。需指定快照名。
  • snap rollbacksnap-spec
  • 把指定映像回滚到某个快照。此动作会递归整个块阵列,并把数据头内容更新到快照版本。
  • snap rmsnap-spec
  • 删除指定快照。
  • snap purgeimage-spec
  • 删除某个映像的所有快照。
  • snap protectsnap-spec
  • 保护快照,以防删除,这样才能从它克隆(见 rbd clone )。做克隆前必须先保护快照,保护意味着存在有依赖于此快照的克隆。 rbd clone 不能在未保护的快照上操作。

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

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

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

  • map [-o | –options map-options ] [–read-only] image-spec | snap-spec
  • 通过内核 rbd 模块把指定映像映射到某一块设备。
  • unmapimage-spec | snap-spec | device-path
  • 取消通过内核 rbd 模块的所做的块设备映射。
  • showmapped
  • 显示通过内核 rbd 模块映射的 rbd 映像。
  • nbd map [–device device-path] [–read-only] image-spec | snap-spec
  • 通过 rbd-nbd 工具把指定映像映射成一个块设备。
  • nbd unmapdevice-path
  • 取消通过 rbd-nbd 工具映射的块设备。
  • nbd list
  • 显示使用中的通过 rbd-nbd 工具映射的 nbd 设备。
  • statusimage-spec
  • 显示映像状态,包括哪个客户端打开着它。
  • feature disableimage-spec__feature-name
  • 禁用指定镜像的某些特性,可以一次指定多个。
  • feature enableimage-spec__feature-name
  • 启用指定镜像的某些特性,可以一次指定多个。
  • lock listimage-spec
  • 显示加在映像上的锁,第一列是 lock remove 可以使用的锁名。
  • lock add [–shared lock-tag] image-spec__lock-id
  • 为映像加锁。锁标识是用户所选的任意名字。默认加的是互斥锁,这意味着如果映像已经加过锁的话此命令会失败。 –shared 选项会改变此行为。注意,加锁操作不影响除加锁之外的任何操作,也不会保护映像、防止它被删除。
  • lock removeimage-speclock-idlocker
  • 释放映像上的锁。锁标识和其持有者来自 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 起)。
  • mounttimeout=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 映像:

  1. rbd create mypool/myimage --size 102400

使用非默认对象尺寸( 8 MB ):

  1. rbd create mypool/myimage --size 102400 --object-size 8M

删除 rbd 映像(慎重!):

  1. rbd rm mypool/myimage

新建快照:

  1. rbd snap create mypool/myimage@mysnap

创建已保护快照的写时复制克隆:

  1. rbd clone mypool/myimage@mysnap otherpool/cloneimage

查看快照有哪些克隆:

  1. rbd children mypool/myimage@mysnap

删除快照:

  1. rbd snap rm mypool/myimage@mysnap

通过启用了 cephx 的内核映射一映像:

  1. rbd map mypool/myimage --id admin --keyfile secretfile

通过内核,映射使用非默认名字 ceph 集群中的某一映像:

  1. rbd map mypool/myimage --cluster *cluster name*

取消映射:

  1. rbd unmap /dev/rbd0

创建一个映像并克隆:

  1. rbd import --image-format 2 image mypool/parent
  2. rbd snap create mypool/parent@snap
  3. rbd snap protect mypool/parent@snap
  4. rbd clone mypool/parent@snap otherpool/child

使用较小的 stripe_unit 值来创建映像(在某些情况下可更好地分布小块写):

  1. rbd create mypool/myimage --size 102400 --stripe-unit 65536B --stripe-count 16

更改映像的格式,先导出、再导入为期望格式:

  1. rbd export mypool/myimage@snap /tmp/img
  2. rbd import --image-format 2 /tmp/img mypool/myimage2

给映像加互斥锁:

  1. rbd lock add mypool/myimage mylockid

释放锁:

  1. rbd lock remove mypool/myimage mylockid client.2485

使用范围

rbd 是 Ceph 的一部分,这是个大规模可伸缩、开源、分布式的存储系统,更多信息参见 http://ceph.com/docshttp://docs.ceph.org.cn/

另请参阅

ceph(8),rados(8)