@HUST张友东 work@taobao zyd_com@126.com
分类: LINUX
2009-07-31 09:14:27
最近做项目时需要修改一下内核的配置,重新编译内核,于是到网上搜了个教程跟着做了,步骤大同小异。
进入/usr/src中发现fedora 11自带的源代码,进入后make,结果一直有错误,估计是发行版的内核做了优化之类的,具体原因不详。于是到kernel.org去down了2.6.25的source,经过多次尝试加资料收集,make menuconfig----》make(相当于make bzImage; make modules)成功,在arch/x86/boot下生成bzImage压缩内核(需要copy到/boot下),然后make modules_install,将模块安装到/lib/modules下,再make install添加grub启动项。
编译完后reboot,新的内核进不去,从以前的内核启动,网络挂掉了,找不到网络设备eth0,使用lspci发现使用pcnet的网卡,于是想重新编译fedora 11的内核加载pcnet32的网卡驱动,但make时一直出错,于是想到在新的内核中编译pcnet32网卡驱动的模块,然后copy到fedora 11的内核中加载,但这样做提示module format error,应该是两个内核模块不兼容。于是想到下一个比fedora 11更新的内核来编译,但网络挂了,U盘不能识别,下载的source不能传到虚拟机中,于是这条路又断了,弄了一下午硬是没有成功。
幸亏刚装虚拟机的时候将整个虚拟机的文件备份了(当时不知道vmware的snapshot和clone功能),于是从备份的虚拟机重新启动,结果里面的网络配置跟以前备份的时候竟然不一样了,eth0不见了,ifconfig时显示eth1,但/etc/sysconfig/network-scripts里面却没有eth1对应的配置文件,只有eth0,通过ifconfig,setup修改时,都是修改eth0的ip...非常之无语,虽然可以上网,但感觉非常之不爽。(移动虚拟机文件可能导致移动后的文件不能用,应为虚拟机将文件夹虚拟为磁盘,而拷贝后的文件夹却没有这个特性,所以导致很多配置都跟以前不一样了,我之前重装windows,重装vmware后,没有动过fedora 11的虚拟机文件,使用一点没变)
于是在虚拟机里重装了fedora 11,配置好网络,马上做了个snapshot,并且做了个clone,我可不想下次内核出问题时又重装,浪费时间,浪费精力。
总结一下,编译内核应该注意的问题。
如果只是实验在make menuconfig时最好选择arch/x86下默认的配置文件,将该文件拷贝为源码目录下的.config即可。
make包含make bzImage,make modules即生成可启动的压缩内核和各个模块。
make modules_install 安装模块到/lib/modules下
内核之旅上的方法:
cd /usr/src/linux-2.6.24 //以下所有的工作都在/usr/src/linux-2.6.24下完成
sudo make menuconfig //用menuconfig的话还需要Ncurses,或者用
sudo make xconfig
sudo make menuconfig //一般是用menuconfig
配置完以后保存(系统中保存的一份内核配置文件是在/usr/src/linux-2.6.24下名为.config,你也可以自己在别的地方另存一份)
也可以cp原来在/boot目录下的config-2.6.xx 到当前目录下,在make menuconfig是使用这个配置文件。
sudo make dep //也许系统会提示现在不必要进行make dep,那就下一步 2.6.24的我编译就没有使用过。
sudo make clean //清除旧数据 ,新解压的内核源码就不需要这一步了
sudo make –j2 可以分两个线程来进行编译工作,不过我用make –j4 却发现系统有9个make进程在工作。所以这个参数未必起作用。
sudo make bzImage //编译内核,将保存到/usr/src/linux-2.6.24/arch/i386/boot/下
sudo make modules //编译模块,直接make=make bzImage; make modules
sudo make modules_install //安装模块到/lib/modules
sudo mkinitramfs -o /boot/initrd-2.6.24.img 2.6.24
此时可能提示找不到这样的一个文件夹“/lib/firmware/2.6.24”,你需要手工创建一个这样的文件夹。
sudo mkdir /lib/firmware/2.6.24
sudo make install //安装内核,由bzImage生成initrd.img system.map并拷贝到/boot下,并在/boot/grub/menu.lst中增加一个启动项,但未改timeout
安装完后/boot下将增加以下几个文件(用ls -l *24*查看)
helight@helight-desktop:/boot$ ls -l *24*
-rw-r–r– 1 root root 85203 2008-03-14 22:24 config-2.6.24
-rw-r–r– 1 root root 85203 2008-03-14 20:23 config-2.6.24.old
-rw-r–r– 1 root root 37968871 2008-03-15 08:31 initrd-2.6.24.img
-rw-r–r– 1 root root 4014080 2008-03-14 22:24 initrd.img-2.6.24
-rw-r–r– 1 root root 932315 2008-03-14 22:24 System.map-2.6.24
-rw-r–r– 1 root root 932315 2008-03-14 20:23 System.map-2.6.24.old
-rw-r–r– 1 root root 1858864 2008-03-14 22:24 vmlinuz-2.6.24
-rw-r–r– 1 root root 1858864 2008-03-14 20:23 vmlinuz-2.6.24.old
helight@helight-desktop:/boot$
给/boot/grub/menu.lst中添加一个新的启动项,如我的menu.lst增加了如下一段文字
title Ubuntu, kernel 2.6.24
root (hd0,0)
kernel /boot/vmlinuz-2.6.24root=UUID=d7e2cf74-ebf5-4c78-ac2c-9f85a9809eae ro
initrd /boot/initrd-2.6.24.img
从新内核启动即可。