现在的位置: 首页 > 综合 > 正文

编译内核

2013年08月25日 ⁄ 综合 ⁄ 共 5275字 ⁄ 字号 评论关闭
 每一個發行版本都帶有一些特殊的工具,用來從源代碼中創建一個自定義的内核,這篇文章就是關于如何在ubuntu系統中編譯内核的。内容包括,如何利用最新的,未被修改過的,從www.kernel.org網站上下載下來的源代碼來構建自訂制系統,這樣,你就能獨立于發行版所提供的内核。文章同樣涉及了如果你需要一些現有内核不包含的特性,如何對内核源代碼進行修補等問題。

  我在Ubuntu 6.10 Server ("Edgy Eft")和Ubuntu 6.06 Desktop ("Dapper Drake")上都對文中所述步驟進行了測試。但還需要事先申明的是,這并不是唯一能夠構建系統的辦法,事實上,有很多辦法能夠達到相同的目的,正所謂條條大路通羅馬,隻不過我走的是這一條道路而已。所以,我不保證這種辦法能完全适用于你。

  順便再提醒一句,我喜歡直接以root的身份來執行下面所有的步驟,因此,如果你還沒有創建一個能夠登陸的root帳号,請立即創建一個。

sudo passwd root

之後,以root身份登陸:

su

如果有朋友就是喜歡用普通用戶身份進行操作的話,也沒有關系,你隻需要注意,把這篇文章所有命令的全面都自行加上sudo即可。舉個例子,如果我運行的是

apt-get update

那麽你就應該運行

sudo apt-get update

如此重複即可。

好,接下來進入操作的具體步驟。

1.1 修改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

1.2 安裝内核編譯所需的包

首先,讓我們來更新一下自己機器上的安裝包數據庫

apt-get update

之後,用這條命令來安裝所有需要的包:

apt-get install kernel-package libncurses5-dev fakeroot wget bzip2

1.3 下載内核源代碼

接下來,我們将需要的内核下載到/usr/src中。2.6版本的所有内核都可以從http://www.kernel.org/pub/linux/kernel/v2.6/得到。我是這樣下載的:

cd /usr/src

wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.1.tar.bz2

你也可以根據自己的需要,用不同的下載方式下載不用的内核版本。

完畢之後,将源代碼解包,并創建一個指向源代碼軟件目錄的連接linux:

tar xjf linux-2.6.18.1.tar.bz2

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 --dry-run

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)。下面就是如何進行的步驟:

cd /usr/src

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目錄中

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

然後運行

make menuconfig

這将顯示出内核配置菜單。選擇 "Load an Alternate Configuration File",再選擇你剛才拷貝過來的.config文件作爲配置文件。然後确定。當結束後,你選擇退出時,會提示問你 "Do you wish to save your new kernel configuration?"選擇yes即可。

2.2 創建内核

如果要創建内核,請執行下面兩個命令:

make-kpkg clean

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-image-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文件,多了兩個與新内核有關的部分:

title Ubuntu, kernel 2.6.18.1-custom

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中去除之前的兩個不能正常工作的内核區域。

::::::::::::::::::::::::::::::::::::::::::::
1)编译内核必须的一些工具:
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

抱歉!评论已关闭.