注意

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

CephFS Directory Entry Name Normalization and Case Folding

CephFS 允许配置目录树以规范化并可能大小写折叠目录项名称。这通常是对于像 Samba 这样的网关导出的文件系统的一个有用属性,这些文件系统强制执行大小写不敏感的文件系统视图,通常会对大小写敏感的文件系统产生性能损失。

以下虚拟扩展属性控制目录项的字符映射规则:

  • ceph.dir.casesensitive: 目录的大小写敏感性的布尔设置。如果为 true,则大小写折叠目录项名称。

  • ceph.dir.normalization: 用于目录项名称的 Unicode 规范化类型的字符串设置。目前客户端理解 D (nfd), C (nfc), KD (nfkd)和 KC (nfkc)规范化形式。

  • ceph.dir.encoding: 用于目录项名称的编码的字符串设置。默认值和目前唯一支持的编码是 UTF-8 (utf8).

)。

  • ceph.dir.charmap: 目录的完整字符映射配置。

它也可以用来删除所有设置并恢复目录项名称的默认 CephFS 行为/以 NUL 结尾。

目录必须为空。

  • 目录不能是快照的一部分。

  • The directory must not be part of a snapshot.

在具有配置的目录下创建的新子目录将charmap继承(复制)父目录的配置。

Note

charmap 配置仅适用于目录中的条目,而不是目录本身的名称。

Note

您可以移除一个charmap在继承了配置的子目录上,只要满足先决条件:它是空的

警告

charmap 不应用于快照名称。快照名称始终是大小写敏感的,并且不会被规范化。

规范化

The ceph.dir.normalization属性接受以下规范化形式:

  • nfd: 形式 D (规范分解)

  • nfc: 形式 C (规范分解,然后是规范合成)

  • nfkd: 形式 KD (兼容性分解)

  • nfkc: 形式 KC (兼容性分解,然后是规范合成)

字符映射配置的默认规范化是nfd.

Note

更多关于 Unicode 规范化形式的信息,请参阅Unicode 规范化标准文档.

客户端将在向 MDS 提交任何操作之前将规范化应用于名称。在 MDS 端,存储的目录项名称仅是这些规范化名称。

例如,要在目录上设置规范化:

$ setfattr -n ceph.dir.normalization -v "" foo/

$ getfattr -n ceph.dir.charmap foo/
# file: foo/
ceph.dir.charmap="{\"casesensitive\":true,\"normalization\":\"nfd\",\"encoding\":\"utf8\"}"

$ getfattr -n ceph.dir.normalization foo/
# file: foo/
ceph.dir.normalization="nfd"

Note

设置空字符串会导致 MDS 选择默认规范化。

所有字符映射配置必须启用规范化。移除规范化将导致默认值被恢复:

$ setfattr -n ceph.dir.normalization -v nfc foo/
$ getfattr -n ceph.dir.normalization foo/
# file: foo/
ceph.dir.normalization="nfc"

$ setfattr -x ceph.dir.normalization foo/
$ getfattr -n ceph.dir.normalization foo/
# file: foo/
ceph.dir.normalization="nfd"

要移除目录上的规范化,您必须移除ceph.dir.charmapconfiguration.

Note

The MDS maintains analternate_name元数据(也用于加密)用于目录项,允许客户端持久化应用程序使用的原始未规范化名称。MDS 不会以任何方式解释此元数据;它仅由客户端用于重建目录项的原始名称。

大小写折叠

The ceph.dir.casesensitive名称是大小写敏感的(POSIX 文件系统中的正常情况)。将此值设置为 false 将使目录中的命名条目(及其子目录)大小写不敏感。

将是:charmap will be:

$ setfattr -n ceph.dir.casesensitive -v 0 foo/
$ getfattr -n ceph.dir.casesensitive foo/
# file: foo/
ceph.dir.casesensitive="0"

$ getfattr -n ceph.dir.charmap foo/
# file: foo/
ceph.dir.charmap="{\"casesensitive\":false,\"normalization\":\"nfd\",\"encoding\":\"utf8\"}"

注意,设置目录的大小写敏感性会导致选择默认规范化。

Note

规范化在大小写折叠之前应用。MDS 使用的目录项名称是大小写折叠和规范化的名称。

移除字符映射

可以被移除:charmap can be removed:

$ setfattr -x ceph.dir.charmap foo/

可以确认这恢复了正常的 CephFS 行为:

$ getfattr -n ceph.dir.charmap foo/
foo/: ceph.dir.charmap: No such attribute

如果属性不存在,则目录没有字符映射。注意,一个(未来的)子目录或父目录可能有 charmap 配置,但它对此目录没有影响。charmap 配置仅在目录创建时继承。

Note

默认 charmap 包括无法禁用的规范化。唯一关闭此功能的方法是移除charmap虚拟扩展属性。

限制不兼容客户端访问

MDS 通过新的客户端功能位保护具有charmap的目录树的访问。MDS 将不允许不理解charmap功能的客户端修改具有charmap配置的目录,除了删除文件或删除子目录。

您也可以要求所有客户端理解charmap功能才能使用文件系统:

ceph fs required_client_features <fs_name> add charmap

Note

内核驱动程序不理解charmap功能,并且可能不会理解,因为现有的内核库有意见领袖的大小写折叠和规范化形式。因此,不建议将charmap添加到必需的客户端功能中。

权限

与其他 CephFS 虚拟扩展属性一样,客户端只能使用charmap配置。查看配置不需要此能力。pMDS 认证能力在目录上设置

由 Ceph 基金会带给您

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