矛盾的很,Go1.24 將需要更新的 Linux 內(nèi)核!
大家好,我是煎魚。
一門編程語言總是要適配多個(gè)平臺(tái)多種架構(gòu),其中莫過于適配 Windows 和 Linux 的不同版本。
老的可能會(huì)被逐漸廢棄,穩(wěn)定版本的逐漸占據(jù)主流。Go 有 Go1 兼容性保障,導(dǎo)致取舍之間總是會(huì)糾結(jié)要不要繼續(xù)保留老的 Linux 版本內(nèi)核支持。
Go1.24 期望用 Linux 內(nèi)核 3.2
最近 Go1.24 的規(guī)劃已經(jīng)提上日程了,其中包含一項(xiàng)內(nèi)核變更《all: require Linux 3.2 kernel for Go 1.24[1]》:
圖片
在 2021 年,Go 將 Linux 內(nèi)核的最低版本提高到了 2.6.32。至此 3 年多再也沒變過。
Rust 和 glibc 在去年決定將內(nèi)核的最低版本定為 3.2。Linux 生態(tài)系統(tǒng)的其他部分也逐步開始采用 3.2。
作為 Go 的最低版本,rsc 認(rèn)為選用 3.2 這似乎是合理的。Go 團(tuán)隊(duì)計(jì)劃在 Go 1.24 中做出改變。每個(gè)人都應(yīng)該使用更新的內(nèi)核進(jìn)行安全更新。
Go 創(chuàng)始人的糾結(jié)
Go 創(chuàng)始人 Rob Pike 還是挺糾結(jié)的,他表示:總體而言,我對(duì)這一趨勢(shì)持矛盾態(tài)度。對(duì)于 Go,它也有點(diǎn)違背兼容性承諾。
圖片
制造商放棄對(duì)舊硬件的支持,要求我購買昂貴的升級(jí)產(chǎn)品,但沒有任何回報(bào),這讓我多次感到困擾。
我仍然在實(shí)驗(yàn)室中運(yùn)行 32 位 x86 Mac,因?yàn)闆]有它,我無法控制只能與舊版 macOS 交互的重要設(shè)備。我甚至無法將其連接到網(wǎng)絡(luò),因?yàn)閾?dān)心某些更新會(huì)導(dǎo)致我的設(shè)備無法工作。
雖然我理解 “更新更安全,更新更好” 的隱含價(jià)值,但讓 Go 二進(jìn)制文件在舊操作系統(tǒng)上運(yùn)行對(duì)項(xiàng)目的實(shí)際成本是多少?這似乎是評(píng)估該提案的更好方法。
最終結(jié)論
本次是由 rsc 直接當(dāng)機(jī)立斷,表示即使是改向支持 Linux 3.2 也都已經(jīng)是 12 年前發(fā)布的了??隙ú凰闶窍冗M(jìn)技術(shù)!得變!
同時(shí)他們?cè)?crypto/rand: crash process on error reading randomness[2] 的討論中發(fā)現(xiàn),Linux 3.17 增加了 getrandom(2) 方法,可以滿足 Go 的使用訴求。將原定的 Linux 3.2 版本要求下調(diào)了。
最終 Go1.24 將 Linux 內(nèi)核所需的最低版本定到了:Linux 3.17。另外 Linux 3.10 版本中追加補(bǔ)丁后添加了 getrandom(2) 系統(tǒng)調(diào)用也是能夠支持的。
參考資料
[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