ext2/ext3/ext4 文件系统是否有官方规范?

Is there an official specification for the ext2/ext3/ext4 filesystems?

我想知道,对于蓝牙,我们有 IEEE 802.15.1 标准,由蓝牙特别兴趣小组管理。对于 Wifi,我们有 IEEE 802.11 标准和 Wifi 联盟。对于 PCIe 上的 NVMe SSD,我们有 nvmexpress 来规范和发布其官方文档。

因此,通常有一个监管机构来决定事情并标准化一些事情应该如何进行,以允许多个不同实施之间的互操作性。

但对于 ext2/ext3/ext4 文件系统,除了 Linux 内核代码外,我没有找到任何官方标准。

这些文件系统基本上是由内核社区决定的吗?他们是否承诺不更改它们以使其仍与其他操作系统兼容?

或者有什么官方规范吗?谁提供的?

谢谢

很少有文件系统是通过标准委员会标准化的。实际上,承诺不破坏兼容性是因为我们需要保持与旧版本 Linux 的向后兼容性。对于 MacOS、Windows 等也是如此。当 MacOS 无法读取使用 MacOS 10.1 编写的文件系统时,用户会变得胡思乱想10.3等

对于 ext4,我们在超级块中有特征位掩码。当我们添加新功能时,我们在三个功能位掩码之一中定义一个新位:compat、r/o compat、incompat。如果内核在 r/o 兼容位掩码中看到它不知道的位,它现在将允许挂载文件系统 read/write,但它会允许挂载文件系统 [=31] =].如果内核在 incompat 位掩码中看到它不理解的位,那么它根本不允许挂载文件系统。如果 compat 文件系统中设置了内核不理解的位,内核知道无论如何挂载文件系统都是安全的。但是,文件系统一致性检查器 (e2fsck) 和其他一些文件系统实用程序(例如 resize2fs)可能需要更严格的兼容性检查,因此它们不会尝试更改具有某些兼容功能的文件系统它不明白。

实际上,当我们添加一个新功能时,我们会等待一段时间,mke2fs 实用程序才会默认启用该功能。这允许更多喜欢冒险的用户在我们默认为每个人启用之前测试文件系统功能。实际上,其他操作系统只实现了 ext4 功能的一个非常小的子集——最常见的是,ext2/ext3/ext4 的非 Linux 实现大致对应于文件系统功能的一组功能通过 "mke2fs -t ext2 /dev/disk".

启用

这些功能自近四分之一个世纪前首次实施以来一直没有改变。而且它们不会改变,原因很明显,仍然有很多企业仍在使用 RHEL 5,它使用的内核是十多年前发布的,我们非常关心与我们自己以及其他人的向后兼容性操作系统。所以你可以看看 1994 年发表的 "The Design and Implementation of Ext2" (http://web.mit.edu/tytso/www/linux/ext2intro.html) 论文,就基础知识而言,它们没有改变。

当然,我们仍在添加新功能 --- 例如,最近我们添加了文件系统级加密(在 Android 中使用,希望很快 Chrome OS)、项目配额、元数据校验和等到 ext4。这些新特性中的每一个都受到特性标志的保护,并且在 e2fsprogs 源代码分发中分发的当前版本的 mke2fs 中,所有这些特性都没有默认启用。一些社区发行版(例如 Debian)可能会启用某些前沿功能,例如元数据校验和,以便在为所有人(包括更保守的企业用户)启用之前获得更多曝光和测试 Linux分布。

其他操作系统自然不会支持这些最新的尖端功能。但这没关系,因为您还可以使用 "mke2fs -t ext2" 创建一个文件系统,这将更加基本,并且应该很容易用于互操作性。一般而言,人们会使用具有高级功能的文件系统供本机使用,并使用关闭所有高级功能的非常基本的文件系统以进行交换。这就是许多 U 盘使用 FAT 的原因 --- 因为 Linux、Windows 和 MacOS 无需任何特殊处理即可读取 FAT 文件系统。

另一种可能性是最新版本的 e2fsprogs 附带了 ext4 的用户空间文件系统实现,称为 fuse2fs。对于支持 FUSE 的操作系统(包括大多数 BSD 系统以及 MacOS),这是读取 ext4 文件系统的便捷方式。它不会是一个高性能的 read/write 实现,但是对于只想从 ext4 文件系统映像中获取数据的人来说,fuse2fs 工作得很好。