红联Linux门户
Linux帮助

在ubuntu下编译内核

发布时间:2006-11-19 10:55:16来源:红联作者:橙丢
  每一个发行版本都带有一些特殊的工具,用来从源代码中创建一个自定义的内核,这篇文章就是关于如何在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/ ... ux-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/ ... atch-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 条评论

  1. wangsu502 于 2006-12-16 15:57:00发表:

    :0L :0L :0L :0L