萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 核心編譯測試完整流程:配置、編譯、initrd、GRUB、驗證

Linux 核心編譯是驅動開發、嵌入式移植、效能調校的基本功。本文提供**標準化、可重現**的完整流程:從 make menuconfig 配置、make bzImage/modules 編譯、mkinitramfs 產生初始虛擬檔案系統、修改 GRUB 開機項目,到虛擬機實測驗證。

環境準備

  • 原始碼目錄:/usr/src/linux-source-x.xx.x (或 git clone 核心樹)
  • 工具鏈:gcc, make, bc, libssl-dev, libelf-dev, bison, flex
  • 根權限:sudo 或 root

Step 1:配置核心選項

cd /usr/src/linux-source-x.xx.x
make menuconfig          # 互動式選單配置 (NCURSES)
# 或 make nconfig / xconfig / gconfig
  • 載入現有配置:cp /boot/config-$(uname -r) .config → make olddefconfig
  • 關鍵選項:CONFIG_IKCONFIG=y、CONFIG_IKCONFIG_PROC=y (支援 /proc/config.gz)、CONFIG_DEBUG_INFO=y (除錯符號)、模組化驅動 (M) 以縮小核心體積。

Step 2:清理舊產物 (可選但建議)

make mrproper   # 徹底清理,含 .config
# 或
make clean      # 僅清理編譯產物 (.o, .ko 等),保留 .config

Step 3:編譯核心與模組

# 多核心並行編譯 (N = 邏輯核心數 + 1)
make -j$(nproc) bzImage      # 編譯核心映像 → arch/x86/boot/bzImage
make -j$(nproc) modules      # 編譯所有模組 (*.ko)
sudo make modules_install    # 安裝模組至 /lib/modules/x.xx.x/

產物:arch/x86/boot/bzImage (核心映像)、/lib/modules/x.xx.x/ (模組樹)。

Step 4:產生 initrd/initramfs 映像

# 複製配置檔供套件管理器參考
sudo cp .config /boot/config-x.xx.x

# 產生 initramfs (Debian/Ubuntu 系列)
sudo mkinitramfs -o /boot/initrd.img-x.xx.x x.xx.x
# x.xx.x 必須與 /lib/modules/ 下目錄名完全一致

# RHEL/Fedora 系列
# sudo dracut -f /boot/initramfs-x.xx.x.img x.xx.x

Step 5:修改 GRUB 開機選單

編輯 /boot/grub/grub.cfg (或 /etc/grub.d/40_custom 再 update-grub),複製現有啟動項並修改核心/initrd 路徑:

menuentry 'Test Kernel 3.7.4' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    gfxmode $linux_gfx_mode
    insmod gzio
    insmod part_msdos
    insmod ext2
    set root='(hd0,msdos1)'
    search --no-floppy --fs-uuid --set=root 7b4e922c-d943-4b84-9c75-4fdc57cf1a3f
    linux   /boot/vmlinuz-3.7.4 root=UUID=7b4e922c-d943-4b84-9c75-4fdc57cf1a3f ro quiet splash $vt_handoff
    initrd  /boot/initrd.img-3.7.4
}

關鍵點:linux 行指向核心映像 (vmlinuz-*),initrd 行指向對應 initramfs,root=UUID=... 必須指向根檔案系統分區。

Step 6:虛擬機實測驗證

  1. VirtualBox/VMware/QEMU 掛載該硬碟或 ISO 啟動。
  2. 開機時按 Esc (或 Shift) 強制進入 GRUB 選單。
  3. 選擇新增的「Test Kernel 3.7.4」項目開機。
  4. 觀察啟動訊息:dmesg | less、journalctl -b,確認無 FAILED/ERROR/panic。
  5. 驗證功能:網路、聲音、圖形、USB、檔案系統、自訂驅動模組 lsmod | grep your_module。

常見問題與對策

現象可能原因排查方向
Kernel panic: VFS: Unable to mount root fsinitramfs 缺少儲存/檔案系統模組、root=UUID 錯誤檢查 mkinitramfs 參數、lsinitramfs /boot/initrd.img-* | grep -E 'ext4|xfs|btrfs|nvme|ahci'
模組載入失敗: Unknown symbol核心配置與模組版本不符重跑 make modules_install、確認 /lib/modules/$(uname -r) 正確
啟動卡在 "Waiting for root device"initramfs 未包含 SATA/NVMe/USB 儲存驅動make menuconfig → Device Drivers → 將控制器設為 Y (內建) 而非 M
編譯錯誤: implicit declaration of function缺少標頭檔或 API 變更核心版本與原始碼樹不匹配,檢查 KERNELRELEASE

自動化腳本範例 (build-kernel.sh)

#!/bin/bash
set -e
KVER="5.15.100-custom"
cd /usr/src/linux-${KVER}
make -j$(nproc) bzImage modules
sudo make modules_install
sudo cp arch/x86/boot/bzImage /boot/vmlinuz-${KVER}
sudo cp .config /boot/config-${KVER}
sudo mkinitramfs -o /boot/initrd.img-${KVER} ${KVER}
sudo update-grub
echo "Kernel ${KVER} built & installed. Reboot to test."

結語

核心編譯看似繁雜,實則遵循固定流程:**配置 → 清理 → 編譯核心/模組 → 安裝模組 → 產生 initramfs → 更新 GRUB → 驗證** 掌握此流程,即可自由裁剪核心功能、回溯/前瞻版本、驗證補丁、優化啟動速度。建議配合 ccache、distcc 加速重複編譯,並將 .config 納入版控,實現核心建構的基礎設施即代碼化。

copyright © 萬盛學電腦網 all rights reserved