矛盾的很,Go1.24 將需要更新的 Linux 內核!
大家好,我是煎魚。
一門編程語言總是要適配多個平臺多種架構,其中莫過于適配 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