Introduction
這是 LinuxBoot 專案的官方「LinuxBoot 書籍」。這本書:
- Describes the LinuxBoot concept and various implementations
- Explains why you would want to use a LinuxBoot boot loader
- Describes the components that can comprise a LinuxBoot boot loader and how to combine them
- Highlights the differences between LinuxBoot and other designs
什麼是 LinuxBoot?
LinuxBoot 的想法是用 Linux 核心和基於社群的用戶空間(user-space) 取代專有或企業主導的後期啟動韌體。這個想法逐漸發展成為一個項目,多年來包括各種舉措,其總體目標是從晦澀複雜的韌體轉變為更簡單和開源的韌體。
The LinuxBoot project provides two reference implementations; linuxboot
and Heads. The linuxboot
build system outputs a boot payload consisting of a Linux kernel and an initramfs that contains a minimal Go user-space built using u-root.
Heads 構建系統更側重於本地證明(local attestation)、TPM DUK 密封/解封(seal/unseal)操作、基於 GPG 的安全措施、可重現構建(reproducible builds),並使用 BusyBox 提供更大的 Linux 工具套件,使其也可以用作修復環境(recovery environment)。
許多其他實作獨立於專案而存在:
- petitboot 屬於 OpenPOWER 項目,最初針對的是 PS3
- k-boot 由 BayLibre 於 2023 年使用 BusyBox 開發
- nmbl 由 RedHat 於 2024 年開發
- ZFSBootMenu
此外,過去也曾有許多類似的實作,其中包含一些已不再維護的專案:
- Alpha 版 MILO 於 2000 年之前就已啟動(請參閱什麼是 MILO?)
- kboot 由 Werner Almesberger 於 2005 年開發
These projects all attempt to reduce the role of firmware to a small, fixed-function core whose only purpose is to get a flash-based Linux kernel started. This “bare essentials” firmware prepares the hardware and starts a Linux kernel and a user-space environment will run on the machine.
為什麼需要 LinuxBoot
有時候,韌體會包含驅動程式和工具程式(utilities)。這些元件可能存在漏洞,或是已無人維護,進而成為問題或資安風險的來源。LinuxBoot 以 Linux 驅動程式取代了供應商提供的專有閉源韌體驅動(proprietary, closed-source firmware drivers),讓開發 Linux 驅動與韌體驅動的工程師能專注於同一套驅動程式。如此一來,這些驅動程式將擁有更多的貢獻者 (contributors) 與審閱者(reviewers),又因為它們是 Linux 的一部分,能夠運用業界標準的開發流程與工具(standard industry coding infrastructure)來持續改善。最終,由於這些 Linux 驅動目前已在大量系統上長時間穩定運作(run around the clock at scale),其錯誤率也會相對較低。
LinuxBoot 的功能
LinuxBoot 以 Linux 應用程式取代了統一可擴充韌體介面(Unified Extensible Firmware Interface,UEFI)與其他韌體中大量的驅動程式執行環境(Driver Execution Environment,DXE)模組,特別是網路協定堆疊(network stack)和檔案系統(file system)模組。
LinuxBoot 將 Linux 核心(Linux kernel)作為快閃記憶體(flash ROM)中的驅動程式執行環境(Driver Execution Environment, DXE)啟動,而非傳統的 UEFI shell。接著,Linux 核心可透過隨附的基於 Go 的使用者空間(user-space)來載入運行時核心(runtime kernel)。LinuxBoot 的架構(paradigm)使得傳統的韌體應用程式(例如開機載入器、偵錯工具、診斷與錯誤偵測應用程式)能夠以跨架構、跨平台的可攜式 Linux 應用程式形式實作。
當 Linux 啟動時,它需要一個包含工具程式(utilities)的根檔案系統(root file system)。LinuxBoot 使用的其中一種根檔案系統是基於使用 Go 語言編寫的 u-root 標準工具程式(standard utilities)。下圖顯示了目前 UEFI 啟動過程的狀況,以及計畫中的 LinuxBoot 過渡流程。
在 UEFI 伺服器上使用 LinuxBoot 的好處
大多數伺服器韌體基於 Intel 的通用可擴展韌體介面 (UEFI)。與 UEFI 相比,LinuxBoot 具有以下優點:
可靠性
- 透過使用強化的 Linux 驅動程式取代未經充分測試的韌體驅動程式來提高啟動可靠性
- 近 20 年來,在軍事、消費性電子和超級電腦領域,可靠性和性能至關重要的領域,該實踐方法已得到驗證
- 容錯 - Linux 隔離程序** **(例如,當「pxeboot」發生災難性故障時,「diskboot」仍然可以運作)
安全性
- 將“Ring 0”引導程式(bootloaders)移至“Ring 3”
pxeboot
和diskboot
在使用者空間(user-space)進行解析和其他邏輯處理- Go 提供記憶體安全和類型安全(type safety)
- 有缺陷的解析器(parser)不太可能影響其他程式
- 核心安全性補丁(patches)可應用於韌體
靈活性
- 可與 coreboot、u-boot、OpenPOWER 抽象層 (OpenPOWER Abstraction Layer, OPAL)、SlimBootLoader、ARM 可信任韌體 (Arm Trusted Firmware, ATF) 搭配
- 可啟動多個作業系統(Linux、Berkeley UNIX(BSD)、XEN、Windows)
- 支援以下伺服器主機板:
- QEMU 模擬的 Q35 系統
- Intel S2600WF
- Dell R630
- Winterfell Open Compute node
- Leopard Open Compute node
- Tioga Pass Open Compute node
- Monolake Open Compute node(未經測試)
啟動速度
- 透過移除不必要的程式碼來提升啟動時間;通常能使啟動速度提高 20 倍
客製化
- 允許自訂 initramfs 運行時,支援特定環境的需求(包括裝置驅動程式和自訂執行檔)
工程生產力
- 編寫一次驅動程序,無需編寫兩次
- Linux 是 開放、可衡量、可重現且易於更新的
- Linux 已經為幾乎所有東西提供了驅動程式
- 核心(kernel)工程師=韌體工程師
- 了解 Linux 的工程師比了解 UEFI 的工程師多得多
- 減少建置時間
- initramfs 需要 30 秒
- 核心需要 15 秒(增量式)
- 大約 15 秒 重新包裝 bios 映像檔(使用 fiano/utk)
- 總計:約 1 分鐘 用於新的完整 BIOS 映像,可供測試
- 測試和除錯
diskboot
和pxeboot
已經有單元測試 (unit tests)- 使用 Linux 資源(如網路)使編寫測試更容易
- u-root 等開源專案遵循優秀的軟體實踐,例如對每個提交的變更執行自動化測試
- 更容易除錯的 Go 用戶空間(user-space)應用程式
- 使用 QEMU 中的核心進行測試