是日,閑暇之餘研究了一下Linux的Kernel的編譯。以前都是在Windows平台工作,幾乎無機會用Linux,於是也想湊熱鬧玩一下。平台是最新的Ubuntu 10.04 LTS,Kernel也是最新下載的2.6.35.2版本。其實現在Kernel的編譯比過去方便的多,用menuconfig的話幾乎不用人工配置,命令也不用敲多少行。編譯核心算是學Linux Kernel最開始的部分。
編譯步驟:
1. 到http://www.kernel.org/
上下載最新的核心原始碼linux-2.6.35.2.tar.bz2(目前最新的版本),然後放在/usr/src目錄下。
2. 為了使編譯過程方便,建議進入root賬戶進行操作,這樣做使你不用每次都用sudo命令。(我還不太瞭解這樣做安全性是否可靠)
進入Terminal,執行:su root
然後輸入你的Password,這樣就在root賬戶許可權下進行剩下的操作了。
3. 下載的Linux源碼是壓縮包,需要解壓到目錄下:tar -j
x
vf linux-2.6.35.2.tar.bz2 -C /usr/src
4. 進入解壓後的目錄:cd /usr/src/linux-2.6.35.2
5. 檢查有無不正確的.o檔案和依賴關係: make mrproper
(其實這一步可以省略,因為是剛下載好的源碼,一定是乾淨的;如果使用的是已經編譯過的code,則需要做這一步)
6. 配置Kernal選項:make menuconfig
(這一步很重要,它決定了你可以個人定製化你的Kernel。當你使用menuconfig時,會有一些選擇列出來) 主列表如下:
General Setup: 常規的配置,比如Kernel config, CPU Group,Aduiting等等
Loadable module support: 定製你要載入哪些modules
Enable the block layer: 主要是塊裝置和大檔案的設定
Processor type and features: 處理器配置和定製化
Power management options: 電源管理的定製化,比如Hibernate這樣的
Bus options: PCI匯流排的定製
Executable file formats: 主要是設定ELF的配置
Networking support: 定製網路選項,包括Wireless,Bluetooth和Network選項
Device Drivers: 定製你需要載入的裝置驅動
Fireware Drivers: BIOS和EFI這樣的韌體驅動設定
File System: 檔案系統的設定,包括EXT3, EXT4, FAT, CD/DVD...等等N種
Kernel hacking: 主要是設定Kernel debugging的,做核心調試會有用
Security options: 安全選項
Cryptographic API: 加密設定,包括MD5, SHA1, CRC等等N種密碼編譯演算法的配置
Virtualization: 虛擬化設定
Library routines: 主要定製CRC校正的function
上面是16大項,每一項都有N多小項,說真的這個裡面每一項都夠研究一陣子的。不過對核心編譯而言,你可以全部採用預設選項(會延長編譯時間)。設定好了menuconfig,儲存退出。
7. 建立Modules依賴關係: make dep
8. 刪除配置後剩下的不適用的檔案:make clean
9. 編譯核心:make bzImage
(這個會花些時間,看機器情況和menuconfig的定義而言。我採用預設的設定,編譯時間花了20分鐘左右。如果Kernel小於512K,可以用make zImage
命令)
10. 編譯核心模組:make modules
(這個也會花點時間,要看你定製的modules數量而言。採用預設設定,花了大約25分鐘。你可以用make -j<n>
加快編譯速度,n代表你CPU的數量)
11. 安裝核心模組:make modules_install
12. 安裝核心:make install
13. 建立initrd檔案:(1) cd/
(2)輸入:mkinitramfs 2.6.35.2 -o /boot/initrd.img-2.6.35.2-generic
14. 拷貝編譯好的核心image: cp /usr/src/linux-2.6.35.2/arch/i386/boot/bzImage /boot/vmlinuz-2.6.35.2-generic
15. 最後一步,修改Grub,更新啟動列表:update-grub
(如需手動編輯grub.cfg, 則在root賬戶下使用gedit就可以了)
(註:Ubuntu10.04已經使用了Grub2來管理啟動設定,而不是Grub,所以在以往的/boot/grub路徑下你是找不到menu.lst的, 因為Grub2已經使用了/boot/grub/grub.cfg來管理配置啟動設定,不過最好不要手動編譯這個檔案,具體的方式是編輯/etc/default/grub和/etc/grub.d下的指令檔。有關Grub2的詳細教程,請參考https://docs.google.com/Doc?docid=0AeVQ5PqmbeaoZGc0czgyOWtfMjRjbWo0ODVoYw&hl=en
)
16. Reboot機器,然後Enjoy it!