很多朋友一聽到說
編譯內核,就覺得很高深莫測,非常頭大。其實,通常其它
操作系統(tǒng)的內核
編譯是比較繁瑣的。然而,由于Debian強大的dpkg軟件包管理系統(tǒng),使得內核的升級、
編譯也變得容易很多。如果下面的步驟都注意并執(zhí)行了,
編譯內核不是很復雜的事情,我在基于debian的ubuntu系統(tǒng)上第一次
編譯就成功了。
編譯過程如下,與各位分享:
修改ubuntu 6.10上的/bin/sh
在ubuntu6.10上,/bin/sh默認是鏈接到/bin/dash的,當你從源代碼
編譯軟件的時候,dash可能會導致一些錯誤,至少我遇到過 類似問題,因此,我把/bin/sh的連接改為了/bin/bash。(估計中國絕大部分使用者都是用的bash吧)
如果你使用的就是6.10,那么應該這樣做:
$ rm -f /bin/sh
$ ln -s /bin/bash /bin/sh
安裝相關的軟件,包括
a、Ubuntu Dapper Drake 6.06 LTS 首選“軟件”,自己想辦法安裝吧
b、build-essential,里面有gcc,make等東西要用到。
c. kernel-package,里面有make-kpkg要用。
d. qt庫,主要是為了用make xconfig圖形界面配置,你要安裝libqt3-headers,libqt3-mt-dev等
e. libncurses5-dev,主要是用make menuconfig,我就用這個。
f. gtk庫,用于make gconfig。安裝gtk2.0,相關lib。
下載源碼
到www.kernel.org下載當前最新版的源代碼。下載的分類有p,f等區(qū)別,要下f類型的連接,不要下補丁。下好的源代碼應該有40多M。然后解壓縮源代碼。
# tar xjvf
Linux-2.6.20.tar.bz2 -C /usr/src/
Linux-2.6.20
# cd /usr/src/
Linux-2.6.20
補丁
如果需要給內核源代碼打補丁,首先下載相對應的補丁,在這里我們以patch.bz2代替。將其放到/usr/src目錄下,然后用下來的命令來使其生效:
# bzip2 -dc /usr/src/patch.bz2 | patch -p1 –dry-run
# bzip2 -dc /usr/src/patch.bz2 | patch -p1
注意!此時,你應該一直處于/usr/src/
Linux-2.6.20目錄下。
第一個命令僅僅是試驗性質的,它并不會對你的源代碼產生什么變動。如果沒有產生什么錯誤信息,你才能用第二個命令來對源代碼產生真正的修補動作,如果第一條指令就出錯了,請別繼續(xù)執(zhí)行下去,看看錯誤出在哪里。
同樣,你也可以向你的內核提供預補丁,例如,一旦你發(fā)現(xiàn)有一個自己需要的特性在2.6.19 rc4中提供,但這個版本的內核并沒有發(fā)行所有的完整源代碼,只有patch-2.6.19-rc4.bz2是可選的。于是,你就可以提供這個patch 到2.6.18的內核中,但不是2.6.8.1,或者2.6.8.2。
創(chuàng)建鏈接
創(chuàng)建一個指向新內核代碼的符號
sudo ln -s /usr/src/
Linux-2.6.16ck12
Linux然后進入這個目錄:
cd /usr/src/
Linux清理
運行命令
make mrproper
來清一下包。
配置
可以用現(xiàn)有的配置文件作為新內核配置文件的基礎,先復制已經存在的配置文件到/usr/src/
Linux目錄中
cp /boot/config-`uname -r` ./.config
然后運行
sudo make menuconfig
或者
sudo make xconfig
如果希望自己配置,那么就在這里面詳細選。對選項如何選擇不熟悉的,請參考這篇文章??床欢形??參考這里。
下面補充一些內容,只說幾個這篇文章中沒有提到的。
Bus options (PCI, PCMCIA, EISA, MCA, ISA)
PCI support
PCI Express support 老式機器沒有PCI-E設備的可以選N
ISA support 較新的新機器沒有ISA設備,可以選N
MCA support 一般選N
NatSemi SCx200 support 一般選N
PCI Hotplug Support
Support for PCI Hotplug (EXPERIMENTAL) 如果沒有PCI熱插拔設備,選N
這里的選項都要全部
編譯進內核,而不是以模塊形式存在。
Device Drivers
Block devices
Packet writing on CD/DVD media
Enable write caching (EXPERIMENTAL) 如果你有刻錄機,想啟用寫緩存功能,選Y
ATA/ATAPI/MFM/RLL support
Include IDE/ATA-2 DISK support 如果你的/boot是放在IDE硬盤上,那么這里一定要選Y,選M都不行。否則啟動時會出現(xiàn)“waiting for root file system”的提示而停滯不前。
SCSI device support 如果有SATA硬盤,就選Y
SCSI disk support 如果你的/boot放在SATA硬盤上,一定要選Y。
Character devices
I2C support 一般可以選Y或者M
Graphics support 不建議把顯卡驅動
編譯進內核。,選M,
編譯成模塊方便日后升級驅動。
File systems
CD-ROM/DVD Filesystems
ISO 9660 CDROM file system support 一般選Y
DOS/FAT/NT Filesystems
VFAT (Windows-95) fs support 有FAT32分區(qū)就選Y吧
NTFS file system support 有NTFS分區(qū)就選Y吧
NTFS write support 如果想對 NTFS分區(qū)進行寫操作,選Y
Native Language Support
Simplified Chinese charset (CP936, GB2312) 選Y或者M使讀取FAT分區(qū)不會遇到中文亂碼現(xiàn)象
必須將啟動盤的文件系統(tǒng)
編譯進內核,默認是
編譯成模塊,這樣無法啟動系統(tǒng)。最好是把硬盤上所有用到的分區(qū)文件系統(tǒng)全部
編譯進內核。
然后再談幾個常見的問題解決方法:
1、
編譯內核失敗,不能進入系統(tǒng),提示如下:
audit(1129243020.326:0):initialized
kernel panic – not syncing: VFS:Unable to mount root fs on unknown-block(0,0)
或是:
VFS:Cannot open root device “hdxy” or unknow-block(0,0)
Please append a correct “root=” boot option
kernel panic-not syncing: VFS:Unable to mount root fs on unknow-block(0,0)
解決方法:把
08.05.11、<*> RAM disk support
09.27.07、<*> Compressed ROM file system support (cramfs) 這兩項都要選上!!!!!!否則,呵呵!
2、不能掛載ISO文件。
解決方法:把
08.05.06、<*> Loopback device support
08.05.07、<*> Cryptoloop Support 這兩項都要選上便可!
3、用SATA硬盤,原來內核中硬盤的設備號是/dev/sda,
編譯新內核后的硬盤設備號由/dev/sda變成/dev/hde,硬盤聲音很吵。
解決方法:把
08.07、SCSI device support —>
08.07.01、<*> SCSI device support
# 08.07.02、 legacy /proc/scsi/ support
08.07.03、<*> SCSI disk support 這些選項都選上便可!
4、用上新版本內核后,無法安裝顯示卡的NVIDIA-
Linux-x86-1.0-7676-pkg1.run驅動,系統(tǒng)提示如下:
Unable to load the kernel modules “nvidia.ko ”, This is most likely because the kernel modules was built using the wrong kernel source files. Please make sure you have installed the kernel source files for your kernel; on Red Hat
Linux system, for example, be sure you have the kernel source “rpm” installed. If you know the correct kernel source files are installed, you may specify the kernel source path with the “–kernel-source-path” commandline option.
解決方法:
重新配置內核,將內核中
08.21、Graphics support —> 這個選項里面與Nvidia相關的選項全部去掉后,竟然能夠正確安裝顯卡驅動!具體情況如系統(tǒng)提示,不能引導內核模塊,或是模塊沖突,導致這種故障。
設置完,保存即可。
構建內核
接下來,就開始構建內核了。首先清理一下東西:
$ sudo make-kpkg clean
然后
$sudo make-kpkg -initrd –revision=lk_517 kernel_image kernel_headers modules_image
lk_517是可以自己換得,表示鏡像的名字,必須要以數(shù)字結尾。最后是生成鏡像包和頭文件包。你也可以用binary代替,它融合了image.headers.doc.source,是最完整的包。
make-kpkg是一個可以自動替換”make dep;make clean;make bzImage;make modules”命令序列的腳本。而最其最常用的兩個參數(shù)就是–append-to-version與–revision。
– append-to-version這個選項可以讓我們來指定一個額外的內核版本,這個可以成為內核名的一問分。我們可以使用數(shù)字,”+”,”,”, 但是不要使用下劃線。要避免設置–append-to-version為如”-686″,”-K7″,”-sparc”等值,因為這些值常為 Debian的預
編譯內核所使用。
內核模塊位于/lib/modules子目錄下。每一個內核有他自己的子目錄。每次當我們以一個新的名字來安裝一個新的內核時,這個包安裝程序就會在/lib/modules目錄下創(chuàng)建一個新的子目錄來保存他自己的模塊。這就意味著每一次我們使用– append-to-version的一個新的值來
編譯一個內核時,我們就可以保證這個內核有一個新的名字,而他的模塊也不會與其他的內核模塊相沖突。
注意:如果我們使用相同的名字來安裝一個內核時,安裝程序就會覆蓋掉已安裝的內核及其模塊。–revision只會影響Debian軟件包本身的名字而不是內核的名字。與–append-to-version相似,我們只可以使用數(shù),”+ “,”.”,不要使用下劃線”_”。如果我們并沒有為–revision指定一個值,make-kpkg就會使用”10.00.Custom”.使用不同的–revision的值就可以避免相同名字的內核之間的沖突。
在內核構建成功之后,你能在/usr/src目錄下看見三個.deb文件。其中包括
Linux-image-2.6.20- custom_2.6.20-custom-10.00.Custom_i386.deb (包含真實內核) and
Linux-headers-2.6.20-custom_2.6.20-custom-10.00.Custom_i386.deb (包含那些
編譯附加內核模塊所需要的文件)。
kernel-image文件的名字格式如下:
kernel-image-(kernel-version)(–append-to-version)_(–revision)_(architecture).deb
我用這種辦法安裝:
sudo dpkg -i xxx.deb
你甚至可以將這兩個deb包轉移到其他的ubuntu系統(tǒng)中,并用相同的辦法安裝它們。這意味著,你不再需要再一次
編譯它們了。
完成
好了,現(xiàn)在,你可以檢查一下你的menu.lst文件,多了兩個與新內核有關的部分?,F(xiàn)在,重新啟動計算機,shutdown -r。如果一切順利的話,重新啟動之后,你使用的就是新的內核了。你可以通過 ” uname -r”命令來看看目前的內核版本。
這下就算徹底完成了。重新啟動計算機,在GRUB中選擇新內核啟動。如果啟動失敗,當你看見屏幕上出現(xiàn) “Press ESC to enter the menu…1″這行字的時候,按下ESC,此時會進入grub的啟動菜單,好,選擇你的舊版內核,啟動系統(tǒng)。現(xiàn)在,你不得不重新
編譯一次內核,使其能夠正常使用。
編譯之前別忘了,從menu.lst中去除之前的兩個不能正常工作的內核區(qū)域。