由于外部不可避免的情况*,我需要在一个目录中拥有超过 32k 个目录(但据我所知,少于 64k)。我达到了 ext3 的限制。我假设原始服务器正在运行 ReiserFS。备份存储在 S3 中。
我的解决方案是升级到 ext4,根据 Wikipedia:
在 ext3 中,一个目录最多可以有 32,000 个子目录。在 ext4 中,此限制增加到 64,000。
我的问题是:将 fs 安装为 ext4 会自动增加此限制吗?我是否必须运行一些命令才能启用新功能?我是否必须重新创建目录?
* 恢复备份,将信息转换为我们编写的新的、更好的系统
答案1
简短的回答:是的。从 ext3 转换为 ext4 确实可以解决问题。
长答案:
以下是我解决这个问题的方法:
我有一个 5 TB 的 RAID 阵列,分区上大约有 4TB 的数据,达到了此限制。因此我:
运行以下命令将其从 ext3 转换为 ext4:
tune2fs -O extents,uninit_bg,dir_index /dev/DEV
/dev/DEV 对我来说类似于 /dev/sdb1
然后我跑了:
e2fsck -fDC0 /dev/DEV
这需要大约 8 个小时来处理 4TB 的数据。
然后我修改了 /etc/fstab 来告诉它将分区挂载为 ext4。
然后我就跑了
mount /big
其中 /big 是我的分区的名称。它运行完美。
所以要回答你的问题,是的,转换为 ext4 确实解决了这个问题。
在进行此转换之前请阅读以下内容: http://www.debian-administration.org/article/643/Migrating_a_live_system_from_ext3_to_ext4_filesystem
https://ext4.wiki.kernel.org/index.php/Ext4_Howto#Converting_an_ext3_filesystem_to_ext4
答案2
不会,更改 fs 类型并将其挂载为 ext4 不会使 inode 数量变大。这是在文件系统创建时决定的,无法在 ext* fs 中动态更改。
此外,仅通过卸载和安装来转换到 ext4 并不是一个干净且值得推荐的方法。ext3 是基于块的,而 ext4 是基于扩展的,即使您将 ext3 安装为 ext4,它仍将基于块。因此,您无法获得 ext4 的主要优势。
如果您有一个测试系统,您可以尝试进行转换并观察 dumpe2fs 输出。
快速检查了源代码。它是硬编码的。
/*
* Maximal count of links to a file
*/
#define EXT3_LINK_MAX 32000
/*
从include/linux/ext3_fs.h
答案3
原始问题的替代解决方案可能是:每隔几分钟停止恢复过程并检查是否有 10000 个子目录。如果有,则创建一个新目录(可能甚至不在这个目录中),将 10000 个目录移到那里并创建指向它们的符号链接。这样,您就可以获得预期的结构而不会达到 FS 限制。
答案4
我没有完整的答案,但这是我通过实验能得到的最接近的答案。在文件系统上运行此命令后:
tune2fs -O extents,uninit_bg,dir_index /dev/DEV
您可以在一个目录中创建超过 32k 的目录。
我不知道的部分(我现在找不到)是将其安装为 ext4 但启用较少功能是否可以创建超过 32k 的目录。