大家好,我是煎鱼。
一门编程语言总是要适配多个平台多种架构,其中莫过于适配 Windows 和 Linux 的不同版本。
老的可能会被逐渐废弃,稳定版本的逐渐占据主流。Go 有 Go1 兼容性保障,导致取舍之间总是会纠结要不要继续保留老的 Linux 版本内核支持。
Go1.24 期望用 Linux 内核 3.2
最近 Go1.24 的规划已经提上日程了,其中包含一项内核变更《all: require Linux 3.2 kernel for Go 1.24[1]》:
图片
在 2021 年,Go 将 Linux 内核的最低版本提高到了 2.6.32。至此 3 年多再也没变过。
Rust 和 glibc 在去年决定将内核的最低版本定为 3.2。Linux 生态系统的其他部分也逐步开始采用 3.2。
作为 Go 的最低版本,rsc 认为选用 3.2 这似乎是合理的。Go 团队计划在 Go 1.24 中做出改变。每个人都应该使用更新的内核进行安全更新。
Go 创始人的纠结
Go 创始人 Rob Pike 还是挺纠结的,他表示:总体而言,我对这一趋势持矛盾态度。对于 Go,它也有点违背兼容性承诺。
图片
制造商放弃对旧硬件的支持,要求我购买昂贵的升级产品,但没有任何回报,这让我多次感到困扰。
我仍然在实验室中运行 32 位 x86 Mac,因为没有它,我无法控制只能与旧版 macOS 交互的重要设备。我甚至无法将其连接到网络,因为担心某些更新会导致我的设备无法工作。
虽然我理解 “更新更安全,更新更好” 的隐含价值,但让 Go 二进制文件在旧操作系统上运行对项目的实际成本是多少?这似乎是评估该提案的更好方法。
最终结论
本次是由 rsc 直接当机立断,表示即使是改向支持 Linux 3.2 也都已经是 12 年前发布的了。肯定不算是先进技术!得变!
同时他们在 crypto/rand: crash process on error reading randomness[2] 的讨论中发现,Linux 3.17 增加了 getrandom(2) 方法,可以满足 Go 的使用诉求。将原定的 Linux 3.2 版本要求下调了。
最终 Go1.24 将 Linux 内核所需的最低版本定到了:Linux 3.17。另外 Linux 3.10 版本中追加补丁后添加了 getrandom(2) 系统调用也是能够支持的。
参考资料
[1]all: require Linux 3.2 kernel for Go 1.24: https://github.com/golang/go/issues/67001
[2]crypto/rand: crash process on error reading randomness: https://github.com/golang/go/issues/66821