日期:2014-05-16  浏览次数:20705 次

华工 linux 作业 Ubuntu9.04 编译 linux2.6.18 总结(待续)

编译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启动,这样如果内核不能成功启动就可以看到错误提示信息,将提示信息搜索,就能得到解决方法。
?

?

?

?

?