我想要准备一个 24TB 的磁盘,以便能够在一个目录中包含大量的目录和文件(请不要告诉我改变这个策略,它是一个软件使用的结构,对我们来说是一个黑匣子所以我们无法改变这种方法)。据我充分研究,ext4 文件系统有能力在一个目录中存储数十亿个文件,但应该使用一些特殊的标志和参数来准备。这是我根据我的研究使用的:
sudo mke2fs -T news /dev/sdb1
sudo tune2fs -O dir_index /dev/sdb1
sudo tune2fs -O large_dir /dev/sdb1
sudo tune2fs -O dir_nlink /dev/sdb1
sudo mkdir /hdd
sudo gedit /etc/fstab
- add following to the end of the file:
/dev/sdb1 /hdd ext4 defaults,noatime 0 0
sudo mount /hdd
为了测试结构,我准备了 bash 脚本,在单个目录中创建目录和文件。像这样的东西:
for ((i = 1000000; i <= 200000000; i++))
do
sudo mkdir "/hdd/largedir/$i" -p
sudo cp "sample-file.jpg" "/hdd/largedir/$i"
if (( $i % 1000 == 0 ));
then
echo "$i created";
fi;
done
经过几个小时的工作后,当我检查系统时,它打印出以下错误:
Structure needs cleaning
在我的测试中,它不是为所有文件和目录打印此错误。例如,我可以创建名为“10000”的目录,但无法创建名为“1000”的目录。我还使用以下命令更改了哈希算法:
sudo tune2fs -E "hash_alg=tea" /dev/sdb1
并重新启动并重新安装系统,但问题仍然存在。有谁知道问题是什么以及为什么文件系统上会出现这种情况? ext4 文件系统是否不够强大,无法拥有如此大的结构?我在一些页面上读到过有关使用 xfs 而不是 ext4 来处理大量文件的内容。这是真的吗?
可以看到,在文件操作过程中,系统没有出现断电、死机的情况。当一切正常的时候我没想到会有这样的行为。
-- 已编辑以获取更多信息:--
磁盘的inode信息如下:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 421216256 183643803 237572453 44% /hdd
空间信息如下:
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 26T 3.1T 21T 13% /hdd
我检查了文件系统,它是 ext4(如各种工具所示)。例如,gparted 将分区文件系统显示为 ext4。关于功能,我的 ubuntu 18.04 LTS 上默认未启用上述功能。我在以前的测试中遇到了几个错误,最后达到了这个目的。
答案1
使用该命令,sudo mke2fs -T news /dev/sdb1
您不一定要创建 ext4 文件系统,而是创建一个外部2文件系统。
假设您的 Ubuntu 18.04 具有/etc/mke2fs.conf
与我的 Debian 10 基本相同的文件,那么dir_index
已经启用作为使用现代mke2fs
.并且dir_nlink
默认启用外部4文件系统类型。
手册mke2fs.conf(5)
页说:“如果用户和mke2fs.conf
文件都没有指定默认文件系统类型,mke2fs
则将使用默认文件系统类型外部3如果通过命令行选项请求日志,或者外部2如果不。”
根据该/etc/mke2fs.conf
文件,该-T news
选项只指定了inode_ratio = 4096
选项,没有其他任何内容。因此,除非您使用mkfs.ext4
表单而不是普通表单mke2fs
,否则您可能会得到一个外部2专为平均大小为 4 kB 或更小的文件而定制的文件系统。
Debian 没有fs_type =
在[defaults]
部分中指定mke2fs.conf
,并且您没有包含命令-j
的选项mke2fs
,因此如果 Ubuntu 的选项mke2fs.conf
与 Debian 的相同(通常如此),您的命令可能会为您提供 24 TB外部2文件系统,这可能还没有经过任何人的特别测试。
手册ext4(5)
页说64bit
文件系统功能将根据需要自动设置,这可能解释了为什么这些工具没有报告任何错误。它还表示dir_index
ext2 文件系统会忽略该功能。
根据过去使用多 TBext3
文件系统的经验,我预计文件系统的创建和检查时间会很大。对于您的用例,该功能的存在或不存在dir_index
可能会影响或破坏您的应用程序性能。
您能否将实际tune2fs -l /dev/sdb1
输出编辑为您原来的问题,以便我们无需猜测可能发生或可能未发生的情况?
“结构需要清理”似乎是与EUCLEAN
内核错误代码相对应的默认文本,这表明文件系统已损坏,需要进行文件系统检查。在这种大小的文件系统上,这将需要相当多的时间和 RAM。当然,在检查文件系统时需要将其卸载。
答案2
实际上,经过大量测试后,我发现 ext4 似乎没有能力做这样的事情(在一个目录中保存数十亿个文件)。根据我对如何在 Linux 中执行此操作的研究,结果(实际上也是我的实际测试)表明,对于这种情况,我应该使用 XFS 而不是 ext4,因为 ext4 确实是为了完成此任务而构建的。