如何編譯Linux核心? 相信你會得到很多種不同的答案,而我在寫此文章之前,總是獲得一些編譯錯誤的結果。
如何你總是遇到編譯錯誤或者失敗,其實很多情況下是你下載的核心版本的問題,就是在高版本GCC中編譯低版本的核心,造成編譯失敗。如果你對編譯核心一悉莫展,在網上Google到很多種編譯方法,但都失敗的情話。倒不如看看核心的README文檔,或者在核心目錄下運行make help。它將會告訴許多你所不知的秘密。
1. Linux系統編譯核心的通用方法
核心代碼中的README檔案對編譯過程有非常 詳細介紹,下而介紹的方法是Linux核心通用的編譯方法,它是Makefile檔案已定義好的編譯過程。
1) 下載原始碼(以2.6.28為例)
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.1.tar.gz
2) 解壓,並把它放到/usr/src/目錄下
gzip -d linux-2.6.28.1.tar.gz
tar -xvf linux-2.6.28.1.tar
mv -rf linux-2.6.28.1 /usr/src
3) 在/usr/src/建立一個軟連結到linux-2.6.28.1目錄
cd /usr/src
ln -s linux-2.6.28.1 linux
cd linux
4) 清理原始碼(如果是之前已產生一些中間檔案可運行此命令,否則不必了)
make mrproper
5) 產生config檔案
cp /boot/config-`uname -r` ./.config
make menuconfig
在make menuconfig的配置介面中,先選擇Load config file, 把該才拷貝的檔案載入進來再進行修改,修改完成後,直接選Exit,然後在提示中選擇保當前設定檔。
6) 編譯
make
7) 安裝模組
make modules_install
該命令會把模組及相關檔案放到目錄/lib/modules/2.6.18.1/下,並不會與當前核心產生衝突,除非核心版本是一樣的。
8)安裝核心
make install
該命令會把核心相關檔案(bzImage, initrd.img,System.map .config)放到/boot/目錄下,檔案名稱均帶有核心版本名,與其它版本相關區別。
如果系統安裝了LILO,它會自己把該核心的啟動加進來。如果是grub程式,那要看情況而定。我在Fodera系統中,它會自動添加該啟動項到/boot/grup/menu.lst檔案中,而在Ubuntu中則不會,需要手動添加。添加完也,即可重啟進行新核心。
2. Ubuntu核心編譯方法。
上面介如的通常方法適合於所有的Linux系統,Ubuntu也不例外。Ubuntu同樣提供了編譯核心的方法。而且方法非常簡單,把上述第6)和7)步換成下面這一命令即可。
make-kpkg --initrd --append-to-version <your_tag> kernel_image kernel_headers
其中<your_tag>是你給核心名字在版本號碼的基礎上加上你指定的字串,如果你打算直接使用核心版本號碼作為核心名字,則把--append-to-version和它的參數從命令列中去掉。個人建議你不要使用該選項,因為核心名字就是uname -r的運行結果,使得有時編譯新的模組程式時,uname -r 和 make kernelrelease結果不一致。
該命運行完畢後,產生兩個deb包,其它一個是核心和模組的包;另一個是標頭檔的deb包。如果不需要,可在命令列上把kernel_header去掉。
安裝核心變異常簡單,只需安裝一個產生的核心映象的deb包。使用如下命令:
dpkg - i linux-image-2.6.28.1_2.6.28.1-10.00.Custom_i386.deb
安裝完後,所有的事情也就完成了,連/boot/grub/menu.lst的啟動功能表項目都修改好了,你所要做的事情就是重啟系統而已。
使用這種方法的好處是不言而喻的:你只需要在一台Ubuntu上編譯好一個較新的核心,就可以在整個實驗室中升級,何樂而不為呢?
3. Fodera 核心編譯方法
很抱歉,目前還未有找到很準確的Fodera核心編譯方法,後面會補上。但這裡介紹的方法仍然適後Fodera系統,那就是象Ubuntu一樣,把核心編譯成為一個rpm包。而且非常簡單,只需把上面的第6)和7)步換成下面的命令:
make rpm-pkg
運行完後,核心rpm包位於目錄/usr/src/rpm/RPMS/i386/kernel-2.6.28.1.i386.rpm下,使用rpm -i
kernel-2.6.28.1.i386.rpm
命令即可安裝。
安裝rpm完成後,請檢查/boot/grup/menu.lst檔案是否有新核心的啟動,若否請手工添加。