每一個Linux發行版都有自己專門的工具去構建自定義的內核. 本文主要介紹在Ubuntu平台上編譯內核, 如何從www.kernel.org(也叫vanilla kernel)獲得最新且未改動的內核源代碼來構建一個自定義的內核, 這樣你可以使用自己的內核而不是發行版的內核, 另外也介紹了如何給內核打補丁, 從而方便增加新的功能.
下面的工作我都在Ubuntu 6.10 Server ("Edgy Eft")和Ubuntu 6.06 Desktop ("Dapper Drake")上經過了測試.
我想首先要說的是文章中構建自定義內核的方式不是唯一的, 還有許多其它的方式, 這不過是我習慣的方式. 我不能保證使用後不會出現任何問題.
1. 預備工作我推薦使用root用戶執行下面所有的步驟. 如果你還沒有創建root登陸口令, 請運行下面的命令:sudo passwd root
然後, 以root身份登陸:su
如果你想使用一般用戶來替代root用戶, 記住在本文所有命令前輸入sudo, 比如當我運行apt-get update
你需要運行下面的命令來替代, 等.sudo apt-get update
1.1 Ubuntu 6.10上的/bin/sh ("Edgy Eft") 在Ubuntu 6.10, /bin/sh缺省是一個鏈接到/bin/dash的字符鏈接. 當你編譯軟件源代碼的時候, /bin/dash似乎還存在問題. 至少我已經遇到了一些問題. 所以我把/bin/sh鏈接到了/bin/bash.
如果你使用Ubuntu 6.10, 現在你可以運行:rm -f /bin/shln -s /bin/bash /bin/sh
2 安裝必需的軟件包 (為內核編譯做准備)首先我們升級軟件(包)庫:apt-get update
然後我們安裝所有需要的軟件包:apt-get install kernel-package libncurses5-dev fakeroot wget bzip2
3 下載內核源代碼接下來我們下載需要的內核到/usr/src目錄(去www.kernel.org網站下載你需要的內核版本, 比如. linux-2.6.18.1tar.bz2(你可以從這裡下載所有的2.6內核: http://www.kernel.org/pub/linux/kernel/v2.6/). 然後下載到/usr/src目錄:cd /usr/srcwget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.1.tar.bz2
然後解壓內核源代碼, 創建一個指向內核源代碼目錄的linux字符鏈接:tar xjf linux-2.6.18.1.tar.bz2ln -s linux-2.6.18.1 linuxcd /usr/src/linux
4 給內核源代碼打補丁(可選) 有時你的缺省內核不支持新買的設備, 你需要安裝新的驅動. 或者你需要使用虛擬技術或其它高級的技術, 而這些現有的內核都不支持. 這樣情況下你需要給給內核源代碼打補丁(當然補丁已經發布..)
現在我們假設你已經下載需要的補丁(以下例子我叫它patch.bz2)到/usr/src. 運行下面的命令給內核源代碼直接打上補丁(你的用戶必須位於/usr/src/linux目錄):bzip2 -dc /usr/src/patch.bz2 patch -p1 --dry-runbzip2 -dc /usr/src/patch.bz2 patch -p1
第一個命令用於測試, 對內核沒有任何影響. 如果沒有顯示錯誤, 你可以運行第二個命令給內核打補丁. 如果第一個命令有誤, 請務繼續的操作!
你也能夠通過內核的prepatches方式打補丁. 比如, 如果你需要一個功能, 而這個功能僅存在於2.6.19-rc4中, 正式完整的內核版本仍沒有發布, 而patch-2.6.19-rc4.biz2已經發布. 你可以把這個補丁打到2.6.18的內核源代碼中, 但請不要達到2.6.18.1或2.6.18.2, 等. 這個規則在接下來的網頁中注明: http://kernel.org/patchtypes/pre.Html
prepatches等同於linux中的測試發行; 他們位於存檔的測試目錄中, 我們可以使用patch(1)工具對上一個完整發行版(版本號分三部分)打補丁(例如, 2.6.12-rc4 prepatch只可以給2.6.11內核源代碼打補丁, 而不是2.6.11.10.)
所以如果你想編譯2.6.19-rc4內核, 你必須在步驟3.1下載2.6.18(http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2)替代2.6.18.1內核源代碼!
下面是如何給2.6.18打上2.6.19-rc4補丁:cd /usr/srcwget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc4.bz2cd /usr/src/linuxbzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 patch -p1 --dry-runbzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 patch -p1
5. 配置內核 使用當前工作內核的配置文件做為新內核配置文件的基礎是一個很好的主意. 因此我們拷貝已存的配置文件到/usr/src/linux:cp /boot/config-`uname -r` ./.config
然後運行make menUConfig
然後我們看到內核的配置菜單. 移動綠色光標到 Load an Alternate Configuration File 行後選擇.config文件(包含了當前工作內核的配置)做為配置文件:
然後浏覽內核配置菜單, 選擇你需要的功能. 完成配置後, 選擇Exit, 回答下面的問題(Do you wish to save your new kernel configuration? 你希望保存新的內核配置嗎?), 選擇Yes:
更多的請看:http://www.QQread.com/windows/2003/index.html
6 構建內核執行下面命令來構建內核:make-kpkg cleanfakeroot make-kpkg --initrd --append-to-version=-custom kernel_imagekernel_headers
在--append-to-version= 後面你可以寫上任何字符串來區別內核版本, 但是必須以" - "符號開始而且後面不包括任何空格.
保持耐心, 內核編譯需要一定時間, 主要看你的內核配置和處理器速度.
7 安裝新內核 在成功構建內核後, 你在/usr/src目錄能發現兩個.deb軟件包.cd /usr/srcls -l
在我的測試系統上, 他們分別名為 linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb (包含了實際的內核) 和 linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb (包含了需要的文件, 用於以後需要編譯額外的內核模塊). 我是這樣安裝的:dpkg -i linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.debdpkg -i linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
(現在你甚至能夠拷貝這兩個.deb文件到其它的Ubuntu系統, 通過上面的方式安裝. 你將不再需要編譯內核.)
然後檢查 /boot/grub/menu.lst文件, 現在你將能發現新內核使用的兩個引導配置塊:vi /boot/grub/menu.lst
在我測試系統上已經添加好的引導配置塊是這樣的:title Ubuntu, kernel 2.6.18.1-customroot (hd0,0)kernel /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro quiet splashinitrd /boot/initrd.img-2.6.18.1-customsavedefaultboot
title Ubuntu, kernel 2.6.18.1-custom (recovery mode)root (hd0,0)kernel /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro singleinitrd /boot/initrd.img-2.6.18.1-customboot
現在重啟系統:shutdown -r now
如果一切進展順利, 你的新內核正常工作. 你還可以通過運行下面命令來檢查新內核是否運行:uname -r
這將會顯示如:2.6.18.1-custom
如果系統沒有起來, 重啟一下, 你會看到:
按ESC進入GRUB菜單:
選擇你以前的內核啟動系統, 現在你能再次嘗試編譯新的工作內核. 不要忘記從/boot/grub/menu.1st文件中移去不需要的引導內核信息.
參考鏈接:
Ubuntu: http://www.ubuntu.comThe Linux Kernel Archives: http://www.kernel.org
原文鏈接:http://blog.zhaoke.com/7.html#more-7
參考鏈接:
Ubuntu: http://www.ubuntu.comThe Linux Kernel Archives: http://www.kernel.org
原文鏈接:http://blog.zhaoke.com/7.html#more-7