Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 核心關鍵檔案深度解析:vmlinuz、initrd 與 System.map

編輯:Linux 教學

在伺服器領域,Linux 系統佔據主導地位。為了針對特定硬體與需求榨取極致效能,系統管理員往往需要重新編譯核心。編譯核心過程中會產生幾個至關重要的檔案,例如在 RedHat Linux 的 /boot 目錄下常見的 System.map、vmlinuz、initrd-x.x.x.img。這些檔案究竟如何生成?各自扮演什麼角色?本文將為您詳細拆解。

一、vmlinuz:可開機的壓縮核心

vmlinuz 是一個可開機、經過壓縮的 Linux 核心映像檔。名稱中的 vm 代表 Virtual Memory(虛擬記憶體)。Linux 支援虛擬記憶體機制,打破了 DOS 時代 640KB 記憶體的限制,能將硬碟空間作為記憶體延伸使用,故得名。該檔案通常位於 /boot/vmlinuz,多為一個符號連結。

兩種建立方式

  • zImage(舊式小核心): 透過 make zImage 編譯,再複製至 /boot/vmlinuz。zImage 解壓縮至低端記憶體(前 640KB),主要為向後相容性保留。
  • bzImage(大核心標準): 透過 make bzImage 編譯,複製方式同前。注意 bz 並非 bzip2,而是 big zImage 的縮寫。bzImage 解壓縮至高端記憶體(1MB 以上),支援較大的核心。

兩者皆使用 gzip 壓縮,且檔案開頭內建微型 gzip 解壓縮程式碼,因此不可直接用 gunzip 解包。核心啟動時會自行解壓縮並載入記憶體。此外,vmlinux 為未壓縮的核心,而 vmlinuz 則是其壓縮版本。

二、initrd-x.x.x.img:初始化 RAM 磁碟

initrd(initial ramdisk)是一個暫時的根檔案系統映像檔,用於在核心 vmlinuz 接管系統前,預先載入必要的硬體驅動模組(如 SCSI、RAID 控制器驅動)或執行掛載根檔案系統所需的腳本。解決了「核心需驅動讀取硬碟,但驅動又存放在硬碟上的 /lib/modules」這類雞生蛋蛋生雞的問題。

initrd 映像檔同樣經 gzip 壓縮,由 RedHat 專有工具 mkinitrd 建立。其他發行版有對應工具(如 Debian 的 mkinitramfs、dracut 等)。執行 man mkinitrd 可查看詳細用法。

三、System.map:核心符號表

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)。符號表提供雙向查詢:

  • /proc/ksyms:核心啟動時動態建立的虛擬檔案(大小為 0),反映當前運行核心的符號。
  • System.map:實體檔案,對應編譯時的核心版本。

重要性: 每次重新編譯核心,符號位址皆會改變,必須更新 System.map。雖然核心本身不直接使用它,但 klogd、lsof、ps 等工具依賴它進行位址-名稱解析;若缺失或版本錯誤,會導致核心日誌輸出不可靠、除錯困難,甚至部分需解析符號的驅動無法載入。klogd 會依序在 /boot/System.map、/System.map、/usr/src/linux/System.map 尋找,並能智慧匹配版本。

Copyright © Windows教程網 All Rights Reserved