如果我使用默认参数格式化 1TB 磁盘,那么每个文件系统的根目录中最多可以存储多少个文件?
编辑:我确实搜索了信息,但没有找到任何结果可以回答这个问题。它们回答了文件系统之间的差异、文件系统上可以存储的最大文件数量(包括子目录中的文件)、最大分区大小等问题。
答案1
FAT12/16 是唯一具有不同根目录和子目录限制的文件系统。对于大多数其他文件系统,根目录的存储方式与子目录相同,并且具有相同类型的限制 - 如果根目录还存储“元数据”文件,则只需进行非常小的调整。
FAT12 和 FAT16:各不相同(显然 64–512 是常见的)。来自 Wikipedia,“FAT12 和 FAT16 可用的根目录条目数在格式化卷时确定,并存储在 16 位字段中。对于给定的 RDE 数量和扇区大小 SS,根目录扇区的数量 RDS 为 RDS=ceil((RDE×32)/SS),通常选择 RDE 来填充这些扇区,即 RDE*32=RDS*SS。FAT12 和 FAT16 介质通常在非软盘介质上使用 512 个根目录条目。一些第三方工具(如 mkdosfs)允许用户设置此参数。”
请注意,FAT 使用多变的存储长(非 8.3)文件名的条目数量——因此实际的最大条目数很大程度上取决于文件的实际命名方式。每个不符合 8.3 规范的名称至少需要 1 个 LFN 条目此外到常规的 DOS 兼容 8.3 条目,每个 LFN 条目包含 13 个字符。因此,像“
Hello world!.txt
”这样的名称总共会占用 3 个位置。FAT32:与常规目录相同。根据 Wikipedia,“Microsoft 的 FAT32 实现对每个目录施加了 65,535 个条目的人为限制。”同样,每个非 8.3 名称都必须存储为多个条目。
exFAT:维基百科引用了微软的专利,称“每个目录最多支持 2,796,202 个文件”。与 FAT32 一样,exFAT 中的根目录似乎没有什么特别之处,因此它具有与子目录相同的限制。但是,exFAT 对长文件名的支持更好。
NTFS:另一个 SU 主题说:“没有固定的限制。文件的最大数量是一个上限。这个限制要么是 2^23-1(根据许多驱动程序实现)要么是 2^48 -1(根据 MFT_REF 结构)。由于您将拥有 LARGE 目录,您将看到非常驻 $BITMAP_ALLOCATION 流,一个大的 INDEX 流。索引流本质上是文件名的 B+ 树。”
请注意,NTFS 根目录始终包含大约 15 个隐藏文件,用于存储文件系统的元数据。
Ext2:来自 Wikipedia,“目录中文件数量的理论限制是1.3× 1020 ,虽然这与实际情况无关。[…] ext2 中不提供目录索引,因此对于包含大量文件(>10,000)的目录,存在性能问题。”
此外,Ext2(和 Ext3,但不是 Ext4)对立即子目录由于每个 inode 最多有 32000 个链接,因此在单个目录中无法做到这一点。
Ext4:来自维基百科,“为了允许更大的目录和持续的性能,Linux 2.6.23 及更高版本中的 ext4 默认启用 HTree 索引(B 树的专门版本),这允许目录最多大约1000-1200万存储在 2 级 HTree 索引中的条目和 4 KiB 块大小的 2 GB 目录大小限制(具体取决于文件名长度)。在 Linux 4.12 及更高版本中,该
largedir
功能启用了 3 级 HTree 和超过 2 GB 的目录大小,允许大约60亿单个目录中的条目。”Ext3:老实说,我不确定 Ext3 在哪里结束,Ext4 在哪里开始——这可能仅仅取决于启用了哪些功能。Ext3 有 htree(像 Ext4 一样),但没有“largedir”功能。
由于 FAT 和 Ext2 使用线性文件列表,因此在达到实际条目限制之前,您可能会遇到性能问题。其他文件系统使用更复杂的数据结构来实现更快的文件查找。