Chinaunix首页 | 论坛 | 博客
  • 博客访问: 201258
  • 博文数量: 489
  • 博客积分: 410
  • 博客等级: 下士
  • 技术积分: 2590
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-01 22:50
文章分类

全部博文(489)

文章存档

2011年(489)

我的朋友

分类:

2011-09-03 23:12:17

原文地址:编译内核遇到的问题 作者:zyd_cu


    最近做项目时需要修改一下内核的配置,重新编译内核,于是到网上搜了个教程跟着做了,步骤大同小异。

进入/usr/src中发现fedora 11自带的源代码,进入后make,结果一直有错误,估计是发行版的内核做了优化之类的,具体原因不详。于是到kernel.orgdown2.6.25source,经过多次尝试加资料收集,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网卡驱动的模块,然后copyfedora 11的内核中加载,但这样做提示module format error,应该是两个内核模块不兼容。于是想到下一个比fedora 11更新的内核来编译,但网络挂了,U盘不能识别,下载的source不能传到虚拟机中,于是这条路又断了,弄了一下午硬是没有成功。

幸亏刚装虚拟机的时候将整个虚拟机的文件备份了(当时不知道vmwaresnapshotclone功能),于是从备份的虚拟机重新启动,结果里面的网络配置跟以前备份的时候竟然不一样了,eth0不见了,ifconfig时显示eth1,但/etc/sysconfig/network-scripts里面却没有eth1对应的配置文件,只有eth0,通过ifconfigsetup修改时,都是修改eth0ip...非常之无语,虽然可以上网,但感觉非常之不爽。(移动虚拟机文件可能导致移动后的文件不能用,应为虚拟机将文件夹虚拟为磁盘,而拷贝后的文件夹却没有这个特性,所以导致很多配置都跟以前不一样了,我之前重装windows,重装vmware后,没有动过fedora 11的虚拟机文件,使用一点没变)

于是在虚拟机里重装了fedora 11,配置好网络,马上做了个snapshot,并且做了个clone,我可不想下次内核出问题时又重装,浪费时间,浪费精力。

 

总结一下,编译内核应该注意的问题。

如果只是实验在make menuconfig时最好选择arch/x86下默认的配置文件,将该文件拷贝为源码目录下的.config即可。

make包含make bzImagemake 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 却发现系统有9make进程在工作。所以这个参数未必起作用。
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


从新内核启动即可。

阅读(171) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~