我在Ubuntu 6.10 Server ("Edgy Eft")和Ubuntu 6.06 Desktop ("Dapper Drake")上都對文中所述步驟進行了測試。但還需要事先申明的是,這并不是唯一能夠構建系統的辦法,事實上,有很多辦法能夠達到相同的目的,正所謂條條大路通羅馬,隻不過我走的是這一條道路而已。所以,我不保證這種辦法能完全适用于你。
順便再提醒一句,我喜歡直接以root的身份來執行下面所有的步驟,因此,如果你還沒有創建一個能夠登陸的root帳号,請立即創建一個。
之後,以root身份登陸:
如果有朋友就是喜歡用普通用戶身份進行操作的話,也沒有關系,你隻需要注意,把這篇文章所有命令的全面都自行加上sudo即可。舉個例子,如果我運行的是
那麽你就應該運行
如此重複即可。
好,接下來進入操作的具體步驟。
1.1 修改ubuntu 6.10上的/bin/sh
在ubuntu6.10上,/bin/sh默認是鏈接到/bin/dash的,當你從源代碼編譯軟件的時候,dash可能會導緻一些錯誤,至少我遇到過類似問題,因此,我把/bin/sh的連接改爲了/bin/bash。(估計中國絕大部分使用者都是用的bash吧)
如果你使用的就是6.10,那麽應該這樣做:
ln -s /bin/bash /bin/sh
1.2 安裝内核編譯所需的包
首先,讓我們來更新一下自己機器上的安裝包數據庫
之後,用這條命令來安裝所有需要的包:
1.3 下載内核源代碼
接下來,我們将需要的内核下載到/usr/src中。2.6版本的所有内核都可以從http://www.kernel.org/pub/linux/kernel/v2.6/得到。我是這樣下載的:
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.1.tar.bz2
你也可以根據自己的需要,用不同的下載方式下載不用的内核版本。
完畢之後,将源代碼解包,并創建一個指向源代碼軟件目錄的連接linux:
ln -s linux-2.6.18.1 linux
cd /usr/src/linux
1.4 給内核源代碼打補丁
有時候,你需要一些硬件驅動,但是新的内核默認卻沒有提供,或者,你可能要用到虛拟技術或其他一些前沿科技,而新的内核中卻沒有加入它們。在這些情況下,你不得不對你的内核打補丁(當然,前提是存在相應的補丁)。
現在,我假設你已經下載到了相對應的補丁,在這裏我們以patch.bz2代替。将其放到/usr/src目錄下,然後用下來的命令來使其生效:
bzip2 -dc /usr/src/patch.bz2 | patch -p1
注意!此時,你應該一直處于/usr/src/linux目錄下。
第一個命令僅僅是試驗性質的,它并不會對你的源代碼産生什麽變動。如果沒有産生什麽錯誤信息,你才能用第二個命令來對源代碼産生真正的修補動作,如果第一條指令就出錯了,請别繼續執行下去,看看錯誤出在哪裏。
同樣,你也可以向你的内核提供預補丁,例如,一旦你發現有一個自己需要的特性在2.6.19 rc4中提供,但這個版本的内核并沒有發行所有的完整源代碼,隻有patch-2.6.19-rc4.bz2是可選的。于是,你就可以提供這個patch到2.6.18的内核中,但不是2.6.8.1,或者2.6.8.2。
http://kernel.org/patchtypes/pre.html對此作出了解釋:
預補丁其實就等同于一個linux的alpha版本,它存在于倉庫中的測試目錄中。它們隻能由針對上一個版本源代碼的patch工具提交,這個上一個完全發行的版本必須是三部分版本号所組成的,例如,2.6.12-rc4 prepatch能夠提供給2.6.11内核源代碼,但,2.6.11.10沒有任何用處。
所以,如果你希望編譯2.6.19rc4内核,你應該下載2.6.18的内核源代碼(http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2)。下面就是如何進行的步驟:
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc4.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p1
2.1 配置内核
使用現有内核的配置文件作爲新内核配置文件的基礎,無疑是一個好主意。因此,我們先複制已經存在的配置文件到/usr/src/linux目錄中
然後運行
這将顯示出内核配置菜單。選擇 "Load an Alternate Configuration File",再選擇你剛才拷貝過來的.config文件作爲配置文件。然後确定。當結束後,你選擇退出時,會提示問你 "Do you wish to save your new kernel configuration?"選擇yes即可。
2.2 創建内核
如果要創建内核,請執行下面兩個命令:
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
在 " --append-to-version= "之後,你可以寫任何有助于标志内核的字符串,但前提是必須以-符号作爲開頭,中間不能有空白字符。
好了,現在,請耐心點,内核的編譯可能會花上你幾個小時的時間,這取決于你的内核配置情況以及機器的性能。
2.3 安裝新的内核
在内核構建成功之後,你能在/usr/src目錄下看見兩個.deb文件。在我的測試系統中,它們被稱爲linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb (包含真實内核) and linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb (包含那些編譯附加内核模塊所需要的文件).
我用這種辦法安裝:
dpkg -i linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
你甚至可以将這兩個deb包轉移到其他的ubuntu系統中,并用相同的辦法安裝它們。這意味着,你不再需要再一次編譯它們了。
好了,現在,你可以檢查一下你的menu.lst文件,多了兩個與新内核有關的部分:
root (hd0,0)
kernel /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro quiet splash
initrd /boot/initrd.img-2.6.18.1-custom
savedefault
boot
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 single
initrd /boot/initrd.img-2.6.18.1-custom
boot
現在,重新啓動計算機,shutdown -r。如果一切順利的話,重新啓動之後,你使用的就是新的内核了。你可以通過 " uname -r"命令來看看目前的内核版本。它應該表示爲: " 2.6.18.1-custom"
3 一些問題
如果restart的時候出了問題,當你看見屏幕上出現 "Press ESC to enter the menu...1"這行字的時候,按下ESC,此時會進入grub的啓動菜單,好,選擇你的舊版内核,啓動系統。現在,你不得不重新編譯一次内核,使其能夠正常使用。編譯之前别忘了,從menu.lst中去除之前的兩個不能正常工作的内核區域。
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2
2)进入内核应存放的目录:
cd /usr/src
3)从官方网站获取最新的内核
wget
(finger@kernel.org查到最新稳定版的版本号)
4)移动内核到/usr/src,建立快捷方式
tar jxvf linux-2.6.16.20.tar.bz2
ln -s linux-2.6.16.20 linux
5)将当前系统使用的内核配置文件复制到新的内核目录下面,
cp /boot/config-2.6.8.2 /usr/src/linux/.config
6)配置内核
a]移动键盘,选中 Load an Alternate Configuration File 项,把.config 调进来,让其默认按此配置加载内核选项,减少编译难度;
b]针对自己机器进行修改;我是新手,只是稍微改了几个地方。大家可以去基础区,找相关帖子参考.
c]保存退出
7)开始编译
在这里参看了一下debian官方文挡
[
cd kernel-source-2.4.18 # 如果这是你的内核源码
cp /boot/config-2.4.18 .config # 将当前配置设定为默认配置
make menuconfig # 按自己的喜好来定制
make-kpkg clean # 必须执行这步(per: man make-kpkg)
fakeroot make-kpkg --append_to_version -486 --initrd /--revision=rev.01 kernel_image / modules_image # modules_image 可以是 pcmcia-cs* 等。
$ cd ..
# dpkg -i kernel-image*.deb pcmcia-cs*.deb # 安装
]
我的做法
make-kpkg clean
fakeroot make-kpkg --revision=custom.1.0 kernel_image
编译的过程有点漫长,(可能是我的机器比较破,花了50多分钟)结束后,应该在/usr/src下形成个deb包:kernel-image-*.deb
8)下面,安装新的内核:
dpkg -i kernel-image-*.deb
9)制作内存镜像
cd /boot
mkinitrd -o /boot/initrd.img-2.6.16.20 2.6.16.20
10)修改grub
vi /boot/grub/menu.lst,
menu.lst里的信息:
title Debian GNU/Linux, kernel 2.6.12-1-386
root (hd0,0)
kernel /vmlinuz-2.6.12-1-386 root=/dev/hda2 ro
initrd /initrd.img-2.6.12-1-386
savedefault
boot
对照,并填加新内核引导信息
title Debian GNU/Linux, kernel 2.6.16.20
root (hd0,0)
kernel /vmlinuz-2.6.16.20 root=/dev/hda2 ro
initrd /initrd.img-2.6.16.20
savedefault
boot
至此,内核升级完成,启动一次成功!
http://www.kernel.org/pub/linux/kern....16.20.tar.bz2