本篇文章記錄我在 Ubuntu 24.04 機器上手動下載、設定並編譯最新 Linux kernel v6.12 的過程。
安裝必要工具
Linux Kernel 的編譯需要一些開發工具與函式庫。使用 apt 套件管理器安裝如下:
1
2
sudo apt update
sudo apt install -y git build-essential flex bison bc libncurses-dev libssl-dev libelf-dev
各套件用途簡述:
build-essential
: 包含 gcc、make 等編譯工具flex
,bison
: 編譯設定檔選單用bc
: 為 Makefile 中的運算工具libncurses-dev
: 提供 make menuconfig TUI 選單介面libssl-dev
,libelf-dev
: 某些模組需要
下載 Linux Kernel 原始碼
我選擇主線版本 v6.12。以下指令可抓取該版本原始碼:
1
2
git clone --depth=1 --branch=v6.12 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
使用 --depth=1
可加快下載速度,只取最新提交。
使用 tinyconfig 產生最小設定檔
選擇 tinyconfig
快速產出一個極簡核心:
1
make tinyconfig
這會產生 .config
設定檔,啟用最小必要功能。
編譯 Linux Kernel
開始編譯核心:
1
make -j$(nproc)
$(nproc)
表示使用所有 CPU 核心以加快速度。
成功後,會產出映像檔:
./arch/x86/boot/bzImage
bzImage
是可開機的 Linux kernel 映像,稱為 “big zImage”。它是壓縮過的自解壓格式,主要用於 x86/x86_64 架構。
你可以這樣查看格式:
1
file arch/x86/boot/bzImage
用 QEMU 測試啟動核心
安裝 QEMU:
1
sudo apt install qemu-system-x86
啟動核心:
1
qemu-system-x86_64 -kernel arch/x86/boot/bzImage
但讓人失望的是,畫面上只顯示了:Booting from ROM...
。然後就沒有後續了,完全沒有看到任何核心訊息。這通常代表我們的核心缺少基本的輸出驅動,沒辦法輸出文字到畫面。
注意:點進 QEMU 視窗後滑鼠會被鎖住,可按
Ctrl + Alt + G
放開。
設定 menuconfig
關閉 QEMU 視窗後,打開 menuconfig
來調整設定(如果是第一次使用,請先安裝 libncurses-dev
):
1
make menuconfig
啟用 TTY 裝置
在選單中找到:
Device Drivers --->
Character devices --->
<*> Enable TTY
按 menu 上方說明,使用方向鍵選擇,按 Y 或空白鍵啟用設定。
此選項允許核心支援 TTY 裝置(文字終端或序列埠輸出)。
啟用 printk
General setup --->
Configure standard kernel features (expert users) --->
[*] Enable support for printk
儲存設定後,再次重新編譯執行:
1
2
make -j$(nproc)
qemu-system-x86_64 -kernel arch/x86/boot/bzImage
終端機中出現了核心啟動訊息,雖然最後顯示 panic - not syncing: No working init found
,但至少我們已經成功啟動了核心並看到輸出。
要解決這個問題,你需要提供一個有效的 init
程序(如 systemd
或 busybox
)。可參考另一篇文章 靜態編譯 C 語言 init 程式,搭配 initramfs 啟動自編譯 Linux Kernel。
如果你想恢復到預設的 tinyconfig
設定來做其他實驗,可以使用:
1
make mrproper