如何在Ubuntu环境下编译内核
每个发行版本都有一些特殊的工具方便大家从源文件编译内核,本文介绍如何在ubuntu环境下编译内核。本文介绍了如何从www.kernel.org上下载最新的内核并定制它适合自己的机器,从而你可以不再以来发行版本中所带的内核版本。本文也介绍了如何给内核添加补丁以增加那些没有启用的功能。
本文通过以下系统测试:Ubuntu 6.10 Server (”Edgy Eft”) 和 Ubuntu 6.06 Desktop (”Dapper Drake”)。
首先我想说的是这并不是唯一编译内核的方法。有许多种方法可以达到相同的目的,这只是我所使用的一种方法。并且我保证我的方法不会出问题。
1.准备工作
在以下的工作中我会以root的身份来完成工作,如果你还没有root用户,你需要执行以下命令:
sudo passwd root
之后以root登录:
su
如果你想以普通用户身份工作,一定要记得在每个命令前面加上sudo。比如当我执行:
apt-get update
你一定要输入:
sudo apt-get update
1.1 /bin/sh on Ubuntu 6.10 (”Edgy Eft”)
在ubuntu 6.10上,/bin/sh默认链接到/bin/dash。/bin/dash在编译软件的时候有时会出错,至少我有这个问题。所以我将他重新链接到/bin/bash。
如果正在使用ubuntu 6.10,你需要执行以下命令:
rm -f /bin/sh
ln -s /bin/bash /bin/sh
2 为编译内核安装必要的软件包
首先我们更新系统:
apt-get update
接着我们安装所需要的软件包:
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2
3.下载内核源代码
接着我们将所需要的内核下载到/usr/src目录。到http://www.kernek.org下载你所需要的内核源代码,比如linux-2.6.18.1.tar.bz2,(你可以通过这个目录下载2.6系列的内核:http://www.kernel.org/pub/linux/kernel/v2.6/)。接着你就可以将它下载到/usr/src目录下:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.1.tar.bz2
接着我们解压缩内核并且将目录做一个链接:
tar xjf linux-2.6.18.1.tar.bz2
ln -s linux-2.6.18.1 linux
cd /usr/src/linux
4.给内核文件打补丁(可选)
有些时候你需要给内核添加一些驱动以让他适应你的设备,或者你需要让他可以使用最新的虚拟技术,或者是一些edgy没有的功能。这一段将告诉你如何给内核打补丁(如果已经有这些补丁了……)。
好,我们假定你已经下载好补丁到/usr/src。(假定为patch.bz2)。
bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1
第一行命令只是一个测试,它并没有对你的内核做什么。如果他没有提示错误,那么你可以运行第二个命令,他会应用补丁。如果第一个命令提示错误了,千万别再继续了。
你也可以给内核源代码打上内核的补丁。比如,如果你需要的某些功能在2.6.19-rc4中,但完全的内核包并没有发布。但是patch-2.6.19-rc4.bz2却已经发布了。你可以将这些补丁打到2.6.18中去,不过并不打到2.6.18.1或者2.6.18.2中。这在http://kernel.org/patchtypes/pre.html有详细的解释:
单个的内核补丁包相当于内核的alpha版本;他们仍然在测试中。他们通过补丁工具适用于只有3-部分版本编码的版本(比如2.6.18字符为三段,而不是4段)
所以,如果你想编译2.6.19-rc4,你必须下载2.6.18源代码替代之前的2.6.18.1!
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
5.配置内核
一个比较好的方法是使用已有的配置文件给新的内核。于是我们复制以前的配置文件到/usr/src/linux目录:
cp /boot/config-`uname -r` ./.config
接着运行:
make menuconfig
这将出现一个配置菜单。选择Load an Alternate Configuration File,并且选择我们复制过来的.config文件:

接着浏览菜单中的选项,并且修改你的选择。当你结束选择并且按下Exit,回答下列问题,选择Yes。(Do you wish to save your new kernel configuration?)
6.编译内核
编译内核,只需要执行下面两个命令:
make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
你可以添加任何参数在--append-to-version=之后,但是开头必须要有“-”字符并且不能有空格。
接着就要忍耐了,编译内核可能会用掉你几个小时的时间,这取决于你的处理器速度。
7.安装新内核
成功编译内核之后,你可以在/usr/src目录下发现两个内核包。
cd /usr/src
ls -l
在我测试的机器上,他们的文件名是:linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb (包含实际的内核文件。) 和 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
(你可以把他们复制到其他机器上去,并用同样的方法安装。你不用再编译一次了。)
好了,你可以检查/boot/grub/menu.lst文件,可以发现新的两行:
vi /boot/grub/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 now
如果一切正常,就会以新内核启动了。你可以运行以下命令确认是否是在使用新内核:
uname -r
应该会显示:
2.6.18-custom
如果系统没有正常启动,重启系统。当你看到:
按下esc以看到如下页面:
选择老的内核,接着你可以试着重新编译新内核。或者移出无法工作的内核。



