如何在 Mandriva 环境下编译内核

每个发行版本都有一些特殊的工具方便大家从源文件编译内核,本文介绍如何在 mandriva 环境下编译内核。本文介绍了如何从www.kernel.org上下载最新的内核并定制它适合自己的机器,从而你可以不再以来发行版本中所带的内核版本。本文也介绍了如何给内核添加补丁以增加那些没有启用的功能。

本文在 Mandriva Free 2007 上通过测试。

首先我想说的是这并不是唯一编译内核的方法。有许多种方法可以达到相同的目的,这只是我所使用的一种方法。并且我保证我的方法不会出问题。

1.初步笔记

本指南的目标是将内核编译成可以直接安装在系统上的 rpm 包,这样你就可以将 rpm 包与别人分享,安装在任一 Mandriva 系统上。

2.下载内核源代码

接着我们将所需要的内核下载到/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

3.给内核文件打补丁(可选)

有些时候你需要给内核添加一些驱动以让他适应你的设备,或者你需要让他可以使用最新的虚拟技术,或者是一些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

4.配置内核

一个比较好的方法是使用已有的配置文件给新的内核。于是我们复制以前的配置文件到 /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?)你必须在 General Setup —> () Local version - append to kernel release 指定一个内核版本。我添加了 -default 所以我的内核 rpm 包最后会被命名为 kernel-2.6.18.3default-1.i386.rpm 。你可以将此处空着或者用另外可以帮助你识别的词汇标记。(比如 -custom)

注意:当你安装过 kernel-2.6.18.3default-1.i386.rpm 之后,再次编译内核时,命名就变得尤为重要!你必须设定一个不同的版本号,比如: -default1, -default2,显然你无法同时安装两个版本号相同的内核包。

当你结束选择并且按下Exit,回答下列问题,选择Yes。(Do you wish to save your new kernel configuration?)

5.编译内核

你只需要运行下面的命令即可:

make rpm

接着就要忍耐了,编译内核可能会用掉你几个小时的时间,这取决于你的处理器速度。

6.安装新内核

编译完成后,将会生成一个 src.rpm 和 rpm 包。你可以在 /usr/src/rpm/SRPMS/ 发现 src.rpm 包,你可以运行以下命令查看它的文件名:

ls -l /usr/src/rpm/SRPMS/

在我系统上他的文件名是 kernel-2.6.18.3default-1.src.rpm

你可以在以下目录找到 rpm 包:/usr/src/rpm/RPMS/i586/, /usr/src/rpm/RPMS/i686/,/usr/src/rpm/RPMS/x86_64/ 。这取决于你的机器型号。在我的电脑上,rpm 包是在 /usr/src/rpm/RPMS/i386/ 目录下的。执行:

ls -l /usr/src/rpm/RPMS/i386/

文件名为 kernel-2.6.18.3default-1.i386.rpm 。

现在,我们可以安装最新的内核包了:

cd /usr/src/rpm/RPMS/i386/
rpm -ivh kernel-2.6.18.3default-1.i386.rpm

你可以把他们复制到其他机器上去,并用同样的方法安装。你不用再编译一次了。

接着我们要手动给我的内核创建一个新的 ramdisk ,不然系统会无法启动:

mkinitrd /boot/initrd-2.6.18.3-default.img 2.6.18.3-default

7.配置 LILO

现在我们必须配置以下LILO 起动器,这样才可以在重启之后启动我们的新内核。运行:

ls -l /boot

这样可以找到你的新内核(通常以 vmlinuz 开头,列如 vmlinuz-2.6.18.3-default )和新的 ramdisk (通常以 initrd 开头,列如:initrd-2.6.18.3-default.img )

接着编辑 /etc/lilo.conf 文件。找一下已经存在的一些列表,然后复制一个,接着替换掉内核和ramdisk的位置。当然你得在 label 那行给你新的启动项目取个名字。(比如:linux-2.6.18.3-default)并且可以将新内核设置为默认启动项目。

vi /etc/lilo.conf

以下是我修改前的lilo配置文件:

# File generated by DrakX/drakboot
# WARNING: do not forget to run lilo after modifying this file

default=”linux”
boot=/dev/sda
map=/boot/map
keytable=/boot/us.klt
menu-scheme=wb:bw:wb:bw
compact
prompt
nowarn
timeout=100
message=/boot/message
image=/boot/vmlinuz
label=”linux”
root=/dev/sda6
initrd=/boot/initrd.img
append=” resume=/dev/sda5 splash=silent”
vga=788
image=/boot/vmlinuz
label=”linux-nonfb”
root=/dev/sda6
initrd=/boot/initrd.img
append=” resume=/dev/sda5″
image=/boot/vmlinuz
label=”failsafe”
root=/dev/sda6
initrd=/boot/initrd.img
append=” failsafe resume=/dev/sda5″

接着是我添加了新项目之后的 lilo 配置文件:

# File generated by DrakX/drakboot
# WARNING: do not forget to run lilo after modifying this file

default=”linux-2.6.18.3-default”
boot=/dev/sda
map=/boot/map
keytable=/boot/us.klt
menu-scheme=wb:bw:wb:bw
compact
prompt
nowarn
timeout=100
message=/boot/message
image=/boot/vmlinuz-2.6.18.3-default
label=”linux-2.6.18.3-default”
root=/dev/sda6
initrd=/boot/initrd-2.6.18.3-default.img
append=” resume=/dev/sda5 splash=silent”
vga=788
image=/boot/vmlinuz
label=”linux”
root=/dev/sda6
initrd=/boot/initrd.img
append=” resume=/dev/sda5 splash=silent”
vga=788
image=/boot/vmlinuz
label=”linux-nonfb”
root=/dev/sda6
initrd=/boot/initrd.img
append=” resume=/dev/sda5″
image=/boot/vmlinuz
label=”failsafe”
root=/dev/sda6
initrd=/boot/initrd.img
append=” failsafe resume=/dev/sda5″

接着运行:

lilo

重启系统:

shutdown -r now

如果一切正常,就会以新内核启动了。你可以运行以下命令查看运行内核的版本:

uname -r

会显示类似以下的内容:

2.6.18.3-default

如果系统没能正常启动,只需要重启系统,选择老的内核进入即可:

之后你就可以重新在老内核中编译新内核,别忘记重新配置 lilo 的配置文件,并且运行:

lilo

Leave a Reply