FAT32、ExFAT、NTFS、EXT2、EXT3 和 EXT4 的根目录中最多可以存储多少个文件?

FAT32、ExFAT、NTFS、EXT2、EXT3 和 EXT4 的根目录中最多可以存储多少个文件?

如果我使用默认参数格式化 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 使用线性文件列表,因此在达到实际条目限制之前,您可能会遇到性能问题。其他文件系统使用更复杂的数据结构来实现更快的文件查找。

相关内容