编译Linux内核,首先需要安装linux,这里选择Ubuntu9.04发行版。


有两种安装方式,1 双系统 2 xp vm虚拟机里装.


由于双系统ubuntu直接运行在硬件上,各机硬件的差异会导致,自己编译好内核安装后启动中出现各种各样的错误,所以推荐Vmware虚拟机安装,由于硬件都是vm虚拟出来的,比较统一,比较容易避过硬件差异带来的错误。


Vmware安装Ubuntu9.04,新建一个虚拟机,一路默认下去,Vmware为虚拟机默认配置硬件如下:




为了新编译内核顺利启动,尤其内核出现


安装好Ubuntu9.04开始准备编译内核,内核编译步骤如下:


三、开始编译前的准备工作。

首先,清理以前编译时留下的临时文件。如果是刚刚解开的包,不需要执行这步。


如果是第二次或者是第n次编译,那么一定要执行。注意这条命令会删除上一次配置好的.config文件,即上次make menuconfig的配置项,需要先备份.config文件,执行完命令在还原.config文件。



相关命令如下:

代码:

$ sudo make mrproper


四、开始配置内核选项。

相关命令:

代码:

$sudo make menuconfig

配置用到的键只有几个,esc退出菜单;空格改变选项状态;光标键上下左右移动,回车选定。

选项意义:M是编译成可以随时加入的模块,*是编译进入内核,空就是不要。

配置选项非常多,具体配置可以参考金步国先生翻译的资料:Linux 2.6.19.x 内核编译配置选项。

参考网址:http://lamp.linux.gov.cn/Linux/kernel_options.html

为了一次成功,请大家遵循一个原则,如果你自己使用的内核已经选用了某个选项,如果你没用充分的理由,不要随便改动。这样虽然内核不那么精简,但是不容易出现问题。

我们可以精简的部分是硬件模块部分,对于自己没有的硬件要毫不犹豫的清除。

如果你很执着,或者你有洁癖,你也可以一项项对过去,按照金步国先生的资料描述去选择基本上没有问题。



六、开始编译内核。

ubuntu的工具是make-kpkg,和其他的发行版相比,步骤相对简单。

相关命令:

代码:

$sudo make-kpkg clean   这条命令好像不要超级权限,很多资料上说要,不过这不是原则问题。

$ sudo make-kpkg -initrd --initrd --append-to-version=dell1400 kernel_image kernel-headers

上述命令中的dell1400可以用自己喜欢的字符代替,最后的字符一定是数字.

输完上述命令回车之前,建议大家把浏览器还有别的运用程序都关掉,机器开始的工作比较艰苦。我的机器大概十几分钟。

七、安装内核

编译完成就是安装工作。编译好的内核在上一层目录。包括linux-headers-...-_i386.deb和linux-image-...-i386.deb两个文件,如果你不搞开发的话,只要安装内核就可以,头文件以后要用的时候再说。

安装相关命令:

代码:

$ cd ..
$ sudo dpkg -i   linux-image-(按tab键)

文件名很长,如果不用tab自动补足是不可能的,tab键万岁。

安装完成后和老内核比较一下大小

代码:

$ ls -l /boot/

八、重新启动验证新内核。

代码:

$ sudo reboot



上面的都是标准步骤,但是ubuntu9.04在编译linux2.6.18内核时,在第4步编译的过程中,会遇到2个问题,解决办法如下:

1、scripts/mod/sumversion.c:384: error: ‘PATH_MAX’ undeclared (first use in this function)

解决办法:在源码linux2.6.18/scripts/mod/sumversion.c 中加入

#include <limits.h>

就解决了这个问题。

2 kernel/built-in.o: In function `timespec_add_ns':

/usr/src/linux/include/linux/time.h:173: undefined reference to `__umoddi3'

/usr/src/linux/include/linux/time.h:173: undefined reference to `__udivdi3'

这个问题你由于Ubuntu9.04自带的gcc版本为4.3,而linux内核编译以gcc-3.4编译为好。采用降低Gcc版本解决了这个问题。具体降低方法:which gcc可以看到gcc在哪个目录下(/usr/bin/gcc),然后用aptitude search gcc可以从源中查看有哪些安装包,找到了gcc-3.4,号称这个是最稳定的。于是我就安装这个。apt-get install gcc-3.4就安装好了。然后删除老的gcc连接rm gcc,它是指向gcc4.3的。 然后用ln -s gcc-3.4 /usr/bin/gcc建立新连接即可。这样就将gcc版本降低了.




到这里编译内核成功了,安装内核成功了,但是新安装的内核还不一定能够启动,主要是硬盘的原因。

新内核不能成功启动,原因排查:

在ubuntu选择菜单中,选择新安装的内核,按 e ,将进入编辑界面,在kernel 那一行上,继续按e, 将 ro queit splash 中的queit splash去掉,回车返回前一个界面,按b启动,这样如果内核不能成功启动就可以看到错误提示信息,将提示信息搜索,就能得到解决方法。