Go 將會支持裸機(jī)環(huán)境運行?
眾所周知,我們平時在寫 Go 應(yīng)用程序時會先在本地環(huán)境開發(fā),更大規(guī)模的企業(yè)會配發(fā)云環(huán)境。以此確保開發(fā)環(huán)境的效率,以及與部署環(huán)境的對齊。
部署環(huán)境需要特定的系統(tǒng)(Windows、Linux 等)似乎也成為了常見的共識。但其實在其他業(yè)務(wù)場景下也有不需要系統(tǒng)的訴求。
今天分享給大家的是 Go 針對裸機(jī)環(huán)境的新支持場景考慮。
新提案:增加裸機(jī)環(huán)境支持
提案背景
該提案《proposal: all: add bare metal support[1]》由 @Andrea Barisani 提出:
圖片
核心提議的內(nèi)容是:引入一個新的 GOOS
目標(biāo)值,例如 GOOS=none
(或現(xiàn)有的 GOOS=tamago
),允許 Go 應(yīng)用程序在沒有底層操作系統(tǒng)支持的環(huán)境中運行,即所謂 “裸機(jī)” 運行模式。
這相當(dāng)于做到了以下事項:
- 在沒有 Linux、Windows、macOS 等 OS 系統(tǒng)下,Go 應(yīng)用程序也可以運行;
- Go 程序通過定義一組與底層硬件相關(guān)的函數(shù),由 Go runtime 與外部驅(qū)動(也是 Go 實現(xiàn))共同支持運行;
- 不依賴操作系統(tǒng) syscall,完全在 runtime 和硬件之間運行。
摘 TamaGo 項目果子
可能有了解的同學(xué)一看,這表示是個大需求。畢竟以前 Go 一直都是支持帶環(huán)境的,沒有支持過裸機(jī)運行環(huán)境。開發(fā)工作量和涉及的影響面也未免太多了。
實際上這個提案是個摘果子的活,開源項目 TamaGo[2] 已經(jīng)面向該需求已經(jīng)經(jīng)歷了多年開發(fā)。
目前具備一定的成果和成熟度:
- Go 標(biāo)準(zhǔn)庫兼容性良好,通過了大部分分發(fā)測試;
- 跨平臺支持完善:支持 amd64、arm、riscv64;
- 網(wǎng)絡(luò)棧通過注入 SocketFunc,可自定義虛擬網(wǎng)絡(luò),甚至用于 js/wasip1;
- 支持用戶態(tài)執(zhí)行(以 Go app 形式運行在沙箱環(huán)境中);
- 不再局限于 ARM,擴(kuò)展到了 KVM 環(huán)境的 microVM,如 Firecracker、Cloud Hypervisor;
- 變更對 Go 官方發(fā)行版幾乎無侵入性(硬件驅(qū)動與構(gòu)建系統(tǒng)保持外部化)。
可能存在的問題
社區(qū)反饋中,Google 內(nèi) Go 團(tuán)隊成員 @Michael Pratt 對 Go 裸機(jī)運行(bare metal Go)感到很興奮。
也指出了以下幾點主要的兼容性挑戰(zhàn):
- 問題 1:為 runtime 提供穩(wěn)定的 API
- 問題 2:可用于實現(xiàn) runtime API 的語言子集
問題 1:為 runtime 提供穩(wěn)定的 API
- Go 的 兼容性承諾(Go 1 Compatibility Promise) 要求 runtime 依賴的 API 是長期穩(wěn)定的;
- 當(dāng)前提案中定義的 tamago runtime API 大致可行,但 go:linkname 機(jī)制需要更好的替代;
- 社區(qū)中也有人希望類似 API 能用于在最小化 WASM 運行時上運行 Go(如不支持 WASI 的環(huán)境),因此該 API 也應(yīng)適用于 GOOS=none GOARCH=wasm。
問題 2:可用于實現(xiàn) runtime API 的語言子集
- Go runtime 本身用的是一套“不完全定義”的 Go 子集,具有一定特殊性;
- 在標(biāo)準(zhǔn)編譯器下,某些微小的變化(例如啟發(fā)式加了一個內(nèi)存分配)可能會
- 導(dǎo)致在不可分配位置出錯,但目前因為 runtime 是官方源碼,可以一起調(diào)整;
- 一旦開啟
GOOS=none
,任何runtime
的變動都不能破壞對已有裸機(jī)實現(xiàn)的兼容,因此:可能需要定義一套“穩(wěn)定、安全”的 Go 語言子集,用于實現(xiàn)裸機(jī)所需的這些底層 API; - 這是一個很大的工作量。
對 Go 的發(fā)展意義和價值
- 使 Go 成為裸機(jī)開發(fā)語言:無需 C 或匯編,完整 Go 開發(fā)體驗;
- 構(gòu)建最小化系統(tǒng):比如可信執(zhí)行環(huán)境(TEE)、引導(dǎo)加載器(如 go-boot);
- 沙箱與虛擬化創(chuàng)新:可用于構(gòu)建 Soft Isolation VM、serverless 運行時;
- Go runtime 的可插拔性增強(qiáng):提升多平臺抽象能力;
總結(jié)
從本文分析的結(jié)果來看,如果 Go 支持裸機(jī)環(huán)境,將會進(jìn)一步提高其在新領(lǐng)域的優(yōu)勢和實踐的機(jī)會。
但是結(jié)合 Go 團(tuán)隊維護(hù)成員的結(jié)論來看,將裸機(jī)支持合入 master 分支前仍然存在的兩個關(guān)鍵工程難題:分別是:
- 如何為裸機(jī)提供一個長期維護(hù)、穩(wěn)定的運行時接口(API);
- 如何保障這些接口的實現(xiàn)不會因 Go 語言或編譯器變更而“突然失效”。
這些問題都需要通盤考慮并做出一些基本的解決方案。雖然很希望 Go 可以進(jìn)一步擴(kuò)大輻射范圍,但可能我們還是需要再等等。
參考資料
[1] proposal: all: add bare metal support: https://github.com/golang/go/issues/73608
[2] TamaGo: https://github.com/usbarmory/tamago