作者很早就開始嘗試編譯 Linux 核心,但反覆遇到各種問題,經過數十次的嘗試才最終成功。為了避免他人重蹈覆轍,將整個過程詳細記錄下來。本文以 Red Hat Linux 9 為環境,核心版本為 2.6.14.4。
前往 kernel.org 下載最新的核心原始碼,解壓到 /usr/src/linux 目錄。
注意:務必在 Linux 環境下解壓,如果在 Windows 下解開會遇到問題(Windows 不區分檔案大小寫,會導致部分檔案被覆蓋)。
cd /usr/src/linux
# 清除上次編譯產生的中間檔案 make mrproper # 進入核心配置介面 make menuconfig
在 VMware 中編譯核心時,以下選項必須正確選擇,否則將無法正常運行:
Device Drivers → SCSI device support → <*> SCSI disk supportDevice Drivers → SCSI device support → SCSI low-level drivers → <*> BusLogic SCSI supportDevice Drivers → Fusion MPT device support → Fusion MPT (base + ScsiHost) drivers 和 Fusion MPT misc device (ioctl) driver (後者視需求選擇)Device Drivers → USB support → <*> USB Mass Storage supportDevice Drivers → Networking support → Ethernet (10 or 100Mbit) → <*> AMD PCnet32 PCI support在 2.6 版本中,make dep 已不再需要。
# 產生壓縮核心 make bzImage # 將編譯好的核心複製到啟動目錄 cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmkernel # 編譯可載入模組 make modules # 安裝模組 make modules_install
整個編譯過程通常需要超過一個小時的時間。
如果 BusLogic SCSI support 選擇的是 M(模組),則需要手動製作 initrd 映像檔:
mkinitrd /boot/newkernel.img 2.6.14.4
如果 BusLogic SCSI support 選擇的是 *(靜態編入核心),則不需要執行此步驟。
在 /etc/grub.conf 中新增以下內容:
title New Kernel (2.6.14.4) root (hd0,0) kernel /vmkernel ro root=/dev/sda2 initrd /newkernel.img
若 BusLogic SCSI support 選擇的是 M,請保留 initrd /newkernel.img 這一行;若選擇的是 *,則應註釋掉此行(在前面加上 #)。
在 /etc/lilo.conf 中新增以下內容:
image=/boot/vmkernel label=New initrd=/boot/newkernel.img read-only append="root=/dev/sda2"
同樣地,根據 BusLogic SCSI support 的選擇決定是否註釋 initrd 行。修改後執行 lilo 指令更新引導程式。
完成上述配置後,重新啟動系統即可使用新編譯的核心。
這是因為在 Windows 下解壓核心原始碼所致。Windows 不區分檔案大小寫,ipt_TOS.c 和 ipt_tos.c 會被視為同一個檔案而互相覆蓋。解決方法是將原始碼在 Linux 環境下重新解壓。
檢查引導程式配置檔案,將根檔案系統指定為具體的裝置檔案(如 /dev/sda2),避免使用 LABEL 標籤來指定根分區。