如何在给定目录上为 ext4 启用内核 5.2 中的新功能不区分大小写?

如何在给定目录上为 ext4 启用内核 5.2 中的新功能不区分大小写?

我看到内核 5.2 通过翻转+Finode 中的一点来处理每个目录的 ext4 不区分大小写。

当通过翻转 +F inode 属性启用空目录时,此 EXT4 不区分大小写的文件名查找功能在每个目录的基础上工作。

https://www.phoronix.com/scan.php?page=news_item&px=EXT4-Case-Insensitive-Linux-5.2

但如何做到这一点呢?有 chmod 可以处理这个问题吗?我的发行版看起来不是这样。

那么我该如何使用这个功能呢?

答案1

首先你需要足够新的软件:

安装后,文档来自man ext4确实反映了这个特性的存在:

折页

此 ext4 功能为目录提供文件系统级字符编码支持折页 (+F) 标志已启用。此功能在磁盘上保留名称,但它允许应用程序使用文件名的编码等效版本在文件系统中查找文件。

折页必须首先将功能作为文件系统范围的 ext4 选项启用。遗憾的是,我无法在已经格式化的文件系统上启用它。因此,使用创建的稀疏文件来dd if=/dev/zero of=/tmp/image.raw bs=1 count=1 seek=$((2**32-1))测试新创建的文件系统。

# tune2fs -O casefold /tmp/image.raw 
tune2fs 1.45.3 (14-Jul-2019)
Setting filesystem feature 'casefold' not supported.
#

更新: 自从这次提交可以用来tune2fs启用折页在未挂载的文件系统上。当编写此答案时,此功能尚不可用:

# tune2fs -O casefold /tmp/image.raw
tune2fs 1.47.0 (5-Feb-2023)
#

因此,在格式化时,这将启用该功能:

# mkfs.ext4 -O casefold /tmp/image.raw 

或指定其他编码而不是默认编码(UTF8)。看来目前只有utf8-12.1, 其中UTF8无论如何都是一个别名:

# mkfs.ext4 -E encoding=utf8-12.1 /tmp/image.raw 

您可以验证使用tune2fs 做了什么:

# tune2fs -l /tmp/image.raw |egrep 'features|encoding'
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg casefold sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
Character encoding:       utf8-12.1

现在使用该功能:

# mount -o loop /tmp/image.raw /mnt
# mkdir /mnt/caseinsensitivedir
# chattr +F /mnt/caseinsensitivedir
# touch /mnt/caseinsensitivedir/camelCaseFile
# ls /mnt/caseinsensitivedir/
camelCaseFile
# ls /mnt/caseinsensitivedir/camelcasefile
/mnt/caseinsensitivedir/camelcasefile
# mv /mnt/caseinsensitivedir/camelcasefile /mnt/caseinsensitivedir/Camelcasefile
mv: '/mnt/caseinsensitivedir/camelcasefile' and '/mnt/caseinsensitivedir/Camelcasefile' are the same file

相关内容