在伺服器領域,Linux 系統佔據主導地位。為了針對特定硬體與需求榨取極致效能,系統管理員往往需要重新編譯核心。編譯核心過程中會產生幾個至關重要的檔案,例如在 RedHat Linux 的 /boot 目錄下常見的 System.map、vmlinuz、initrd-x.x.x.img。這些檔案究竟如何生成?各自扮演什麼角色?本文將為您詳細拆解。
vmlinuz 是一個可開機、經過壓縮的 Linux 核心映像檔。名稱中的 vm 代表 Virtual Memory(虛擬記憶體)。Linux 支援虛擬記憶體機制,打破了 DOS 時代 640KB 記憶體的限制,能將硬碟空間作為記憶體延伸使用,故得名。該檔案通常位於 /boot/vmlinuz,多為一個符號連結。
make zImage 編譯,再複製至 /boot/vmlinuz。zImage 解壓縮至低端記憶體(前 640KB),主要為向後相容性保留。make bzImage 編譯,複製方式同前。注意 bz 並非 bzip2,而是 big zImage 的縮寫。bzImage 解壓縮至高端記憶體(1MB 以上),支援較大的核心。兩者皆使用 gzip 壓縮,且檔案開頭內建微型 gzip 解壓縮程式碼,因此不可直接用 gunzip 解包。核心啟動時會自行解壓縮並載入記憶體。此外,vmlinux 為未壓縮的核心,而 vmlinuz 則是其壓縮版本。
initrd(initial ramdisk)是一個暫時的根檔案系統映像檔,用於在核心 vmlinuz 接管系統前,預先載入必要的硬體驅動模組(如 SCSI、RAID 控制器驅動)或執行掛載根檔案系統所需的腳本。解決了「核心需驅動讀取硬碟,但驅動又存放在硬碟上的 /lib/modules」這類雞生蛋蛋生雞的問題。
initrd 映像檔同樣經 gzip 壓縮,由 RedHat 專有工具 mkinitrd 建立。其他發行版有對應工具(如 Debian 的 mkinitramfs、dracut 等)。執行 man mkinitrd 可查看詳細用法。
System.map 是特定核心版本的符號表,記錄了核心所有全域符號(函數名、變數名)與其記憶體位址的對應關係。它是 /boot/System.map-<版本> 的符號連結。
編譯核心時,在原始碼目錄(如 /usr/src/linux-2.4)執行:
nm vmlinux | grep -v '(compiled)|(.o$)|( [aUw] )|(..ng$)|(LASH[RL]DI)' | sort > System.map
再複製至 /boot 目錄並命名為 System.map-<版本>。
核心運行時僅識別位址(如 c0343f20),但開發者與除錯工具需要可讀的符號名(如 size_t BytesRead)。符號表提供雙向查詢:
重要性: 每次重新編譯核心,符號位址皆會改變,必須更新 System.map。雖然核心本身不直接使用它,但 klogd、lsof、ps 等工具依賴它進行位址-名稱解析;若缺失或版本錯誤,會導致核心日誌輸出不可靠、除錯困難,甚至部分需解析符號的驅動無法載入。klogd 會依序在 /boot/System.map、/System.map、/usr/src/linux/System.map 尋找,並能智慧匹配版本。
CentOS 設定 SSHD 開機自動啟動:chkconfig 與 systemctl 兩種方式
VCS 雙機啟動失敗排查:缺失 Samba 組件導致資源上線腳本報錯
Linux 系統管理員必備 80+ 核心指令與工具大全(分類速查版)
Linux 系統網路配置指南:修改 IP、DNS 與路由設定
Shell Scripting 基礎入門指南:從 Shell 類型到第一支腳本
Linux Shell 流程控制完全指南:if/for/while/until/case/select 實戰範例與最佳實踐