文件系统领域的问题看似已被充分理解,但总有人不断追求更好的解决方案。正因如此,即使经过数十年发展,Linux内核中的文件系统开发依然保持着飞快的节奏。近期,我们有三个值得关注的动态:EROFS正朝着获得实用的页面缓存共享功能迈进,一个全新的NTFS实现即将问世,而XFS则可能很快获得一套自愈基础设施。
EROFS 页面缓存共享
增强只读文件系统(Enhanced Read-Only Filesystem,简称 EROFS),顾名思义,是为只读数据设计的。它支持多种先进特性,并提供高性能的数据压缩。自2019年并入5.4内核版本以来,EROFS一直在稳步发展,其最著名的应用场景之一是在Android设备上。
EROFS的一个常见用例是作为容器镜像的基础层。这导致在一台机器上,同一个EROFS文件系统可能会被挂载多次,并且可能存在多个略有差异的变体。例如,多个镜像可能包含不同的应用组合,但都共享同一个C库。EROFS在创建时能对单个文件系统内的数据进行去重,但对于独立创建的文件系统则无能为力。这可能导致系统中多个打开的文件包含相同数据,在页面缓存(page cache)中造成内存浪费。如果能对这些缓存数据进行去重,无疑将非常理想。
2025年初,Hongzhen Luo发布了一个实现EROFS页面缓存共享的补丁系列。随后,这项工作由Hongbo Li接手,最新的版本已是第18版。其核心思想是:在文件系统创建时为每个文件分配一个“指纹”,用于后续检测包含相同数据的文件。
具体来说,EROFS文件系统内的每个文件都会被赋予一个扩展属性。属性的名称可由创建者设定,但 trusted.erofs.fingerprint 似乎是标准用法。指纹的内容本身并未严格定义。一种合乎逻辑的方法是使用文件内容的加密哈希值,但正如Gao Xiang所说,它也可以只是由镜像创建者分配的一个整数值。关键在于,如果两个文件内容不同,其指纹也必须不同。
当文件系统以 inode_share 选项挂载时,才会启用指纹功能。另一个选项 domain_id 用于隔离用户:只有在同一域ID下挂载的文件才会进行去重。如果没有这种限制,攻击者可能会给包含恶意内容的文件附加任意指纹,导致其他用户读取到恶意数据而非预期的文件内容。
当一个带有指纹的文件被打开时,EROFS代码会创建一个内部索引节点(inode)来引用该文件的数据。用户空间打开的文件在内核中会被重定向到这个去重inode,该inode在内部与指纹关联。后续打开具有相同指纹的文件将直接引用这个去重inode,读取操作也被重定向到其后端存储。这样一来,所有这些文件都将共享页面缓存中相同的folio,从而消除了重复的内存占用。
需要注意的是,在当前实现中,使用指纹功能与直接I/O(direct I/O)是不兼容的。
根据系统运行的工作负载,页面缓存共享在最佳情况下可以将内存使用量减少近一半,这个想法的吸引力不言而喻。该补丁系列历经多次修改,许多评审意见已得到处理,但仍有问题存在。例如,Christoph Hellwig对该功能的安全性影响表示担忧。因此,尽管已迭代至第18版,但在功能被合并前,可能还需要更多的调整。
新的 NTFS 实现
NTFS是Windows的标准文件系统格式。人们通常认为,长期致力于互操作性的Linux应该拥有一个优秀的NTFS实现,但这个愿望一直未能完全实现。多年来,内核仅支持NTFS的只读访问。想要完全读写NTFS文件系统的Linux用户只能依赖在用户空间FUSE框架下运行的 ntfs-3g。
2021年 ntfs3 驱动的出现似乎改变了这一局面。它提供了完整的NTFS访问权限,看似满足了社区的期待,尽管当时就有人担心其背后的支持可能不够持续。ntfs3 在5.15版本中被合并,而原有的只读NTFS文件系统则在2024年的6.9版本中从内核移除。
对 ntfs3 维护状况的担忧部分已成现实。自合并以来,ntfs3 代码的更新频率远低于预期。在合并后的几个版本中,仅有零星补丁。尽管在6.0版本前后更新节奏有所加快,但最近又有所放缓。过去一年中,fs/ntfs3 目录下的67次提交里,许多并非由其维护者Konstantin Komarov完成,而是其他开发者为适配内核其他部分的变更而进行的修补。
2025年10月,Namjae Jeon提出了一个名为 ntfsplus 的替代NTFS实现,后来更名为 ntfs,与旧的只读实现同名。Jeon表示,这项工作的动机是 ntfs3 存在诸多问题且维护不善;新的 ntfs 旨在成为一个维护更好、功能更全的实现。该补丁集的第五个修订版已于1月11日发布。
该系列首先撤销了对只读NTFS文件系统的移除。Jeon认为,这段代码更加简洁且注释详尽,比 ntfs3 代码库更适合作为持续开发的基础。随后,补丁系列添加了将该文件系统转变为真正读写实现所需的代码,最后移除了 ntfs3 中用于模拟旧只读实现的兼容性代码。
Jeon列举了新实现的多个优势:它使用现代的iomap层与内存管理和块子系统交互(相比之下,ntfs3 仍在使用较旧的缓冲头接口)。此外,还有一个配套项目正在开发文件系统检查器。Jeon声称,新实现通过的 fstests 测试比 ntfs3 多得多,一系列基准测试显示其性能也优于 ntfs3,在某些工作负载下性能提升甚至高达110%。
补丁集在邮件列表上迅速演进,许多评审意见已得到处理。新文件系统在功能上已基本完备,但有一个显著例外:目前尚不支持日志功能(journaling)。而 ntfs3 实现能够回放现有日志(尽管Jeon表示该功能在测试中未能正常工作)。根据补丁系列的说明,下一步将提供完整的日志支持。
内核社区通常对同一功能的多种实现兴趣不大,更倾向于看到渐进式改进而非推倒重来,这为新实现的接纳设置了障碍。即便如此,新代码似乎正在赢得部分文件系统开发者的支持。虽然评审意见很多,但大多旨在改进代码,而非质疑其存在的必要性。再次更换NTFS实现将是一个重大举措,但目前看来并非完全不可能。
XFS 自愈基础设施
XFS文件系统通常与大型系统关联,旨在为多CPU环境中的海量文件提供卓越的扩展性。运行这类系统的组织也极度关注可靠性与数据完整性。近期,Darrick Wong为XFS提出了一套“自主自愈基础设施”,这正是该领域大量工作的一部分。
这套基于内核的基础设施本身并不直接修复有问题的文件系统。它主要是一个报告机制,用于告知用户空间守护进程系统出现的问题。至于如何应对特定问题,决策权留给用户空间。守护进程可能会选择杀死并重启容器、启动某种扫描(scrub)操作,或尝试其他纠错方式。无论如何,这涉及到复杂的策略决策,最好在内核之外完成。
该系列添加了一个新的ioctl操作 XFS_IOC_HEALTH_MONITOR。具有适当权限的进程调用此操作将获得一个文件描述符。每当发生值得关注的事件时,一个描述事件的结构体就会被写入该描述符,供用户空间读取并做出反应。
可报告的事件类型多样,首先是 unmount 事件,表示文件系统已卸载且不会产生更多事件。另有一组事件用于报告元数据损坏,分为运行时发现的“病态”(sick)元数据和由文件系统检查器检测到的“损坏”(corrupt)元数据。其他事件则报告介质错误和I/O错误。该系列还增加了一个ioctl操作,用于检查给定的文件描述符是否指向被监控文件系统上的文件,这可以帮助用户空间守护进程确认自己正在正确的文件系统上运行。
在用户空间方面,Wong提供了一个包含 xfs_healer 程序的代码库,旨在利用新的内核接口。这个工具目前仍处于早期阶段。
内核补丁系列目前处于第六个修订版,且似乎趋于稳定,可能不久后就会进入主线。然而,要让用户空间代码发展到足以让管理员信任其能在活跃的生产文件系统上运行,可能还需要更长的时间。
LWN 评论概述
读者们对这些进展看法不一。针对新的NTFS实现,有用户质疑在安全意识增强的今天,是否有必要为性能而放弃像 ntfs-3g 这样成熟的FUSE方案,转而使用可能增加攻击面的内核态驱动。对于XFS的自愈功能,有开发者提醒该功能目前仍处于极具实验性的阶段,并讨论了开启高级修复功能(如反向映射)的方法。此外,讨论还涉及微软可能用ReFS逐渐取代NTFS的趋势,以及对ZFS和Btrfs等现代COW(写时复制)文件系统当前状态和可靠性的疑问。
文件系统作为计算机基础中存储管理的核心,其每一次演进都深刻影响着系统性能与数据安全。从EROFS针对容器场景的内存优化,到NTFS为提升兼容性与维护性的重构,再到XFS面向大型关键系统的自愈能力建设,都体现了Linux社区对技术前沿的持续探索。如果你想了解更多操作系统或网络/系统底层的深度讨论,欢迎关注云栈社区的技术动态。