Linux 4.0 于 UTC-7 4月12日发布,代号是 Hurr durr I'ma sheep 看起来非常无厘头。

这是一次大版本升级,上一次从 2.6.39 跳到 3.0 还是2011年7月的事情,当时新特性非常给力,比如 Xen dom0 支持, Btrfs 自动 defragmentation / scrubbing 以及其它性能改进,还有 Wake on WLAN 支持等等。

根据名为「我是一只羊」的发布者,发布 v4.0 时内核 git repository commit 总数超过50万,其中的 git 对象超过4百万。巧的是,2011年7月发布 v3.0 时 commit 总数刚好是25万,而 git 对象是2百万,正好翻倍了。

看起来内核新版本的发布,从基于特性切换到了基于时间 Linus 看似更倾向于后者。

v4.0 最显著的的特性要算是 Red Hat 和 SUSE 合作开发的 live kernel patching infrastructure (利用内核的 ftrace 功能) - 具体的代码在源代码树的 kernel/livepatch 目录下

livepatch: kernel: add support for live patching [commit]

livepatch: samples: add sample live patching module [commit]

更多细节可以看 [merge commit]

还有个值得注意的显著特性是:新的 lazytime metadata update model 引入的新 lazytime 挂载选项来解决使用 relatime (同时也是违背 POSIX 标准的)时导致某些应用程序无法正常工作的问题。

使用该挂载选项会导致 access / modified / changed 时间更新只在 page cache 里发生。变化只有在下面两种情况下才会被写到磁盘:

  1. inode 因系统调用必须被更新,如 fsync(), syncfs()sync()
  2. 未被删除的 inode 从内存中被 evict 前

以上两种都是 POSIX 兼容的。

详细的特性和改进列表请参考 Linux Kernel NewbiesLKML 相关页面。

估计又会有一批傻屄程序员写的应用(内核版本号检查时的猪逻辑,你们懂的)在升级后会挂掉,就如同当初从 v2.6.39 升级到 v3.0 时一样。当初 Oracle Linux 为了避免这种问题,特地把 UEK 2 版本标记为 2.6.39 而实际上其 code base 是基于 upstream v3.0 的。希望有人能把这类应用收集起来做个 hall of shame ;-D