本篇全文出自:Ubuntu 中國論壇-ubuntu環境下編譯內核詳解


聲明:本文是個人參考網上有關資料,編譯2.6.25內核的總結,如按本文步驟編譯內核造成的責任和本文作者無關。
本文放在本人的blog上面:http://hi.baidu.com/ffbp89/
本文還有姊妹篇《老筆記本編譯2.6.20內核指導》
如果有修改,也在blog上。
歡迎轉載本文,但是請不要取消本聲明。
寫這篇東西主要是教學目的,學生可以結合編譯內核覆習shell的有關命令。


一、下載源代碼和編譯軟件的準備
下載內核源代碼:http://www.kernel.org/
注意,點擊2.6.25內核的F版,即完整版。
如果你懶得去網站點聯接,運行下列命令:

代碼:
$cd ~
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.10.tar.bz2

安裝有關編譯程序。安裝make ,gcc, make-kpkg,運行menuconfig等等和編譯內核相關的工具。
安裝不了,請檢查/etc/apt/sources.list 文件。
有關命令:
代碼:

$sudo  apt-get install build-essential kernel-package   libncurses5-dev


二、解壓源代碼
注意,網上很多教程上說應該解壓到 /usr/src,純屬以訛傳訛,linux掌門人linus說解壓到任何目錄上都可以。當然,linus的說法是正確的。我放在自己的主目錄下的src目錄。
如果你下載源代碼是放到自己的主目錄下或者運行上面的wget下載的,那麼運行下列命令:
代碼:

$ cd ~
$ mkdir src && tar jfx linux-2.6.25.10.tar.bz2 -C src/


現在,源代碼就在 ~/src/linux-2.6.25.10
進入源代碼的目錄,準備下一步的工作。後面都在這個目錄裡面進行。
代碼:

$ cd ~/src/linux-2.6.25.10


三、開始編譯前的準備工作。
首先,清理以前編譯時留下的臨時文件。如果是剛剛解開的包,不需要執行這步。如果是第二次或者是第n次編譯,那麼一定要執行。
相關命令如下:
代碼:

$ sudo make mrproper

網上很多教程上說把現在使用的內核的config拷貝過來參考,據實驗,是不需要的,ubuntu還有
debian會自動做這步。不過這條命令倒是可以學習一下。當然你可以將以前的配置拷貝過來。
命令:
代碼:

cp /boot/config-`uname -r` ./.config


四、開始配置內核選項。
相關命令:
代碼:

$sudo make menuconfig


配置用到的鍵只有幾個,esc退出菜單;空格改變選項狀態;光標鍵上下左右移動,回車選定。
選項意義:M是編譯成可以隨時加入的模塊,*是編譯進入內核,空就是不要。
配置選項非常多,具體配置可以參考金步國先生翻譯的資料:Linux 2.6.19.x 內核編譯配置選項。
參考網址:http://lamp.linux.gov.cn/Linux/kernel_options.html
為了一次成功,請大家遵循一個原則,如果你自己使用的內核已經選用了某個選項,如果你沒用充分的理由,不要隨便改動。這樣雖然內核不那麼精簡,但是不容易出現問題。
我們可以精簡的部分是硬件模塊部分,對於自己沒有的硬件要毫不猶豫的清除。
如果你很執著,或者你有潔癖,你也可以一項項對過去,按照金步國先生的資料描述去選擇基本上沒有問題。

五、必須強調的幾個選項:
1、在「General setup」裡面的「Prompt for development and/or incomplete code/drivers」金步國認為是不需要。但是如果你的硬件比較新,那幾乎是必須選的,這樣,我們才可以找到4965無線網卡,alsa聲音驅動等 等。
Kernel log buffer size 我選15,雙核。如果你用ia64,要選16。
Control Group support 集群支持?可以不要
Choose SLAB allocator (SLUB (Unqueued Allocator)) 內存管理模式slab和slub選擇slub。

2、在「Block layer」裡,假如沒有2TB的硬盤,就去掉:Support for Large Block Devices 。Support for Large Single Files 也不需要,誰有2TB的文件?

3、Processor type and features中是關於cpu的,要認真選。
Symmetric multi-processing support是打開多核的開關,我的cpu是雙核的,選中。
Processor family (Core 2/newer Xeon) 我的是Core 2/newer Xeon。找到自己的cpu後,把Generic x86 support選項取消。
Subarchitecture Type 選(PC-compatible)
Maximum number of CPUs 輸入自己的核心數目,我輸入2。
SMT (Hyperthreading) scheduler support說的是超線程技術,P4有支持的,我的t8100不支持,目前大部分市場上的家用cpu都不支持。
High Memory Support (4GB) 1G以下選1G;我是3G,選4G;4G以上的選16G
在「 Timer frequency 」裡,默認是250Hz,較新的cpu都可以選擇了1000Hz,性能更好。

4、Power management options中把APM (Advanced Power Management) BIOS support關閉。現在的電腦都用acpi了。
CPU Frequency scaling 是筆記本cpu節電技術
Default CPUFreq governor (conservative) cpu節電模式有四個,筆記本默認選conservative比較好。
ACPI Processor P-States driver 必須選,不然CPU Frequency就不能用。
後面的可選自己硬件相關的,我選的是Intel Enhanced SpeedStep和 Intel Speedstep on ICH-M chipsets,其他的統統消滅。

5、Bus options的選擇:
Bus options (PCI, PCMCIA, EISA, MCA, ISA)
PCI support
PCI Express support 現在新買的機器基本上都是PCI Express了
ISA support 較新的新機器沒有ISA設備,可以去掉
MCA support 去掉
NatSemi SCx200 support 去掉
PCI Hotplug Support
Support for PCI Hotplug (EXPERIMENTAL) 如果沒有PCI熱插拔設備,去掉
這裡的選項可以考慮全部編譯進內核,而不是以模塊形式存在。

6、Device Drivers是重點,由於linux不但面向個人工作站,更多的是面向服務器的應用,所以可以把自己機器上沒有的硬件全部去掉,而不用面面俱到。但是通用型的選項要慎重。

比如在網卡的部分,除了我的千兆網卡 Broadcom Tigon3 support和4965無線網卡Intel Wireless WiFi 4965AGN,其餘的硬件支持統統去掉。

再比如聲卡部分,我的是hd聲卡,我只是在PCI devices中,選intel hd 聲卡,再選Build IDT/Sigmatel HD-audio codec support,除此之外的硬件支持全部去掉。
聲卡還有一個細節,在ubuntu7.10里面, 需要在/etc/modprobe.d/alsa-base後面添加options snd-hda-intel probe_mask=1 model=3stack,這樣我的筆記本喇叭才可以發聲,不然只有外接耳機或者音箱。這次編譯以後,這個動作就不必了,但是兩個耳機插口只有一個可以用 了。

再比如我的電腦中沒有agp,就可以直接把agp相關的選項全部取消。

要注意的:
ATA/ATAPI/MFM/RLL support
Include IDE/ATA-2 DISK support 如果你的/boot是放在IDE硬盤上,那麼這裡一定要選*,選M都不行。否則啟動時會出現「waiting for root file system」的提示而停滯不前。
SCSI emulation support 要用刻錄機,必須選。

SCSI device support 現在都是SATA硬盤,一定要選*
SCSI disk support 如果你的/boot放在SATA硬盤上,一定要選*。
SCSI CDROM support 雖然康寶刻錄機是ide接口的,但是必須把它當成scsi接口的,這是老問題了。用刻錄機,必須選。

Graphics support
Support for frame buffer devices 選中,進入選擇
VESA VGA graphics support 選上,不然字符界面啟動會有問題,
後面的顯卡選擇:由於我的顯卡是nvidia 8400gs,要自己安裝nvidia公司的驅動,所以一個都沒有選。這樣導致ubuntu開機動畫會出問題,我索性在grub中的splash字符全部刪除,把開機動畫關閉。字符界面很正常。

Console display driver support 有人開機後字符控制台錯誤,就是這部分選項沒有選,出問題了。
Framebuffer Console support 需要打開。
Bootup logo 開機圖標,會在自檢的畫面上加上個性圖標。需要在grub上添加「vga=」的選項,可以參考http://dotimes.com/articles /t23-slackware-framebuffer.html

7、File systems
Filesystem in Userspace support 簡稱fuse。是必選的,如果你要用windows分區。

CD-ROM/DVD Filesystems
ISO 9660 CDROM file system support 一般選*
DOS/FAT/NT Filesystems
VFAT (Windows-95) fs support 有FAT32分區就選*吧
NTFS file system support 有NTFS分區就選*吧
NTFS write support 如果想對 NTFS分區進行寫操作,選*

必須將啟動盤的文件系統編譯進內核,默認是編譯成模塊,這樣無法啟動系統。ubuntu採用的文件系統是ext3,請把ext2,ext3相關的必要選項都編譯進入內核。

8、Virtualization這個大類是我多花幾百元買t8100的主要原因,因為t8100支持intel vt技術
使linux上的虛擬機的性能大幅度提高。這裡的選項我除了amd的,其他都編譯成模塊。

9、全部設置完成,最後一項是保存設置。
按照我的習慣,先在上一層目錄保存一個備份,文件名類似 ../config20080630
然後再保存到當起目錄,文件名 .config
退出設置程序。

六、開始編譯內核。
ubuntu的工具是make-kpkg,和其他的發行版相比,步驟相對簡單。
相關命令:
代碼:

$sudo make-kpkg clean   這條命令好像不要超級權限,很多資料上說要,不過這不是原則問題。
$ sudo make-kpkg -initrd --initrd --append-to-version=dell1400 kernel_image kernel-headers


上述命令中的dell1400可以用自己喜歡的字符代替,最後的字符一定是數字.
輸完上述命令回車之前,建議大家把瀏覽器還有別的運用程序都關掉,機器開始的工作比較艱苦。我的機器大概十幾分鍾。

七、安裝內核
編譯完成就是安裝工作。編譯好的內核在上一層目錄。包括linux-headers-...-_i386.deb和linux-image-...-i386.deb兩個文件,如果你不搞開發的話,只要安裝內核就可以,頭文件以後要用的時候再說。
安裝相關命令:
代碼:

$ cd ..
$ sudo dpkg -i   linux-image-(按tab鍵)


文件名很長,如果不用tab自動補足是不可能的,tab鍵萬歲。
安裝完成後和老內核比較一下大小
代碼:

$ ls -l /boot/


八、重新啟動驗證新內核。
代碼:

$ sudo reboot


九、顯卡驅動
如果你的顯卡和我一樣是nvidia顯卡,啟動之後往往無法正常進入x-window。即使能看到gdm登錄界面,效果也是很差的。
那麼就要安裝nvidia驅動。
用ctrl+alt+f1 進入字符命令行,輸入用戶名,密碼登錄。
命令:
代碼:

下載驅動
$ wget http://us.download.nvidia.com/XFree86/Linux-x86/173.14.12/NVIDIA-Linux-x86-173.14.12-pkg1.run

$sudo -s
輸入密碼取得超級權限。
#ps ax
看看和gdm相關的進程,把這些進程全部關閉;用sudo /etc/init.d/gdm stop有可能有一個進程沒有關閉:
#kill 進程號
然後安裝nvidia顯卡驅動,當然驅動要先下好,到nvidia驅動所在的目錄裡,運行:
# sh ./NVIDIA-Linux-x86-173.14.12-pkg1.run

重新啟動以後就ok。要用nvidia的驅動,每次升級內核都要這麼做。

十、無線網卡
相關的內核選項是
Networking --->
Wireless --->
Generic IEEE 802.11 Networking Stack (mac80211)
還有4965的驅動。

4965無線網卡驅動雖然已經編入內核,但沒有firmware無法使用。需要把原來內核的firmware拷貝到新內核對應的目錄,名字和內核一致,我 的內核是linux-image-2.6.25.10dell1400,那建的目錄名就是2.6.25.10dell1400。

代碼:

具體命令:
$ cd /lib/firmware/
$ sudo mkdir 2.6.25.10dell1400
把你的老內核中的4965的firmware拷貝過來。
$ sudo cp 2.6.24-16-generic/* 2.6.25.10dell1400/

上面的命令和下面的命令是等價的:
$ cd /lib/firmware/
$ sudo cp -R 2.6.24-16-generic/  2.6.25.10dell1400/


重新啟動系統,無線網卡就正常了。

附編譯使用的機器配置:dell vostro 1400,t8100,nvidia 8400cs顯卡,內置SigmaTel STAC9228芯片的聲卡,4965無線網卡,BCM5906M千兆網卡,3G內存,160G硬盤,combo刻錄。
編譯系統版本:ubuntu 8.04桌面版.


延伸閱讀:

1.配置並編譯內核[更新到linux-2.6.26]

創作者介紹

胖虎的祕密基地

idobest 發表在 痞客邦 PIXNET 留言(0) 人氣()