注意

本文档适用于 Ceph 开发版本。

Librbd (Python)

The rbd该 Python 模块为 RBD 图像提供类似文件的访问。

示例:创建并向镜像写入

要使用rbd,您必须首先连接到 RADOS 并打开一个 IO 上下文:

cluster = rados.Rados(conffile='my_ceph.conf')
cluster.connect()
ioctx = cluster.open_ioctx('mypool')

然后,您实例化一个 :class:rbd.RBD 对象,您使用它来创建图像:

rbd_inst = rbd.RBD()
size = 4 * 1024**3  # 4 GiB
rbd_inst.create(ioctx, 'myimage', size)

要在图像上执行 I/O,您实例化一个 :class:rbd.Image 对象:

image = rbd.Image(ioctx, 'myimage')
data = b'foo' * 200
image.write(data, 0)

这将 'foo' 写入图像的前 600 个字节。请注意,数据不能是 :type:unicode -Librbd不知道如何处理比 :c:type:char 更宽的字符。

最后,您将想要关闭图像、IO 上下文和到 RADOS 的连接:

image.close()
ioctx.close()
cluster.shutdown()

为了安全起见,每个调用都需要在一个单独的 :finally 块中:

cluster = rados.Rados(conffile='my_ceph_conf')
try:
    cluster.connect()
    ioctx = cluster.open_ioctx('my_pool')
    try:
        rbd_inst = rbd.RBD()
        size = 4 * 1024**3  # 4 GiB
        rbd_inst.create(ioctx, 'myimage', size)
        image = rbd.Image(ioctx, 'myimage')
        try:
            data = b'foo' * 200
            image.write(data, 0)
        finally:
            image.close()
    finally:
        ioctx.close()
finally:
    cluster.shutdown()

这可能很繁琐,所以可以使用Rados, Ioctx, and Image类作为上下文管理器,自动关闭/关闭(请参阅PEP 343)。使用它们作为上下文管理器,上面的示例变为:

with rados.Rados(conffile='my_ceph.conf') as cluster:
    with cluster.open_ioctx('mypool') as ioctx:
        rbd_inst = rbd.RBD()
        size = 4 * 1024**3  # 4 GiB
        rbd_inst.create(ioctx, 'myimage', size)
        with rbd.Image(ioctx, 'myimage') as image:
            data = b'foo' * 200
            image.write(data, 0)

API 参考

该模块是 librbd 的一个薄包装器。

它目前提供所有不使用回调的 librbd 同步方法。

librbd 的错误代码转换为继承自Error的异常。几乎所有的方法都可能引发Error(所有 rbd 异常的基类),除了为该方法文档化的那些。PermissionErrorIOError, in addition to those documented for the method.

class rbd.Image(ioctx, name=, 快照=, read_only=False, image_id=, _oncomplete=)

该类表示一个 RBD 图像。它用于在图像上执行 I/O 并与快照交互。

Note: 如果图像已被删除,该类的任何方法都可能引发ImageNotFound

close(self)

释放该图像对象使用的资源。

调用此方法后,不应使用此对象。

require_not_closed(self)

检查 Image 是否未关闭

Raises:

InvalidArgument

class rbd.RBD

该类包装 librbd CRUD 函数。

aio_open_image(self, oncomplete, ioctx, name=, 快照=, read_only=False, image_id=)

异步打开给定快照处的图像。指定名称或 ID,否则InvalidArgument

oncomplete 将调用创建的 Image 对象以及完成:

oncomplete(completion, image)

如果指定了快照,图像将只读,除非Image.set_snap()被稍后调用。

如果使用只读模式,对象的元数据(例如,哪些快照存在)可能会过时。有关更多详细信息,请参阅 C API。Image object (such as which snapshots exist) may become obsolete. See the C api for more details.

要清理打开图像,应调用Image.close()Image.aio_close()

参数:
  • oncomplete (completion) -- 打开完成时要做什么

  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池中的图像

  • name (字符串) -- 图像的名称

  • 快照 (字符串) -- 从哪个快照读取

  • read_only (bool) -- 是否以只读模式打开图像

  • image_id (字符串) -- 图像的 ID

返回:

Completion- 完成对象

clone(self, p_ioctx, p_name, p_snapshot, c_ioctx, c_name, features=, order=, stripe_unit=, stripe_count=, data_pool=, clone_format=)

将父 rbd 快照克隆到 COW 稀疏子图像中。

参数:
  • p_ioctx-- 表示父快照的父上下文

  • p_name-- 父图像名称

  • p_snapshot-- 父图像快照名称或 ID

  • c_ioctx-- 表示新克隆的子上下文

  • c_name-- 克隆(子)名称

  • features (int) -- 要启用的功能掩码;如果设置,必须包括分层

  • order (int) -- 图像被分成 (2**order) 字节对象

  • stripe_unit (int) -- 字节中的条带单元(默认为 None,让 librbd 决定)

  • stripe_count (int) -- 在循环之前要条带的对象

  • data_pool (字符串) -- 可选的单独数据块池

  • clone_format (int) -- 1(需要受保护的快照),2(需要 mimic+ 客户端)

Raises:

TypeError

Raises:

InvalidArgument

Raises:

ImageExists

Raises:

FunctionNotSupported

Raises:

ArgumentOutOfRange

config_get(self, ioctx, key)

获取池级配置覆盖。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被读取

  • key (字符串) -- 键

返回:

str - 值

config_list(self, ioctx)

列出池级配置覆盖。

返回:

ConfigPoolIterator

config_remove(self, ioctx, key)

移除池级配置覆盖。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被读取

  • key (字符串) -- 键

返回:

str - 值

config_set(self, ioctx, key, )

获取池级配置覆盖。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被读取

  • key (字符串) -- 键

  • (字符串) -- 值

创建(self, ioctx, name, size定位特定驱动器容量:, order=, old_format=False, features=, stripe_unit=, stripe_count=, data_pool=)

创建一个 rbd 图像。

参数:
  • ioctx (rados.Ioctx) -- 创建图像的上下文

  • name (字符串) -- 图像的名称

  • size定位特定驱动器容量: (int) -- 图像的大小(以字节为单位)

  • order (int) -- 图像被分成 (2**order) 字节对象

  • old_format (bool) -- 是否创建一个旧式图像,旧式图像可以被旧客户端访问,但不能使用分层等高级功能。

  • features (int) -- 要启用的功能掩码

  • stripe_unit (int) -- 字节中的条带单元(默认为 None,让 librbd 决定)

  • stripe_count (int) -- 在循环之前要条带的对象

  • data_pool (字符串) -- 可选的单独数据块池

Raises:

ImageExists

Raises:

TypeError

Raises:

InvalidArgument

Raises:

FunctionNotSupported

features_from_string(self, str_features)

从 str 获取功能掩码,如果 str_features 为空,它将返回 RBD_FEATURES_DEFAULT。

参数:

str_features (字符串) -- 功能 str

返回:

int - 图像的功能掩码

Raises:

InvalidArgument

features_to_string(self, features)

将功能掩码转换为 str。

参数:

features (int) -- 功能掩码

返回:

str - 图像的功能 str

Raises:

InvalidArgument

group_create(self, ioctx, name)

创建一个组。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被使用

  • name (字符串) -- 组的名称

Raises:

ObjectExists

Raises:

InvalidArgument

Raises:

FunctionNotSupported

group_list(self, ioctx)

列出组。

参数:

ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被读取

返回:

list -- 组名称列表

Raises:

FunctionNotSupported

group_remove(self, ioctx, name)

删除一个 RBD 组。这可能需要很长时间,因为它不会返回,直到组中的每个图像都已从组中删除。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池中的组

  • name (字符串) -- 要删除的组的名称

Raises:

ObjectNotFound

Raises:

InvalidArgument

Raises:

FunctionNotSupported

group_rename(self, ioctx, src, dest)

重命名一个 RBD 组。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池中的组

  • src (字符串) -- 组的当前名称

  • dest (字符串) -- 组的新名称

Raises:

ObjectExists

Raises:

ObjectNotFound

Raises:

InvalidArgument

Raises:

FunctionNotSupported

列表(self, ioctx)

列出图像名称。

参数:

ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被读取

返回:

list -- 图像名称列表

list2(self, ioctx)

迭代池中的图像。

参数:

ioctx (rados.Ioctx) -- 确定哪个 RADOS 池中的图像

返回:

ImageIterator

migration_abort(self, ioctx, image_name, on_progress=)

取消先前启动但中断的迁移。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池中的图像

  • image_name (字符串) -- 图像的名称

  • on_progress (回调函数) -- 可选的进度回调函数

Raises:

ImageNotFound

migration_commit(self, ioctx, image_name, on_progress=)

提交执行的 RBD 图像迁移。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池中的图像

  • image_name (字符串) -- 图像的名称

  • on_progress (回调函数) -- 可选的进度回调函数

Raises:

ImageNotFound

migration_execute(self, ioctx, image_name, on_progress=)

执行准备好的 RBD 图像迁移。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池中的图像

  • image_name (字符串) -- 图像的名称

  • on_progress (回调函数) -- 可选的进度回调函数

Raises:

ImageNotFound

migration_prepare(self, ioctx, image_name, dest_ioctx, dest_image_name, features=, order=, stripe_unit=, stripe_count=, data_pool=, clone_format=, flatten=False)

准备一个 RBD 图像迁移。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池中的图像

  • image_name-- 图像的当前名称

  • dest_ioctx (rados.Ioctx) -- 确定要迁移到的池

  • dest_image_name (字符串) -- 目标图像的名称(可以是同一图像)

  • features (int) -- 要启用的功能掩码;如果设置,必须包括分层

  • order (int) -- 图像被分成 (2**order) 字节对象

  • stripe_unit (int) -- 字节中的条带单元(默认为 None,让 librbd 决定)

  • stripe_count (int) -- 在循环之前要条带的对象

  • data_pool (字符串) -- 可选的单独数据块池

  • clone_format (int) -- 如果源图像是克隆,则为目标图像使用哪种克隆格式

  • flatten (bool) -- 如果源图像是克隆,是否要展平目标图像或使其成为同一父级的克隆

Raises:

TypeError

Raises:

InvalidArgument

Raises:

ImageExists

Raises:

FunctionNotSupported

Raises:

ArgumentOutOfRange

migration_prepare_import(self, source_spec, dest_ioctx, dest_image_name, features=, order=, stripe_unit=, stripe_count=, data_pool=)

准备一个 RBD 图像迁移。

参数:
  • source_spec (字符串) -- JSON 编码的 source-spec

  • dest_ioctx (rados.Ioctx) -- 确定要迁移到的池

  • dest_image_name (字符串) -- 目标图像的名称(可以是同一图像)

  • features (int) -- 要启用的功能掩码;如果设置,必须包括分层

  • order (int) -- 图像被分成 (2**order) 字节对象

  • stripe_unit (int) -- 字节中的条带单元(默认为 None,让 librbd 决定)

  • stripe_count (int) -- 在循环之前要条带的对象

  • data_pool (字符串) -- 可选的单独数据块池

Raises:

TypeError

Raises:

InvalidArgument

Raises:

ImageExists

Raises:

FunctionNotSupported

Raises:

ArgumentOutOfRange

migration_status(self, ioctx, image_name)

返回 RBD 图像迁移状态。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池中的图像

  • image_name (字符串) -- 图像的名称

返回:

dict - 包含以下键:

  • source_pool_id(int) - 源图像池 ID

  • source_pool_namespace(str) - 源图像池命名空间

  • source_image_name(str) - 源图像名称

  • source_image_id(str) - 源图像 ID

  • dest_pool_id(int) - 目标图像池 ID

  • dest_pool_namespace(str) - 目标图像池命名空间

  • dest_image_name(str) - 目标图像名称

  • dest_image_id(str) - 目标图像 ID

  • state(int) - 当前迁移状态

  • state_description(str) - 迁移状态描述

Raises:

ImageNotFound

mirror_image_info_list(self, ioctx, mode_filter=)

迭代池的镜像图像实例 ID。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被读取

  • mode_filter-- 列出此图像镜像模式中的图像

返回:

MirrorImageInfoIterator

mirror_image_instance_id_list(self, ioctx)

迭代池的镜像图像实例 ID。

参数:

ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被读取

返回:

MirrorImageInstanceIdIterator

mirror_image_status_list(self, ioctx)

迭代池的镜像图像状态。

参数:

ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被读取

返回:

MirrorImageStatusIterator

mirror_image_status_summary(self, ioctx)

获取池的镜像图像状态摘要。

参数:

ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被读取

返回:

list - (状态,计数) 元组列表

mirror_mode_get(self, ioctx)

获取池镜像模式。

参数:

ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被读取

返回:

int - 池镜像模式

mirror_mode_set(self, ioctx, mirror_mode)

设置池镜像模式。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被写入

  • mirror_mode (int) -- 要设置的镜像模式

mirror_peer_add(self, ioctx, site_name, client_name, direction=RBD_MIRROR_PEER_DIRECTION_RX_TX)

添加镜像对等体。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被使用

  • site_name (字符串) -- 镜像对等体站点名称

  • client_name (字符串) -- 镜像对等体客户端名称

  • direction (int) -- 镜像的方向

返回:

str - 对等体 UUID

mirror_peer_bootstrap_create(self, ioctx)

为外部集群创建一个新的 RBD 镜像引导令牌。

参数:

ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被写入

返回:

str - 引导令牌

mirror_peer_bootstrap_import(self, ioctx, direction, token)

从外部集群导入引导令牌以自动配置镜像对等体。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被写入

  • direction (int) -- 镜像对等体方向

  • token (字符串) -- 引导令牌

mirror_peer_get_attributes(self, ioctx, uuid)

获取可选镜像对等体属性

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被写入

  • uuid (字符串) -- 镜像对等体的 UUID

返回:

dict - 包含以下键:

  • mon_host(str) - 监控地址

  • key(str) - CephX 密钥

mirror_peer_list(self, ioctx)

迭代池的对等体。

参数:

ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被读取

返回:

MirrorPeerIterator

mirror_peer_remove(self, ioctx, uuid)

移除镜像对等体。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被使用

  • uuid (字符串) -- 对等体 UUID

mirror_peer_set_attributes(self, ioctx, uuid, attributes)

设置可选镜像对等体属性

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被写入

  • uuid (字符串) -- 镜像对等体的 UUID

  • attributes (字典) -- ‘mon_host’ 和 ‘key’ 属性

mirror_peer_set_client(self, ioctx, uuid, client_name)

设置镜像对等体客户端名称

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被写入

  • uuid (字符串) -- 镜像对等体的 UUID

  • client_name (字符串) -- 要设置的镜像对等体客户端名称

mirror_peer_set_cluster(self, ioctx, uuid, cluster_name)
mirror_peer_set_name(self, ioctx, uuid, site_name)

设置镜像对等体站点名称

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被写入

  • uuid (字符串) -- 镜像对等体的 UUID

  • site_name (字符串) -- 要设置的镜像对等体站点名称

mirror_remote_namespace_get(self, ioctx)

获取镜像远程命名空间

参数:

ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被读取

返回:

str - 镜像远程命名空间

mirror_remote_namespace_set(self, ioctx, remote_namespace)

设置镜像远程命名空间

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被写入

  • remote_namespace-- 要镜像到的远程集群命名空间

mirror_site_name_get(self, rados)

获取本地集群的友好站点名称

参数:

rados-- 集群连接

返回:

str - 本地站点名称

mirror_site_name_set(self, rados, site_name)

设置本地集群的友好站点名称

参数:
  • rados-- 集群连接

  • site_name-- 友好站点名称

mirror_uuid_get(self, ioctx)

获取池镜像 UUID

参数:

ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被读取

返回:

ste - 池镜像 UUID

namespace_create(self, ioctx, name)

在池内创建一个 RBD 命名空间

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池

  • name (字符串) -- 命名空间名称

namespace_exists(self, ioctx, name)

验证池内是否存在命名空间

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池

  • name (字符串) -- 命名空间名称

返回:

bool - 如果命名空间存在则为 true

namespace_list(self, ioctx)

列出池中的所有命名空间

参数:

ioctx (rados.Ioctx) -- 确定哪个 RADOS 池

返回:

list - 命名空间名称集合

namespace_remove(self, ioctx, name)

从池中删除一个 RBD 命名空间

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池

  • name (字符串) -- 命名空间名称

pool_init(self, ioctx, force)

初始化一个 RBD 池rados.Ioctx:param force: 强制初始化

pool_metadata_get(self, ioctx, key)

获取给定键的池元数据。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被读取

  • key (字符串) -- 元数据键

返回:

str - 元数据值

pool_metadata_list(self, ioctx)

列出池元数据。

返回:

PoolMetadataIterator

pool_metadata_remove(self, ioctx, key)

移除给定键的池元数据。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被读取

  • key (字符串) -- 元数据键

返回:

str - 元数据值

pool_metadata_set(self, ioctx, key, )

为给定键设置池元数据。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池被读取

  • key (字符串) -- 元数据键

  • (字符串) -- 元数据值

pool_stats_get(self, ioctx)

返回 RBD 池统计信息

参数:

ioctx (rados.Ioctx) -- 确定哪个 RADOS 池

返回:

dict - 包含以下键:

  • image_count(int) - 图像计数

  • image_provisioned_bytes(int) - 图像总 HEAD 提供的字节数

  • image_max_provisioned_bytes(int) - 图像总最大提供字节数

  • image_snap_count(int) - 图像快照计数

  • trash_count(int) - 丢弃图像计数

  • trash_provisioned_bytes(int) - 丢弃图像总 HEAD 提供的字节数

  • trash_max_provisioned_bytes(int) - 丢弃图像总最大提供字节数

  • trash_snap_count(int) - 丢弃快照计数

删除(self, ioctx, name, on_progress=)

删除一个 RBD 图像。这可能需要很长时间,因为它不会返回,直到组成图像的每个对象都已删除。请注意,必须先删除所有快照才能删除图像。如果还有快照剩余,ae6ce6: 将引发。如果图像仍然打开,或者崩溃客户端的监视器尚未过期,6132b0: ) -- 确定哪个 RADOS 池中的图像ImageHasSnapshots is raised. If the image is still open, or the watch from a crashed client has not expired, ImageBusy

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池中的图像

  • name (字符串) -- 要删除的图像的名称

  • on_progress (回调函数) -- 可选的进度回调函数

Raises:

ImageNotFound, ImageBusy, ImageHasSnapshots

rename(self, ioctx, src, dest)

重命名一个 RBD 图像。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池中的图像

  • src (字符串) -- 图像的当前名称

  • dest (字符串) -- 图像的新名称

Raises:

ImageNotFound, ImageExists

trash_get(self, ioctx, image_id)

从丢弃中检索 RBD 图像信息。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池中的图像

  • image_id (字符串) -- 要恢复的图像的 ID

返回:

dict - 包含以下键:

  • id(str) - 图像 ID

  • name(str) - 图像名称

  • source(str) - 删除的来源

  • deletion_time(datetime) - 删除时间

  • deferment_end_time(datetime) - 允许从丢弃中删除图像的时间

Raises:

ImageNotFound

trash_list(self, ioctx)

List all entries from trash.

参数:

ioctx (rados.Ioctx) -- 确定哪个 RADOS 池中的图像

返回:

TrashIterator

trash_move(self, ioctx, name, delay=0)

将 RBD 图像移动到丢弃中。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池中的图像

  • name (字符串) -- 要删除的图像的名称

  • delay (int) -- 图像可以从丢弃中删除的时间延迟(秒)

Raises:

ImageNotFound

trash_purge(self, ioctx, expire_ts=, threshold=-1)

批量删除丢弃中的 RBD 图像。

默认情况下,它删除 deferment 结束时间小于当前时间的图像。aff7a0: 时间戳是可配置的,例如,删除一周前过期的图像。

The timestamp is configurable, e.g. delete images that have expired a week ago.

如果使用阈值,它将删除图像直到 X% 池使用率被满足。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池中的图像

  • expire_ts (datetime) -- 要视为过期的图像的时间戳(UTC)

  • threshold (float) -- 要满足的池使用率百分比(0 到 1)

trash_remove(self, ioctx, image_id, force=False, on_progress=)

从丢弃中删除 RBD 图像。如果图像延期时间尚未过期PermissionError

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池中的图像

  • image_id (字符串) -- 要删除的图像的 ID

  • force (bool) -- 即使延期时间尚未过期也要强制删除

  • on_progress (回调函数) -- 可选的进度回调函数

Raises:

ImageNotFound, PermissionError

trash_restore(self, ioctx, image_id, name)

从丢弃中恢复 RBD 图像。

参数:
  • ioctx (rados.Ioctx) -- 确定哪个 RADOS 池中的图像

  • image_id (字符串) -- 要恢复的图像的 ID

  • name (字符串) -- 恢复图像的新名称

Raises:

ImageNotFound

version(self)

获取 C 库的版本号。librbda元组

返回:

libcephfs 版本的组件(major, minor, extra)librbd 版本组件的

class rbd.SnapIterator(Image image)

迭代图像的快照信息。

生成包含快照信息的字典。

键是:

  • id(int) - 快照的数字标识符

  • size(int) - 快照时图像的大小(以字节为单位)

  • name(str) - 快照的名称

  • namespace(int) - 快照命名空间枚举

  • group(dict) - 可选的组命名空间快照

  • trash(dict) - 可选的丢弃命名空间快照

  • mirror(dict) - 可选的镜像命名空间快照

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.