我看到内核 5.2 通过翻转+F
inode 中的一点来处理每个目录的 ext4 不区分大小写。
当通过翻转 +F inode 属性启用空目录时,此 EXT4 不区分大小写的文件名查找功能在每个目录的基础上工作。
https://www.phoronix.com/scan.php?page=news_item&px=EXT4-Case-Insensitive-Linux-5.2
但如何做到这一点呢?有 chmod 可以处理这个问题吗?我的发行版看起来不是这样。
那么我该如何使用这个功能呢?
答案1
首先你需要足够新的软件:
- Linux 内核 >= 5.2用于 EXT4 中的内核端支持
- 用户层工具:e2fsprogs >= 1.45(例如:在仅发布版本 1.44 的 Debian 10 上,这需要破坏者向后移植)。提供除其他外
mke2fs
(别名mkfs.ext4
),tune2fs
和chattr
。 - 更新:
- 需要 e2fsprogs >= 1.45.7允许启用折页
tune2fs
在创建后未安装的文件系统上使用它。 - 需要 e2fsprogs >= 1.46.6允许禁用 折页
tune2fs
在启用后使用,并且仅当没有目录仍然具有该+F
标志时才使用。 - 还可以使用文件系统加密,这需要 Linux 内核 >= 5.13。
- 需要 e2fsprogs >= 1.45.7允许启用折页
安装后,文档来自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