注意
本文档适用于 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.charmap
configuration.
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. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.