作为一名Linux系统工程师怎么可以不会编译Linux内核呢,就像当兵不会打仗。男人不会保护自己心爱的人一样,太丢人了..
Linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在/usr/src/linux下找到,大部分应用软件也都是遵循GPL而设计的,你都可以获取相应的源程序代码。全世界任何一个软件工程师都可以将自己认为优秀的代码加入到其中,由此引发的一个明显的好处就是Linux修补漏洞的快速以及对最新软件技术的利用。
客套的话,空洞的话咱都不说了,说了也费劲,你还不一定看。下面以Linux 2.6.15.5内核源代码为例:
第一步:下载Linux 2.6.15.5内核源代码linux-2.6.15.5.tar.bz,放入/usr/src 目录。
第二步:一般情况下要用下面命令来配置内核,可以使用下面命令的任意一个,看自己喜欢了:
#make config(基于文本的最为传统的配置界面,不推荐使用)
#make menuconfig(基于文本菜单的配置选项)
#make xconfig(要求QT被安装)
#make gconfig(要求GTK安装)
其中最值得推荐的当然是menuconfig选项,不需要额外的库,还直观形象
选择了自己要用的选项后保存退出。我这里为了以后能将自己写的内核驱动模块加入内核,选择了"Enable loadable module support",嵌入式产品一般不需要动态卸载模块,所以"可以卸载模块"不用选,当然你说哥非要选,就是要跟你做对,你能把我咋滴。说真的,我还真不能把你咋滴..
第三步:#cd ****进入内核源码目录,,编译内核,并将映像复制到相应的目录:
#make bzImage (生成使用giz压缩的内核,生成的文件位于/usr/src/linux/arch/i386/boot 目录)
#make modules modules_install (编译内核模块并安装到/lib/modules/2.6.15.5 目录)
#cd /usr/src/linux
#mv arch/i386/boot/bzImage /boot/bzImage2.6.15.5
#mv System.map /boot/System.map-2.6.15.5 (System.map-2.6.15.5是编译生成的Linux 2.6.15.5内核的符号表)
#cd /boot
#mv System.map oldSystem.map
#ln –s System.map-2.6.15.5 System.map(创建相应的System.map符号链接)
第四步:修改启动选项。以支持从Linux 2.6.15.5启动选择菜单
修改/boot/grub/grub.conf文件,进行如下配置:
title Red Hat Linux (2.6.15.5)
root (hd0,0)
kernel /boot/vmlinuz ro root=/dev/hda2 hdc=ide-scsi //---你的linux所在的分区
进过此配置后,Linux启动时就会出现选择菜单。
说明:最后在上面的Linux 2.6.15.5启动中,没有设置initrd,这是因为我们直接把SCSI,EXT3等编译进了内核。如果将他们编译成模块,initrd则是必须的,否则启动会提示"VFS:unable to mounting root fs".为使用initrd,则需要下载较新的mkinitrd并安装,由于程序包mkinitrd依赖程序包device-mapper,而程序包device-mapper又依赖于lvm2,因此还要同时下载程序包device-mapper和程序包lvm2。安装完毕后#mkinitrd /boot/initrd_2.6.15.5.img 2.6.15.5就可以了,如果执行mkinitrd命令时,提示“No module dm-mem-cache found for kernel 2.6.29.4, aborting.”时,表明该版本的mkinitrd有bug。升级mkinitrd或 参考这篇文章解决这个问题。解决方法:
1是当使用mkinitrd时,使用”–without-dmraid”这个参数。
2是在使用mkinitrd之前,先创建一个noraid文件。创建方法如下:
# echo "DMRAID=no" > /etc/sysconfig/mkinitrd/noraid
# chmod 755 /etc/sysconfig/mkinitrd/noraid
然后再运行mkinitrd命令。
initrd(Bootloader initialized RAM disk)是指由Bootloader初始化的内存盘。在linux内核启动前,Bootloader会将存储介质中的initrd文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存的initrd文件系统。
为了启动时加载initrd,只需修改grub.conf引导配置文件,在最后添加"initrd /boot/initrd-2.6.15.5.img "这样就没问题了。