如何在ubuntu下编译内核
每一个发行版本都带有一些特殊的工具,用来从源代码中创建一个自定义的内核,这篇文章就是关于如何在ubuntu系统中编译内核的。内容包括,如何利用最新的,未被修改过的,从网站上下载下来的源代码来构建自订制系统,这样,你就能独立于发行版所提供的内核。文章同样涉及了如果你需要一些现有内核不包含的特性,如何对内核源代码进行修补等问题。
Table of Contents
1. 基本安装步骤
1. 安装内核编译所需的包
2. 下载内核源代码
3. 给内核源代码打补丁
2. 配置安装
1. 配置内核
2. 创建内核
3. 安装新的内核
3. 一些问题
每一个发行版本都带有一些特殊的工具,用来从源代码中创建一个自定义的内核,这篇文章就是关于如何在ubuntu系统中编译内核的。内容包括,如何利用最新的,未被修改过的,从网站上下载下来的源代码来构建自订制系统,这样,你就能独立于发行版所提供的内核。文章同样涉及了如果你需要一些现有内核不包含的特性,如何对内核源代码进行修补等问题。
我在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
如此重复即可。
好,接下来进入操作的具体步骤。
基本安装步骤
修改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
安装内核编译所需的包
首先,让我们来更新一下自己机器上的安装包数据库
apt-get update
之后,用这条命令来安装所有需要的包:
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2
下载内核源代码
接下来,我们将需要的内核下载到/usr/src中。2.6版本的所有内核都可以从得到。我是这样下载的:
cd /usr/src
wget
你也可以根据自己的需要,用不同的下载方式下载不用的内核版本。
完毕之后,将源代码解包,并创建一个指向源代码软件目录的连接linux:
tar xjf linux-2.6.18.1.tar.bz2
ln -s linux-2.6.18.1 linux
cd /usr/src/linux
给内核源代码打补丁
有时候,你需要一些硬件驱动,但是新的内核默认却没有提供,或者,你可能要用到虚拟技术或其他一些前沿科技,而新的内核中却没有加入它们。在这些情况下,你不得不对你的内核打补丁(当然,前提是存在相应的补丁)。
现在,我假设你已经下载到了相对应的补丁,在这里我们以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。
对此作出了解释:
预补丁其实就等同于一个linux的alpha版本,它存在于仓库中的测试目录中。它们只能由针对上一个版本源代码的patch工具提交,这个上一个完全发行的版本必须是三部分版本号所组成的,例如,2.6.12-rc4 prepatch能够提供给2.6.11内核源代码,但,2.6.11.10没有任何用处。
所以,如果你希望编译2.6.19rc4内核,你应该下载2.6.18的内核源代码()。下面就是如何进行的步骤:
cd /usr/src
wget
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
配置安装
配置内核
使用现有内核的配置文件作为新内核配置文件的基础,无疑是一个好主意。因此,我们先复制已经存在的配置文件到/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即可。
创建内核
如果要创建内核,请执行下面两个命令:
make-kpkg clean
fakeroot make-kpkg –initrd –append-to-version=-custom kernel_image kernel_headers
在 ” –append-to-version= “之后,你可以写任何有助于标志内核的字符串,但前提是必须以-符号作为开头,中间不能有空白字符。
好了,现在,请耐心点,内核的编译可能会花上你几个小时的时间,这取决于你的内核配置情况以及机器的性能。
安装新的内核
在内核构建成功之后,你能在/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”
一些问题
如果restart的时候出了问题,当你看见屏幕上出现 “Press ESC to enter the menu…1″这行字的时候,按下ESC,此时会进入grub的启动菜单,好,选择你的旧版内核,启动系统。现在,你不得不重新编译一次内核,使其能够正常使用。编译之前别忘了,从menu.lst中去除之前的两个不能正常工作的内核区域。