接下来就是内核编译前的配置了,这一步要细心。配置的恰当与否与你日后linux的使用有很大的关系。但是绝大多数是只要用默认的配置就可以啦,除非你想要特殊的应用。配置内核一些常用的重要的选项的详解请参考:http://lamp.linux.gov.cn/Linux/kernel_options.html。
配置内核可以根据需要与爱好使用下面命令中的一个:
#make config(基于文本的最为传统的配置界面,不推荐使用)
#make menuconfig(基于文本选单的配置界面,字符终端下推荐使用)
#make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用)
#make oldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)
这三个命令中,我使用的是#make menuconfig命令,我想这个虽然是文本字符终端的操作,但是作为每个LINUX学习者,要习惯和享受在命令行下的操作。在选择相应的配置时,有必要对三种符号的含义做些解释:
Y--将该功能编译进内核
N--不将该功能编译进内核
M--将该功能编译成可以在需要时动态插入到内核中的模块
如果使用的是make menuconfig,则需要使用空格键进行选取。你会发现在每一个选项前都有个括号, 但有的是中括号有的是尖括号,还有一种圆括号。用空格键选择时可以发现,中括号里要么是空,要么是"*",而尖括号里可以是空,"*"和"M"这表示前者对应的项要么不要,要么编译到内核里;后者则多一样选择,可以编译成模块。而圆括号的内容是要你在所提供的几个选项中选择一项。
正如上面说的,实际上在配置时,大部分选项可以使用其缺省值,只有小部分需要根据用户不同的需要选择。选择的原则是将与内核其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不要选;与内核关心紧密而且经常使用的部分功能代码直接编译到内核中。
五、内核与内核模块编译
1.进入新内核源代码目录
#cd /usr/src/kernels/linux-2.6.26.2
2.读取配置过程中生成配置文件,创建对应于配置的依赖关系树,从而决定哪些需要编译与哪些不需要编译
#make dep
3.完全删除上步留下来的文件,避免发生错误。(如果是新下载内核没有编译过,可以跳过)
#make clean
4.编译内核
#make bzImage
在上面的命令成功编译以后会在/usr/src/kernels/linux-2.6.26.2/arch/x86/boot/
目录下产生新内核的映像bzImage
5.编译可加载内核模块
#make modules
6.把生成的模块拷贝到需要的目录下
#make modules_install
7.生成模块间的依赖关系,这样在启动新内核以后,使用modprobe命令加载模块时候能够正确定模块。
#depmod -a
注意第5-7步,只有在进行内核配置时候选上了Enable loadable module support (CONFIG_MODULES)才是必要的。
经过以上的步骤终于生成了新的内核和模块,为了能够使用上新版内核,还要做以下工作。
#cp /usr/src/kernels/linux-2.6.26.2/System.map /boot
#cp /usr/src/kernels/linux-2.6.26.2/arch/x86/boot/bzImage /boot
#cd /boot
#mv bzImage vmlinuz-2.6.26
注意上面的前面两条命令我没有像网上其他很多是帖子一样覆盖了原来内核的映像和内核符号隐射表。我把新的直接放在/boot下面,这样能在新内核启动不了的情况下,可以启动新内核。(我对这点深有感触,其实我一开始很顺利地编译成功了并且生成了bzImage,可是我把他拷贝错了,拷贝了同目录下的vmlinux,结果启动不起来啦,linux系统就进不了,后来我进了grub的命令行找到了旧内核映像启动,我们可以发现内核是更新啦,文件系统方面好像是没有什么更新。不知道有没有说错?)
