在網路中,不少伺服器採用的是Linux系統。為了進一步提高伺服器的效能,可能需要根 據特定的硬體及需求重新編譯Linux核心。編譯Linux 核心,需要根據規定的步驟進行,編譯核心過程中涉及到幾個重要的檔案。比如對於RedHat Linux,在/boot目錄下有一些與Linux核心有關的檔案 .
編譯過RedHat Linux核心的人對其中的System.map、vmlinuz、initrd-2.4.7-10.img印象可能比較深刻,因為編譯核心過程中涉及到這些檔案的建立等操作。那麼這幾個檔案是怎麼產生的?又有什麼作用呢?
對於Linux核心,編譯可以產生不同格式的映像檔案,例如:
# make zImage
# make uImage
# make bzImage
zImage是ARM Linux常用的一種壓縮映像檔案不能超過512KB,bzImage 即bigzImage ,二者的核心都是gzip壓縮的
uImage是U-boot專用的映像檔案,它是在zImage之前加上一個長度為0x40的“頭”,說明這個映像檔案的類型、載入位置、產生時間、大小等資訊。換句話說,如果直接從uImage的0x40位置開始執行,zImage和uImage沒有任何區別。另外,Linux2.4核心不支援uImage,Linux2.6核心加入了很多對嵌入式系統的支援,但是uImage的產生也需要設定。
一、vmlinuz
vmlinuz是可引導的、壓縮的核心。“vm”代表“Virtual Memory”。Linux 支援虛擬記憶體,不像老的作業系統比如DOS有640KB記憶體的限制。Linux能夠使用硬碟空間作為虛擬記憶體,因此得名“vm”。vmlinuz是可執行 的Linux核心,它位於/boot/vmlinuz,它一般是一個軟連結,比中是vmlinuz-2.4.7-10的軟連結。
vmlinuz的建立有兩種方式。
一是編譯核心時通過“make zImage”建立,手動拷貝到/boot目錄下面。zImage適用於小核心的情況,它的存在是為了向後的相容性。
二是核心編譯時間通過命令make bzImage建立,然後手動拷貝至/boot目錄下。bzImage是壓縮的核心映像,需要注意,bzImage不是用bzip2壓縮的,bz表示“big zImage”。 bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip壓縮的。它們不僅是一個壓縮檔,而且在這兩個檔案的開頭部分內嵌有gzip解壓縮代碼。所以你不能用gunzip或gzip –dc解包vmlinuz。
核心檔案中包含一個微型的gzip用於解壓縮核心並引導它。兩者的不同之處在於,老的zImage解壓縮核心到低端記憶體(第一個 640K),bzImage解壓縮核心到高端記憶體(1M以上)。如果核心比較小,那麼可以採用zImage或bzImage之一,兩種方式引導的系統運行 時是相同的。大的核心採用bzImage,不能採用zImage。
vmlinux是未壓縮的核心,vmlinuz是vmlinux的壓縮檔。
二、initrd-x.x.x.img
initrd是“initial ramdisk”的簡寫。initrd一般被用來臨時的引導硬體到實際核心vmlinuz能夠接管並繼續引導的狀態。圖中的initrd-2.4.7-10.img主要是用於載入ext3等檔案系統及scsi裝置的驅動。
比如,使用的是scsi硬碟,而核心vmlinuz中並沒有這個scsi硬體的驅動,scsi模組是儲存在根檔案系統的/lib/modules下的,那麼在裝入scsi模組之前,核心不能載入根檔案系統。為瞭解決這個問題,可以引導一個能夠讀實際核心的initrd核心並用initrd修正 scsi引導問題。initrd-2.4.7-10.img是用gzip壓縮的檔案,initrd實現載入一些模組和安裝檔案系統等功能。
initrd映象檔案是使用mkinitrd建立的。mkinitrd公用程式能夠建立initrd映象檔案。這個命令是RedHat專有的(這也是為什麼,在Linux核心包裡/Documentation/Changes裡面沒有提到要將mkinitrd升級)。其它Linux發行版或許有相應的命令。這是個很方便的公用程式。具體情況請看協助:man mkinitrd下面的命令建立initrd映象檔案。
initrd映象檔案是使用mkinitrd建立的。mkinitrd公用程式能夠建立initrd映象檔案。這個命令是RedHat專有的。其它Linux發行版或許有相應的命令。這是個很方便的公用程式。具體情況請看協助:man mkinitrd下面的命令建立initrd映象檔案。
三、uImage檔案
vmlinux是核心檔案,zImage是一般情況下預設的壓縮核心映像檔案,壓縮vmlinux,加上一段解壓啟動代碼得到。而uImage是u-boot使用bootm命令引導的Linux壓縮核心映像檔案格式,是使用工具mkimage對普通的壓縮核心映像檔案(zImage)加工而得。它是uboot專用的映像檔案,它是在zImage之前加上一個長度為 64位元組的“頭”,說明這個核心的版本、載入位置、產生時間、大小等資訊;其0x40之後與zImage沒區別。
由於bootloader一般要佔用0X0地址,所以,uImage相比zImage的好處就是可以和bootloader共存。
其實就是一個自動跟手動的區別,有了uImage頭部的描述,u-boot就知道對應Image的資訊,如果沒有頭部則需要自己手動去搞那些參數。
如何產生uImage檔案?首先 在uboot的/tools目錄下尋找mkimage檔案,把其copy到系統/usr/local/bin目錄下,這樣就完成製作工具。然後在核心目錄下運行make uImage,如果成功,便可以在arch/arm/boot/目錄下發現uImage檔案,其大小比zImage多64個位元組。
此外,平時調試用uImage,不用去管調整了哪些東西;zImage則是一切OK後直接燒0X0。開機就運行。