「冰冻荒原」版Linux内核有bug,不要使用!Linux之父紧急警告并发布5.12-rc2版本

2 月份,受恶劣天气影响,美国多个地区出现大规模断电。Linux 之父 Linus Torvalds 所在的俄勒冈州波特兰地区也没有幸免。但比较励志的是,即使经历了六天的断电生活,Linus Torvalds 还是赶出了新一版的 Linux 内核(候选版本)—Linux 5.12 rc1。
但近日,Linus Torvalds 在发给 Linux 内核邮件列表的一封邮件中却警告称:请勿使用其公共 git 树中的 5.12-rc1 内核
邮件地址:https://lore.kernel.org/lkml/CAHk-=wjnzdLSP3oDxhf9eMTYo7GF-QjaNLBUH1Zk3c4A7X75YA@mail.gmail.com/

他在邮件中写道:

大家或许注意到了,在我的公共 git 树中,「v5.12-rc1」标签已经更名为「v5.12-rc1-dontuse」。更名后依然是同一个对象,在内部仍显示为「v5.12-rc1」,且仍由我签名,但该标签的用户可见名已经更改了。

文件交换处理问题可能导致严重后果

事实证明, Linus Torvalds 确实将一些代码标记为「dontuse」,因为新发布的 5.12 候选版本存在的问题严重破坏了交换文件(swapfile)处理。具体来说,更新后的代码会丢失指向交换文件开头的适当偏移量(proper offset)。用 Torvalds 自己的话说,「交换仍会进行,但出现在了文件系统不该交换的地方,并将酿成灾难性的后果。」

这意味着,当内核将内存内容分页到磁盘上时,数据将落在交换文件同一磁盘和分区的随机部分,但并非与文件处于同一磁盘和分区,而是与被直接发送至磁盘原始扇区的垃圾内容处于同一磁盘和分区。这意味着,不仅会覆盖现有文件中的数据,而且还将波及大段的元数据,这些元数据的损坏可能导致整个文件系统无法挂载和使用。

Torvalds 指出,如果你不使用交换,那这个问题对你没什么影响;如果你使用交换分区,而不是交换文件,那你也不会受到困扰。但是,他表示虽然自己非常了解该内核,但他并非对普通终端用户关心的所有基础问题都那么熟悉:

据我所知,所有正常的发行版本使用交换分区而不是交换文件,因为交换文件速度较慢,且存在多种其他复杂性问题。

很多发行版本仍然默认交换分区,而不是交换文件。但 Ubuntu——或许是世界上最广泛部署的 Linux 发行版本,在四年多以前就默认安装交换文件了。如果你是 Ubuntu 用户(或 Ubuntu 衍生版本的用户),你或许会得到一份交换文件,而这个 bug 可能会毁掉整个根文件系统。

除了上述问题外,Torvalds 还提醒个人用户应该如何对待新发布的 Linux 内核(候选版本)。开发者最好不要围绕着该内核版本进行开发工作,这可能会带来严重且持久的 bug。Torvalds 表示:

我想要确保没人使用 5.12-rc1 开启新的主题分支。我知道一些开发者会有这种想法:「既然 rc1 出来了,我就把所有开发工作放到其合并窗口。我要赶紧转向 rc1,以便下次发布时可以以此作为基础。」但是,这次请不要这么做。这个过程可能会很顺利,因为开发者使用了常见的分区设置,但这对于可能将该区域一分为二的人而言将会是糟糕的基础。

这还会带来另一个 Linux 用户需要注意的问题:不要盲目使用未经充分测试的代码。Linux 内核候选版本通常非常坚固,因此许多人想尽可能早地尝试新特性,但这样做会带来非常恶劣的后果。先等待代码进入生产环境,或许可以避免一些严重后果。

Linux 5.12-rc2 版本已发布

在发现 5.12-rc1 版本存在的交换文件问题后,Linux 几天内就推出了 5.12-rc2 内核版本。
对于 5.12-rc2,Torvalds 表示:「除了对交换文件 IO 偏移量的修复之外,该版本还对一些 io_uring 线程处理进行了重组,这不仅解决了一些基本问题,还使得代码更小、更简单。」
邮件地址:https://lore.kernel.org/lkml/CAHk-=whH-stL2zLCf02HZaOeQgS4oGa7eEiHeYZGj-orK-PX0g@mail.gmail.com/T/#u

参考链接:
https://arstechnica.com/gadgets/2021/03/psa-linux-folks-stay-away-from-the-5-12-rc1-kernel/
https://www.phoronix.com/scan.php?page=news_item&px=Linux-5.12-rc2-Released