Linux 70 年老 Bug 终于修复:谷歌砸百万也值得
谷歌为 iouring 支付百万美元赏金后在 Chrome OS 上将其禁用一位维护者称 Rust 为“癌症”并愤而离职。Linux 7.0 正是内核对这两大事件的回应。摄影:Robert Keane,来源:Unsplash七十亿设备。三十五年。 Linux 7.0 是自 2022 年以来首次重大的主版本号提升,而这一次意义非凡。Linux 内核 (Linux kernel) 是连接硬件与你在计算机上一切操作的无形层。它决定了你的手机如何与屏幕通信,也决定了 Netflix 如何将视频流传输到你的电视上。Android 运行于其上。大部分互联网也运行于其上。当内核发生变化时,无论你是否注意到,数十亿设备最终都会感受到它的影响。Linus Torvalds 确认了这次版本号的提升,并以他一贯的风格,将其描述为纯粹的算术问题。“我快要被这些大数字搞糊涂了,”他写道。他说,自己的手指和脚趾都快不够用了。内核版本从 2.6 升至 3.0,从 4.20 升至 5.0,从 5.19 升至 6.0。现在,6.19 将变为 7.0。这并非技术上的里程碑,也没有 API 兼容性破坏,只是一个数字而已。但有时,新功能恰好与象征意义不谋而合。仅在 Linux 7.0 合并窗口 (merge window) 的前半段,就引入了 7,695 个非合并提交。一项长达五年的实验正式结束,抗量子密码学 (quantum-resistant cryptography) 已经到来,Linux 内核也首次制定了关于 AI 生成代码的书面政策。我从事基于 Linux 的专业开发已有 20 多年,横跨电信、数字健康和深度技术成像等领域。我见证了无数内核版本的发布和更迭。有些版本无关紧要,有些则举足轻重。而这一次,意义非凡。历经五年之争,Linux 7.0 正式引入 Rust自 1991 年以来,Linux 内核几乎完全使用一种名为 C 的编程语言编写。C 语言功能强大,但容错率低。它允许你犯下可能导致系统崩溃、内存损坏或产生安全漏洞的错误。Rust 是一种较新的语言,其设计初衷正是为了防止这类错误的发生。争论的焦点在于,是否应该强制要求经验丰富的老一辈开发者学习新工具。Linux 内核 7.0 中最重大的事件并非某个新功能,而是一场文化上的变革。在东京举行的 2025 年内核维护者峰会上,维护者们达成了共识。Rust 负责人 Miguel Ojeda 发布了一个补丁,宣告 Rust 实验的结束。传达的信息非常明确:内核中的 Rust 不再是实验性的。它现在是内核的核心组成部分,并将长期存在。在这五年里,Linux 内核的 C 代码增长到了大约 3400 万行。Rust 贡献了大约 2.5 万行。这个比例说明,Rust 并不是在取代 C。它是在补充 C,并且是一次只进入一个子系统,谨慎推进。围绕这项决策的争议非常真实。DMA 子系统维护者 Christoph Hellwig 把核心子系统里的 Rust 称作“癌症”(他指的是跨语言维护负担,而不是 Rust 语言本身)。“别逼我去处理你们今天这门闪亮的新语言。”他说。之后 Hellwig 辞去了 DMA 维护者职务。微软工程师、Linux Rust 项目关键贡献者 Wedson Almeida Filho 则直接离开了项目,理由是“非技术性的胡闹”。Rust 工作的联合负责人 Alex Gaynor 也在 Rust 转正的同一周卸任。最受尊敬的内核开发者之一 Ted Ts’o 也直言不讳:“问题就在于,你们不可能逼我们所有人都去学 Rust。”Linus Torvalds 介入并为 Rust 在内核中的位置辩护。稳定版内核维护者 Greg Kroah-Hartman 给出了另一面观点:“我们的大多数 bug,都来自 C 里那些愚蠢的小边角情况,而这些在 Rust 里基本都消失了。”Android 16 已经在内核中部署了 Rust 代码(ashmem 分配器),并运行在数百万台设备上。这不是理论,而是生产现实。来源:作者,Linux 7.0 Rust 采纳时间线(从 2020 年 RFC 到 2026 年正式地位)Linux Kernel 7.0 中的后量子密码学每次你的电脑把驱动或软件组件加载进内核时,都会检查它的数字签名,以确认它未被篡改。你可以把它想象成信件上的火漆封印。问题在于,未来的量子计算机可能伪造这些封印。本节讨论的是:要把旧封印替换为即使量子计算机也无法伪造的新封印。大多数人未来几年可能感受不到变化,但这件事会影响未来几十年。Linux 7.0 为内核模块校验加入了 ML-DSA 签名。ML-DSA 的全称是 Module-Lattice-Based Digital Signature Algorithm(基于格的模块数字签名算法)。它对应 FIPS 204,是 NIST 批准的标准,核心原因在于:基于格的数学问题对经典计算机和量子计算机都很难。现在已经提供三个安全等级(ML-DSA 44、65 和 87)。既然实用量子计算机还要很多年才会到来,这件事为什么今天就重要?因为存在“先收集、后解密”(harvest now, decrypt later)攻击。国家级行为体已经在收集加密数据,等待未来用量子计算机将其破解。使用传统算法签名的内核模块,其签名可能会在事后被伪造。这就像一把即使面对未来才出现的开锁工具也无法被撬开的锁。此版本中包含了超过 5000 行的验证代码。同样在安全主题下,SHA-1 模块签名功能被移除了。[NIST deprecated SHA-1](https://www.nist.gov/news-events/news/2022/12/nist-retires-sha-1-cryptographic-algorithm),而实际的碰撞攻击则在 2017 年随之出现。Linux 7.0 完全移除了该选项。现有的 SHA-1 签名模块目前仍可加载,但其淘汰已成定局。XFS 自我修复:Linux 7.0 的一项静默突破文件系统 (filesystem) 是计算机在硬盘上组织文件的方式。没有它,你的照片、文档和应用程序都将是毫无意义的 0 和 1 序列。XFS 是一种在数据中心和大型存储系统中广泛使用的文件系统。当其内部结构因断电、硬件故障或软件错误而损坏时,你可能会失去对该驱动器上所有内容的访问权限。在此之前,修复损坏意味着需要将系统下线。而这项变更使得修复工作可以在系统持续运行时进行。XFS,这个大型存储领域的主力文件系统,获得了自主的自我修复能力。一个新的 xfs_healer 守护进程 (daemon) 会监控健康事件,并在文件系统保持挂载状态的同时,自动检测和修复元数据 (metadata) 损坏。无需停机,无需人工干预。校验和 (Checksum) 在正常操作期间检测损坏,而冗余的元数据副本则作为修复的来源。这就像一辆在你驾驶时能自己修理引擎的汽车。当然,并非所有问题都能解决。由硬件故障导致的用户文件损坏仍然需要你自己处理。但是,那种可能导致整个文件系统无法挂载的元数据损坏,现在可以被实时捕获和修复。对于任何运行大型 XFS 部署的人来说(在企业存储领域,这涉及很多人),这是一种能够实实在在节省资金的、静默而实用的改进。来源:作者,Linux 内核 7.0 中的 XFS 自主自我修复架构io_uring:Linux 7.0 解决的百万美元级安全问题每当程序读取文件、发送网络数据或写入磁盘时,它都会通过一种名为“系统调用 (system call)”的机制向内核 (kernel) 请求权限。这些调用是安全的,但速度较慢,就像每次你需要从登机口取东西时都要重新过一遍机场安检一样。`io_uring` 是一条可以绕过大部分安全检查点的快速通道。问题在于,黑客们发现这条快速通道上没有安装安全摄像头。Google 因此在漏洞赏金上损失了 100 万美元。`io_uring` 是所有操作系统中最快的 I/O 接口之一,但它也一直是个安全噩梦。2022 年,[60% of Google’s vulnerability rewards](https://www.phoronix.com/news/Google-Restricting-IOuring) 都流向了 `iouring` 的漏洞利用。Google 为 `iouring` 的漏洞支付了大约 100 万美元的赏金,并在 Chrome OS 上完全禁用了 `iouring`。核心问题在于:`io_uring` 绕过了传统的系统调用,这意味着 `seccomp` (标准的安全过滤器) 无法对其进行干预。这就像你有一个受到严密监控的前门,但后门却完全无人看管。Linux 内核 7.0 为 `iouring` 操作添加了基于 BPF 的过滤功能。现在,系统管理员可以对 `iouring` 应用细粒度的安全策略,而无需完全禁用它。你既能获得高性能,又能拥有安全控制。这个修复虽然来得太晚,但对于容器和云工作负载来说,等待是值得的。你的团队是否也出于安全原因禁用了 `io_uring`?我很好奇有多少生产环境采取了和 Google 一样的做法。Linux 7.0 调度器:更少的模式,更优的性能调度器 (Scheduler) 是内核的交通控制器。你的计算机同时运行着数百个程序,但处理器在同一时间只能做一件事 (每个核心)。调度器决定了下一个由谁来使用处理器、使用多久,以及何时中断正在执行的任务。一个糟糕的调度器会让你的桌面卡顿、视频延迟或游戏掉帧。而一个好的调度器则能让一切都感觉流畅,即使在重负载下也是如此。在现代架构上,内核调度器的抢占模式 (preemption modes) 从四种减少到了两种:`PREEMPTLAZY` 和 `PREEMPTFULL`。`PREEMPT_LAZY` 是一个很有趣的模式。它是一个“恰到好处”的选项:对普通任务采用宽松的抢占策略 (让它们完成工作),而对实时任务则采用激进的抢占策略。这就像一位经理,除非火警响起,否则他会等员工说完话再打断他们。与此同时,一个开发了十年的时间片扩展补丁 (time-slice extension patch) 也被合并了。桌面 Linux 用户应该会注意到性能变得更加流畅,尽管 7.0 的正式基准测试仍在进行中。来源:作者,Linux 内核 7.0 功能概览,涵盖安全、性能和容器Linux 7.0 中的容器和文件系统:悄无声息的胜利容器 (Container) 是一种打包软件的方式,能让软件在任何地方都以相同的方式运行,就像适合任何卡车、火车或轮船的集装箱一样。Netflix、Spotify 和大多数云服务都在使用容器。一台服务器可能同时运行成百上千个容器。让容器启动更快、占用内存更少,可以直接降低云服务费用并加快应用部署速度。OPEN\TREE\NAMESPACE (由 Christian Brauner 开发) 将容器创建速度提升了 40%。基准测试显示,旧的 `pivotroot()` 方法在 60 秒内大约能创建 73,000 个容器,而新的 `opentree()` 方法在相同时间内大约能创建 109,000 个。如果你正在运行一个拥有数百个节点的 Kubernetes 集群,这将直接影响你的 Pod 启动时间。EROFS 新增了对容器内共享页面缓存 (shared page cache) 的支持。现在,跨容器的内容哈希值相同的文件将共享同一个缓存副本。在容器镜像共享公共层 (通常都是如此) 的环境中,这可以显著减少内存使用。这就好比,不再是每个容器都打印一份自己的公司手册,而是在休息室里放一份共享的副本。Btrfs 获得了对大块大小的直接 I/O (direct I/O) 支持,这在以前是不可能实现的。数据库、视频处理和科学计算等工作负载将直接受益。Linux 内核 7.0 AI 代码政策:针对 AI 生成代码的规则Linux 内核是由成千上万的志愿者和公司员工共同构建的,他们提交代码变更 (“补丁”),这些补丁在被接受之前会由其他开发者进行审查。随着像 ChatGPT 和 Claude Code 这样的 AI 工具现在也能编写代码,内核社区需要做出决定:AI 可以提交代码吗?如果 AI 编写的代码导致了问题,谁来负责?Linux 7.0 包含了针对 AI 编码助手的官方文档,发布在 [kernel.org](https://kernel.org/doc/html/next/process/coding-assistants.html)。规则非常明确:你必须使用 “Assisted-by” 标签来声明获得了 AI 的协助。AI 代理不能添加 `Signed-off-by` 标签,因为根据开发者原创声明 (Developer Certificate of Origin),只有人类才能合法地认证代码。这份文档本身在编写时就考虑了 AI 模型的可读性。核心原则是:“AI 自己不发送补丁,发送补丁的是人。”每个版本的内核都会收到来自 200 到 250 家公司的 1500 到 2000 名开发者的贡献。其代码量已超过 4000 万行 (十年间翻了一番),并且每两个月大约增长 40 万行,因此,关于 AI 生成代码的问题变得不可避免。制定一项官方政策既务实又必要。与 iPhone 或 Windows 不同,新版本号通常意味着重大的重新设计,而 Linux 内核的版本号只是一个计数器。当上一个数字变得太大时,它们就会增加。没有所谓的“Linux 7.0 发布会”。内核每两个月悄然发布一个新版本,而版本号只是表面功夫。Torvalds 的观点一向很明确:从技术上讲,版本号“基本上毫无意义”。无论版本号是多少,内核大约每九到十周发布一次。真正重要的是其内在。而 Linux 内核 7.0 的内在确实分量十足。Rust 从实验性功能升级为核心组件,这是一次划时代的转变。后量子签名 (Post-quantum signatures) 使 Linux 在密码学准备方面领先于大多数操作系统。XFS 自我修复和 io\_uring 沙箱化是实用的、生产级别的改进。随着 Linux 内核 7.0 的发布,这个驱动着 Android 手机、云服务器、嵌入式系统和超级计算机的内核,在安全性、可靠性以及维持由数千人编写的 4000 万行代码所需的治理能力方面,都得到了显著提升。这值得一次版本号的提升。即使 Torvalds 说这只是因为他的脚趾头快不够用了。