注意

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

CephFS 目录条目名称规范化与大小写折叠

CephFS 允许配置目录树以规范化并可能折叠大小写目录条目名称。这对于由像 Samba 这样的网关导出的文件系统来说通常是一个有用的特性,因为这些网关会强制执行文件系统的非大小写敏感视图,而这在非大小写敏感的文件系统上通常会带来性能损失。

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

  • ceph.dir.casesensitive:一个布尔值设置,用于指示目录的大小写敏感性。如果为 true,则对目录条目名称进行大小写折叠。

  • ceph.dir.normalization:一个字符串设置,用于指示对目录条目名称应用的 Unicode 规范化类型。目前客户端支持规范化形式 D (nfd)、C (nfc)、KD (nfkd) 和 KC (nfkc)。

  • ceph.dir.encoding:一个字符串设置,用于指示目录条目名称要使用和强制执行的编码。默认且目前唯一支持的编码是 UTF-8 (utf8)。

还有一个方便的虚拟扩展属性,可用于获取大小写敏感性、规范化和编码配置的 JSON 编码:

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

它也可以用于移除所有设置并恢复 CephFS 目录条目名称的默认行为:不解释字节,不包含 / 且以 NUL 终止。

请注意操纵这些扩展属性的以下限制:

  • 目录必须为空。

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

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

注意

字符映射配置仅适用于目录中的条目,而不适用于目录本身的名称。

注意

只要满足先决条件(目录为空且不是现有快照的一部分),您就可以移除继承了配置的子目录上的 charmap

警告

字符映射不应用于快照名称。快照名称始终大小写敏感且不规范化。

规范化

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

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

  • nfc:形式 C(规范分解,后跟规范组合)

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

  • nfkc:形式 KC(兼容分解,后跟规范组合)

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

注意

有关 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"

注意

设置空字符串将导致 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.charmap 配置。

注意

MDS 为目录条目维护一个 alternate_name 元数据(也用于加密),允许客户端持久化应用程序使用的原始未规范化名称。MDS 不以任何方式解释此元数据;它仅供客户端用于重建目录条目的原始名称。

大小写折叠

ceph.dir.casesensitive 属性接受一个布尔值。默认情况下,名称是大小写敏感的(如 POSIX 文件系统中的常规情况)。将此值设置为 false 将使目录(及其后代目录)中的命名条目大小写不敏感。

大小写折叠要求名称也必须经过规范化。默认情况下,将目录设置为大小写不敏感后,charmap 将为:

$ 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\"}"

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

注意

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

移除字符映射

如果目录为空且不是快照的一部分,则可以移除 charmap

$ setfattr -x ceph.dir.charmap foo/

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

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

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

注意

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

限制不兼容客户端访问

MDS 通过一个新的客户端功能位来保护对具有 charmap 的目录树的访问。MDS 将不允许不理解 charmap 功能的客户端修改具有 charmap 配置的目录,除非是取消链接文件或移除子目录。

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

ceph fs required_client_features <fs_name> add charmap

注意

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

权限

与 CephFS 的其他虚拟扩展属性一样,客户端只能通过 p MDS 身份验证权限设置目录上的 charmap 配置。查看配置不需要此权限。

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入