|
很多朋友一聽到說編譯內(nèi)核,就覺得很高深莫測,非常頭大。其實,通常其它操作系統(tǒng)的內(nèi)核編譯是比較繁瑣的。然而,由于Debian強大的dpkg軟件包管理系統(tǒng),使得內(nèi)核的升級、編譯也變得容易很多。如果下面的步驟都注意并執(zhí)行了,編譯內(nèi)核不是很復(fù)雜的事情,我在基于debian的ubuntu系統(tǒng)上第一次編譯就成功了。編譯過程如下,與各位分享:
修改ubuntu 6.10上的/bin/sh 在ubuntu6.10上,/bin/sh默認(rèn)是鏈接到/bin/dash的,當(dāng)你從源代碼編譯軟件的時候,dash可能會導(dǎo)致一些錯誤,至少我遇到過 類似問題,因此,我把/bin/sh的連接改為了/bin/bash。(估計中國絕大部分使用者都是用的bash吧) 如果你使用的就是6.10,那么應(yīng)該這樣做:
$ rm -f /bin/sh $ ln -s /bin/bash /bin/sh
安裝相關(guān)的軟件,包括 a、Ubuntu Dapper Drake 6.06 LTS 首選“軟件”,自己想辦法安裝吧 b、build-essential,里面有g(shù)cc,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,相關(guān)lib。
下載源碼 到www.kernel.org下載當(dāng)前最新版的源代碼。下載的分類有p,f等區(qū)別,要下f類型的連接,不要下補丁。下好的源代碼應(yīng)該有40多M。然后解壓縮源代碼。
# tar xjvf Linux-2.6.20.tar.bz2 -C /usr/src/Linux-2.6.20 # cd /usr/src/Linux-2.6.20
補丁 如果需要給內(nèi)核源代碼打補丁,首先下載相對應(yīng)的補丁,在這里我們以patch.bz2代替。將其放到/usr/src目錄下,然后用下來的命令來使其生效:
# bzip2 -dc /usr/src/patch.bz2 | patch -p1 –dry-run # bzip2 -dc /usr/src/patch.bz2 | patch -p1
注意!此時,你應(yīng)該一直處于/usr/src/Linux-2.6.20目錄下。
第一個命令僅僅是試驗性質(zhì)的,它并不會對你的源代碼產(chǎn)生什么變動。如果沒有產(chǎn)生什么錯誤信息,你才能用第二個命令來對源代碼產(chǎn)生真正的修補動作,如果第一條指令就出錯了,請別繼續(xù)執(zhí)行下去,看看錯誤出在哪里。
同樣,你也可以向你的內(nèi)核提供預(yù)補丁,例如,一旦你發(fā)現(xiàn)有一個自己需要的特性在2.6.19 rc4中提供,但這個版本的內(nèi)核并沒有發(fā)行所有的完整源代碼,只有patch-2.6.19-rc4.bz2是可選的。于是,你就可以提供這個patch 到2.6.18的內(nèi)核中,但不是2.6.8.1,或者2.6.8.2。
創(chuàng)建鏈接 創(chuàng)建一個指向新內(nèi)核代碼的符號
sudo ln -s /usr/src/Linux-2.6.16ck12 Linux
然后進(jìn)入這個目錄:
cd /usr/src/Linux
清理 運行命令
make mrproper
來清一下包。
配置 可以用現(xiàn)有的配置文件作為新內(nèi)核配置文件的基礎(chǔ),先復(fù)制已經(jīng)存在的配置文件到/usr/src/Linux目錄中
cp /boot/config-`uname -r` ./.config
然后運行
sudo make menuconfig
或者
sudo make xconfig
如果希望自己配置,那么就在這里面詳細(xì)選。對選項如何選擇不熟悉的,請參考這篇文章??床欢形??參考這里。
下面補充一些內(nèi)容,只說幾個這篇文章中沒有提到的。
Bus options (PCI, PCMCIA, EISA, MCA, ISA) PCI support PCI Express support 老式機器沒有PCI-E設(shè)備的可以選N ISA support 較新的新機器沒有ISA設(shè)備,可以選N MCA support 一般選N NatSemi SCx200 support 一般選N PCI Hotplug Support Support for PCI Hotplug (EXPERIMENTAL) 如果沒有PCI熱插拔設(shè)備,選N 這里的選項都要全部編譯進(jìn)內(nèi)核,而不是以模塊形式存在。
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(jìn) Graphics support 不建議把顯卡驅(qū)動編譯進(jìn)內(nèi)核。,選M,編譯成模塊方便日后升級驅(qū)動。
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ū)進(jìn)行寫操作,選Y Native Language Support Simplified Chinese charset (CP936, GB2312) 選Y或者M(jìn)使讀取FAT分區(qū)不會遇到中文亂碼現(xiàn)象 必須將啟動盤的文件系統(tǒng)編譯進(jìn)內(nèi)核,默認(rèn)是編譯成模塊,這樣無法啟動系統(tǒng)。最好是把硬盤上所有用到的分區(qū)文件系統(tǒng)全部編譯進(jìn)內(nèi)核。
然后再談幾個常見的問題解決方法:
1、編譯內(nèi)核失敗,不能進(jìn)入系統(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硬盤,原來內(nèi)核中硬盤的設(shè)備號是/dev/sda,編譯新內(nèi)核后的硬盤設(shè)備號由/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、用上新版本內(nèi)核后,無法安裝顯示卡的NVIDIA-Linux-x86-1.0-7676-pkg1.run驅(qū)動,系統(tǒng)提示如下:
解決方法: 重新配置內(nèi)核,將內(nèi)核中 08.21、Graphics support —> 這個選項里面與Nvidia相關(guān)的選項全部去掉后,竟然能夠正確安裝顯卡驅(qū)動!具體情況如系統(tǒng)提示,不能引導(dǎo)內(nèi)核模塊,或是模塊沖突,導(dǎo)致這種故障。
設(shè)置完,保存即可。
構(gòu)建內(nèi)核 接下來,就開始構(gòu)建內(nèi)核了。首先清理一下東西:
$ sudo make-kpkg clean
然后
$sudo make-kpkg -initrd –revision=lk_517 kernel_image kernel_headers modules_image
lk_517是可以自己換得,表示鏡像的名字,必須要以數(shù)字結(jié)尾。最后是生成鏡像包和頭文件包。你也可以用binary代替,它融合了image.headers.doc.source,是最完整的包。
make-kpkg是一個可以自動替換”make dep;make clean;make bzImage;make modules”命令序列的腳本。而最其最常用的兩個參數(shù)就是–append-to-version與–revision。 – append-to-version這個選項可以讓我們來指定一個額外的內(nèi)核版本,這個可以成為內(nèi)核名的一問分。我們可以使用數(shù)字,”+”,”,”, 但是不要使用下劃線。要避免設(shè)置–append-to-version為如”-686″,”-K7″,”-sparc”等值,因為這些值常為 Debian的預(yù)編譯內(nèi)核所使用。
內(nèi)核模塊位于/lib/modules子目錄下。每一個內(nèi)核有他自己的子目錄。每次當(dāng)我們以一個新的名字來安裝一個新的內(nèi)核時,這個包安裝程序就會在/lib/modules目錄下創(chuàng)建一個新的子目錄來保存他自己的模塊。這就意味著每一次我們使用– append-to-version的一個新的值來編譯一個內(nèi)核時,我們就可以保證這個內(nèi)核有一個新的名字,而他的模塊也不會與其他的內(nèi)核模塊相沖突。
注意:如果我們使用相同的名字來安裝一個內(nèi)核時,安裝程序就會覆蓋掉已安裝的內(nèi)核及其模塊。–revision只會影響Debian軟件包本身的名字而不是內(nèi)核的名字。與–append-to-version相似,我們只可以使用數(shù),”+ “,”.”,不要使用下劃線”_”。如果我們并沒有為–revision指定一個值,make-kpkg就會使用”10.00.Custom”.使用不同的–revision的值就可以避免相同名字的內(nèi)核之間的沖突。
在內(nèi)核構(gòu)建成功之后,你能在/usr/src目錄下看見三個.deb文件。其中包括Linux-image-2.6.20- custom_2.6.20-custom-10.00.Custom_i386.deb (包含真實內(nèi)核) and Linux-headers-2.6.20-custom_2.6.20-custom-10.00.Custom_i386.deb (包含那些編譯附加內(nèi)核模塊所需要的文件)。
kernel-image文件的名字格式如下:
kernel-image-(kernel-version)(–append-to-version)_(–revision)_(architecture).deb
我用這種辦法安裝:
sudo dpkg -i xxx.deb
你甚至可以將這兩個deb包轉(zhuǎn)移到其他的ubuntu系統(tǒng)中,并用相同的辦法安裝它們。這意味著,你不再需要再一次編譯它們了。
完成 好了,現(xiàn)在,你可以檢查一下你的menu.lst文件,多了兩個與新內(nèi)核有關(guān)的部分。現(xiàn)在,重新啟動計算機,shutdown -r。如果一切順利的話,重新啟動之后,你使用的就是新的內(nèi)核了。你可以通過 ” uname -r”命令來看看目前的內(nèi)核版本。
這下就算徹底完成了。重新啟動計算機,在GRUB中選擇新內(nèi)核啟動。如果啟動失敗,當(dāng)你看見屏幕上出現(xiàn) “Press ESC to enter the menu…1″這行字的時候,按下ESC,此時會進(jìn)入grub的啟動菜單,好,選擇你的舊版內(nèi)核,啟動系統(tǒng)?,F(xiàn)在,你不得不重新編譯一次內(nèi)核,使其能夠正常使用。編譯之前別忘了,從menu.lst中去除之前的兩個不能正常工作的內(nèi)核區(qū)域。 |
|
|