编译内核

来源:互联网 发布:oa智能网络地板 编辑:程序博客网 时间:2024/04/29 12:59
 每一個發行版本都帶有一些特殊的工具,用來從源代碼中創建一個自定義的内核,這篇文章就是關于如何在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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 注销公众号对公账号填写错误怎么办 国外邮的东西在北京扣了手续怎么办 微信购物商城买的东西不发货怎么办 魅族手机电话图标没有了怎么办 新商盟网页新商盟网页打不开怎么办 京东商城购物车装满了怎么办 商家想入住美团没有营业执照怎么办 旅行团定好的人数临时加人该怎么办 淘宝上发货后12天未收到款怎么办 京东购买的东西烂了怎么办 苹果4s手机激活密码忘了怎么办 小米4c返回键失灵了怎么办 小米4c下面三个键失灵怎么办 谷歌浏览器打不开指定的网址怎么办 电脑上我的电脑图标没了怎么办 手机上的短信图标没了怎么办 qq密保手机被别人换了怎么办 苹果六手机很卡网络不给力怎么办 堡垒之夜卡在载入界面怎么办 登录新福建一直说网络不给力怎么办 开发游戏平台给了钱不给东西怎么办 代号英雄与服务器断开连接了怎么办 千牛聊天页面买家信息不显示怎么办 秒拍存草稿箱的视频没了怎么办? 登录山东掌厅出现服务器错误怎么办 微信号被多人投诉被限制登录怎么办 联想平板电脑开机密码忘记了怎么办 申请的qq没登录忘了账号怎么办 炫舞时代由于网络原因登不上怎么办 qq申请太多进不了热聊怎么办 手机号申请的微信号被盗了怎么办 买菜别人少找了钱不还怎么办 在掌上英雄联盟买皮肤买错区怎么办 win8我的电脑图标没了怎么办 英雄联盟老是卡在安全扫描怎么办 英雄联盟活动送皮肤没送怎么办 电脑换完系统有些页面打不开怎么办 王卡助手交手机费页面打不开怎么办 在浏览器上打不开路由器页面怎么办 英雄联盟读条的时候自动关机怎么办 手机的位置信息开不了怎么办呢