• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

编内核时出现:module-init-tools在线等

发布: 2007-7-04 12:06 | 作者: admin | 来源:  网友评论 | 查看: 17次 | 进入软件测试论坛讨论

领测软件测试网
本要在试验编内核时出现:
waring:you may need to install module-init-tools
的提示!

俺下载了一个不知道怎么安装,里面没有安装程序!急

 好好先生 回复于:2004-02-08 14:12:30
从kernel.org下载。这个module-init-tools要升级的,不然insmod,lsmod这样的命令都不能用。

 jeffreyli 回复于:2004-02-08 14:22:06
#tar jxvf module-init-tools-0.9.14-pre1.tar.bz2
#cd module-init-tools-0.9.14-pre1
#./configure
#make
#make moveold
#make install
#./generate-modprobe.conf /etc/modprobe.conf



我安上面的方法操作的还是不行。

 jeffreyli 回复于:2004-02-08 14:23:22
请问好好先生,最新版本是不是3.0呀。

 jeffreyli 回复于:2004-02-08 14:39:54
大家都知道的要先升级“module-init-tools“软件包,否则的话,等你安装内核模块文件的时候,系统会提示你:Warning: you may need to install module-init-tools See http://www.codemonkey.org.uk/post-h...4.21-23.src.rpm
进入下载目录下并安装:
#rpm -e --nodeps modutils (强行卸载原有的modutilsRPM包)
#rpm -ivh modutils-2.4.21-23.src.rpm (把源代码包安装到了/usr/src/redhat目录下)
#cd /usr/src/redhat/SPECS (进入规范文件目录下)
#rpmbuild --bb modutils.spec (生成二进制的RPM包)
#cd ../RPMS/i386 (转入刚生成的二进制的RPM包所在位置)
#rpm -ivh modutils*.rpm (刚生成两个[modutils-2.4.21-23.i386.rpm与modutils-debuginfo-2.4.21.23.i386.rpm]二进制的RPM包,一起安装吧!)
因为是在RedHat9.0的平台,RedHat的用户可能还会遇到一些麻烦,我会慢慢说的,除了要以上的升级之外,还有个文件(/etc/rc.d/rc.sysinit)可能有缺陷,因为/proc/ksyms文件在新内核(kernel2.6.0)中已经没有了,打开文件命令如下:
#vi /etc/rc.d/rc.sysinit
找到:
if ! LC_ALL=C grep -iq nomodules /proc/cmdline 2>/dev/null && [ -f /proc/ksyms ]; then
USEMODULES=y
fi
替换成:
if ! LC_ALL=C grep -iq nomodules /proc/cmdline 2>/dev/null; then
USEMODULES=y
fi
也就是把“&& [ -f /proc/ksyms ]”去掉,保存文件(操作之前最好做备份以免删错,这个文件是系统初始脚本,重要的很),这样子内核才能加载模块,当然能启动iptable防火墙了,否则防火墙在新内核中启动时红色的“failed“非常醒目。(请在新内核中核查/proc/sys/kernel/modprobe中的内容是不是:/sbin/modprobe,也可手工注入指令:#echo "/sbin/modprobe" > /proc/sys/kernel/modprobe)。下面开始构造新内核。

一、准备源代码
1、下载到tarball包之后,将内核tarball包复制到/usr/src目录下,假定包在当前目录中,运行以下命令:
#cp linux-2.6.0.tar.gz /usr/src
2、转到/usr/src目录并解开tarball包,
#cd /usr/src
#tar xvzf linux-2.6.0.tar.gz
3、如果你还下载了补丁包,则打上补丁,你也可以运行scripts/patch-kernel脚本文件自动打上补丁(准备好补丁包)或 #zcat patch-2.6.0.gz|patch -p1(我偷懒不打补丁的)。

二、定制内核
定制内核是门很大的学问,需要大量的硬件知识,特别是2.6.0的内核,如果你从2.4.N配置文件装载进去的,的确,很多人遇到过麻烦。我是重新配置文件(X窗口服务器进行),配制内核之前请清理源代码树,如果还没有进入/usr/src/linux-2.6.0目录,请进入此目录,命令如下:
#make mrproper (刚解开的tarball包不需此步骤)
#make gconfig (需要Gtk开发库的支持)
或make config
或make xconfig(需要Qt开发库的支持)
注意:如果你是ext3文件系统,则在定制内核配置文件时把对Ext3、Ext2文件的支持直接编译进内核,否则,等你启用新内核时机器就会当掉,出错信息如下:kernel panic : no init found ,try passing init = option to kernel......或者是:kernel panic:VFS:Unable to mount root fs on unknown-block(0,0),我一开始不知道,编译了好几次,系统总给我冷板凳坐,最后把对Ext3、Ext2文件系统的支持直接编译进内核,才解决此问题,还有把对“Module unloading“选项也选上,否则的话,你在新内核环境下无法卸载内核模块(rmmod命令不能用)。

三、编译内核及模块
定制好的内核配置文件(/usr/src/linux-2.6.0/.config)之后,激动的时刻到来了,编译内核及模块,
#make (此命令已完成make bzImage及make modules的工作),
bzImage内核文件在arch/i386/boot目录中,你的CPU不同内核文件存放位置也不同,我是Intel的CPU。
注意:我在RedHat7.2平台时曾出现无法编译的出错信息,出错信息如下:
/tmp/cc2Hu7sH.s:3: Error: Unknown pseudo-op: `.incbin'
make[1]: *** [usr/initramfs_data.o] Error 1
make: *** [usr] Error 2,
重新装了个9.0的才解决此问题。
说明:make命令在我的1.6GHz,128M的机器上跑了足足27分钟。

四、安装模块及内核文件
#make modules_install install
以上这个命令可以分解成make modules_install与make install,make modules_install安装内核模块到/lib/modules/2.6.0下。make install完成mkinitrd命令及内核(bzImage)和System.map的拷贝,请查看/boot目录,文件名是有区别的,如是GRUB引导器,make install命令已帮你自动修改了引导选项,对于LILO则要手工修改,重写引导记录。
说明:make modules_install install这个命令在我的1.6GHz,128M的机器上只跑了三十几秒,很快的哦。

五、后记
最后的工作就是重启系统(#shutdown -r now),检验一下你的劳动成果吧。差点忘了还有一点,可能对你很重要,进入新内核之后我发现rpm命令不能用了,原来这是RPM的一个Bug,特别是对于RH9的用户,请打开/etc/profile文件,命令如下:
#vi /etc/profile (在文件的末尾加上几句如下)
if [`uname -r`="2.6.0" ];then
export LD_ASSUME_KERNEL=2.2.5
fi
也就是给系统加上一个全局的环境变量,也可直接键入#export LD_ASSUME_KERNEL=2.2.5。
使用新内核可能出现的问题及对策:
1、新内核根本起不来,解决方法:重新配置内核(学问挺大),也许还根引导记录有关(很少了);
2、新内核模块无法加载,会导致很多问题,比如了防火墙没法工作了,mount不上光盘和vfat及ntfs文件系统,其解决方法:升级module-init-tools软件包(我是modutils-2.4.21-23.src.rpm包),RedHat的用户可能还要修改/etc/rc.d/rc.sysinit文件;
3、RedHat用户rpm命令不能使用,解决办法:请把变量在全局配置文件中声明。

 好好先生 回复于:2004-02-08 15:15:06
是3.0,我今天编译用的就是3.0。也谢谢你带来的好文章。

 jeffreyli 回复于:2004-02-08 15:29:17
不用客气,大家互相学习!

呵可
以后还要向你多多请教!

 好好先生 回复于:2004-02-08 15:30:59
这个文章是你自己写的吗?

 jeffreyli 回复于:2004-02-08 15:32:33
升级2.6内核到底需要进行哪些事情? 

升级到2.6是不是make config;make bzImage;make modules;make ...到最后处理一下grub或lilo的配置这么简单? 

本文讲述了一点升级到kernel-2.6最起码的事情,注意是最起码的: 

首先你要知道2.6需要注意的几件事情: 
多了一个sysfs虚拟文件系统 
老版本的modutils不能用了,module-init-tools要安装。 
modules.conf和modprobe.conf是怎么回事儿? 
USB模块名都变了 
声卡配置怎么办?kernel-2.6采用alsa, alsa的配置工具是什么? 
升级kernel会导致一些软件不能使用吗? 
什么版本的gcc都行吗? 
... 

好了,继续,我的系统环境: 
MagicLinux 1.2pre4b, gcc-3.3.1 

要升级的2.6版本是2.6.0test7 

编译: 
第一步很简单,按照惯例,打好补丁,配置,编译。 
我仍然是打成了rpm包,打了cp936少数汉字错误的一个补丁。 
SMBFS和系统文件系统缺省的codec都为cp936。 
因为是作产品,所以打开了尽可能多的驱动,包括USB键盘和鼠标。 

打了for i586, i686, athlon的3个包,成功。 
编译initscripts, 编译modutils和module-init-tools, 编译mkinitrd 
安装。 

你会发现,系统多了一套modules命令,就是*.old,这就是不能用的命令, 
新的命令基于这些old,由module-init-tools提供。 

安装所有软件包,检查grub配置没有问题,重启。 

启动过程中USB驱动载入错误。 
发现自己在/etc/modules.conf中定义的alias char-major-188 off无效 

检查,发现一个generate-modprobe.conf脚本:到/etc/运行。 
generate-modprobe.conf modprobe.conf移植modules.conf配置。 
重启:char-major-188模块找不到错误消失,说明alias char-major-188生效。 

继续usb配置问题:发现/proc/bus/usb/根本不存在,这就是前面提到到sysfs问题: 
代码: 

1, mkdir /sys 
2, 在/etc/rc.sysinit中,只要有mount -f /proc就在下面加上mount -f /sys 
3, 在/etc/rc.sysinit中,找到: 
action $"Mounting proc filesystem: " mount -n -t proc /proc /proc 
加上: 
action $"Mounting sysfs filesystem: " mount -n -t sysfs /sys /sys 
4,在/etc/fstab中加上: 
none /sys sysfs defaults 0 0 
5,把/etc/rc.d/init.d/halt中的: 
awk '$2 ~ /^/$|^/proc|^/dev/{next} 
修改成: 
awk '$2 ~ /^/$|^/proc|^/sys|^/dev/{next} 


重启,USB载入仍然错误。 
但是/下已经多了一个文件系统/sys 
/sys/bus/usb仍然不存在。 

怎么办?手动probe模块测试: 

modprobe hid 
modprobe usbmouse(注意不是mousedev了和keybdev了) 
lsmod看看,内核里确实加载了,但是usb鼠标纹丝不动。 

忘了最重要的一个: 
modprobe usb-uhci 

系统提示不存在。 
原来usb-uhci也没有了,usb-ohci当然也没有了。 
而是uhci-hcd. 

modprobe uhci-hcd,呵呵,鼠标可以用了。 

修改/etc/rc.sysinit/ 
找到跟usb有关的信息: 
代码: 

usb=0 
if ! LC_ALL=C grep -iq "nousb" /proc/cmdline 2>/dev/null && ! LC_ALL=C grep -q "usb" /proc/devices 2>/dev/null ; then 
aliases=`/sbin/modprobe -c | awk '/^alias usb-controller/ { print $3 }'` 
if [ -n "$aliases" -a "$aliases" != "off" ]; then 
modprobe usbcore 
for alias in $aliases ; do 
[ "$alias" != "off" ] && action $"Initializing USB controller ($alias): " modprobe $alias 
done 
[ $? -eq 0 -a -n "$aliases" ] && usb=1 
fi 
fi 

if ! LC_ALL=C grep -iq "nousb" /proc/cmdline 2>/dev/null && LC_ALL=C grep -q "usb" /proc/devices 2>/dev/null ; then 
usb=1 
fi 

if [ $usb = 1 -a ! -f /proc/bus/usb/devices ]; then 
action $"Mounting USB filesystem: " mount -t usbdevfs usbdevfs /proc/bus/usb 
fi 

needusbstorage= 
if [ $usb = "1" ]; then 
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null` 
LC_ALL=C grep 'hid' /proc/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null 
action $"Initializing USB keyboard: " modprobe keybdev 2> /dev/null 
action $"Initializing USB mouse: " modprobe mousedev 2> /dev/null 
fi 


大体解释一下: 
定义usb变量为0 
定义aliases变量为: 
/sbin/modprobe -c | awk '/^alias usb-controller/ { print $3 }的执行结果。 
aliases存在且不为空时: 
载入usbcore 
然后载入aliases定义的内容, 
置usb为1 
挂接usbdevfs 
needusbstorage大概就是U盘了,这个变量跟下面几句没关系。 
载入hid,键盘,鼠标驱动。 

这里需要修改的是: 

1,/proc/sys/usb定义是错的,应该是/sys 
2,modprobe -c 能不能找到alias usb-controller,从而定义变量aliases为usb-uhci, 运行一下是不能的。 
3,模块名不对,usbmouse和usbkbd才对。 

根据逻辑,修改成: 
代码: 

modprobe usbcore 
action $"Initializing USB controller (uhci-hcd): " modprobe uhci-hcd 
usb=1 

if [ $usb = 1 -a ! -f /sys/bus/usb/devices ]; then 
action $"Mounting USB filesystem: " mount -t usbdevfs usbdevfs /sys/bus/usb 
fi 

needusbstorage= 
if [ $usb = "1" ]; then 
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /sys/bus/usb/devices 2>/dev/null` 
action $"Initializing USB HID interface: " modprobe hid 2> /dev/null 
action $"Initializing USB keyboard: " modprobe usbkbd 2> /dev/null 
action $"Initializing USB mouse: " modprobe usbmouse 2> /dev/null 
fi 


载入usbcore, uhci-hcd(也就是usb-uhci的新版本) 
然后挂接usbdevfs,然后定义needusbstorage为以后的使用,然后就是载入鼠标键盘驱动。 

检查一下rc.sysinit和/etc/rc.d/init.d/halt脚本,看看还有没有/proc/bus/usb的定义,通通搞成/sys/bus/usb. 

重启,OK,模块正常载入,鼠标可以用了。 

启动kde,没声。 

对了,以前一直用oss,现在内核提供的是alsa. 
找出一个配置工具alsaconf,这个是alsa-drivers的utils 

配置,不行,找不到声卡,问题在于kernel-2.6的模块不再是.o而是.ko 

修改alsaconf中所有的.o为.ko. 
配置,OK,找到声卡为i810内嵌的,也就是ac97音效,正确的写入了 
/etc/modules.conf, 
lsmod一看,内核模块没有马上载入,说明alsaconf还是有点问题, 
modprobe一下: 
modprobe snd-intel8x0,OK了,内核驱动载入。 
用alsa play播放: 
aplay sample.wav 
有声音了。 


重启,lsmod看看,snd-intel8x0没有载入,/etc/modules.conf里不是有了吗? 
以我的判断,肯定是正确的,试试generate-modprobe.conf,刚才那个 
char-major-188的错误就是这么解决的。 

做完之后,再重启,再lsmod看看,还是没有载入声卡驱动。 
modprobe snd-intel8x0,出错,看来是modprobe.conf导致的, 
把里面的sound相关配置通通删掉,重启后modprobe又可以出声了。 

没有办法,好好读读alsaconf代码,发现了以前单独安装alsa的时候一个经典的东西: 
alsasound启动进程。 

这个东西也在alsadrivers的utils目录,找出来。 

./alsasound start自动载入所有模块 
./alsasound stop 自动卸载所有模块 
OK,目的达到。 
cp alsasound /etc/rc.d/init.d 
chkconfig --add alsasound 

再看看alsaconf原来可以进行测试声音的播放,只是以前从来没有把wav文件装上过, 
拷贝一个wav文件,再次运行: 
alsaconf 
配置成功,然后自动载入模块成功,然后就是aplay这个wav. 

OK,至此为止,基本的kernel-2.6升级工作完成了。

 好好先生 回复于:2004-02-08 15:37:32
真的很感谢哦!我正在费劲的看/etc/rc.d/rc.sysint这个文件,试图修改它。这下好了,参照你这个贴子,省心了。呵呵!

 wangfeixue 回复于:2004-02-08 15:38:04
请问rpm包的kernel有这个问题马?

 零二年的夏天 回复于:2004-02-08 15:39:41
为升级内核提供了更多参考。
辛苦!
谢谢!
:D

 好好先生 回复于:2004-02-08 15:39:43
我只用过一次rpm的kernel,还出了问题。现在都是自己编译。

 好好先生 回复于:2004-02-08 15:41:31
这个贴子可以解决近期这儿谈论的2.6的内核的所有问题,真是一个好贴。

 wangfeixue 回复于:2004-02-08 15:41:55
好好先生你说rpm包升级kernel是用Uvh好还是用ivh好讷?

 好好先生 回复于:2004-02-08 15:44:03
我不支持用rpm的内核。:lol:因为你不清楚里面都有什么是你需要的,什么不需要。

 好好先生 回复于:2004-02-08 15:47:23
2.6.*的内核都可以参照上面的贴子解决问题。我今天是在rhel as3.0中编译的2.6.20的内核,用的是module-init-tools-3.0-pre9出现的也是usb的问题。

 wangfeixue 回复于:2004-02-08 15:51:07
是的,编译好以后启动是哪些USB设备就报错,我在rc.sysinit中把他们关了

 jeffreyli 回复于:2004-02-08 17:10:29
我的内核升级完后还出现:
modprobe:QM_MODLES:Function not implemented
modprobe:Can't locate module usb-uhci
失败!不知何因!

但我在编内核时都已经加进去了。

 好好先生 回复于:2004-02-08 19:38:26
[quote:ae7ac8ed23="jeffreyli"]我的内核升级完后还出现:
modprobe:QM_MODLES:Function not implemented
modprobe:Can't locate module usb-uhci
失败!不知何因!

但我在编内核时都已经加进去了。[/quote:ae7ac8ed23]
呵呵!这就是因为module-init-tools的原因了。

 jeffreyli 回复于:2004-02-09 08:18:25
我把该改的地方都改了,
还是不行。都快晕了。。。。。。
请问一下好好先生说说你的方法吧。

 好好先生 回复于:2004-02-09 11:28:21
本文是基于kernel 2.6.0-test5的测试报告,描述了升级过程、软硬件的评测、系统性能等。


一. 编译前准备

下载kernel,建议在www.kernel.org官方网站下载,小网站上的kernel的代码,有可能被别有居心的人改过

因为2.6内核模块装入器有所改变,所以我们需要编译modutils。否则在make modules时,会有许多“unresolved symbol”的错误。我用的是0.9.14的版本。步骤如下:

#tar jxvf module-init-tools-0.9.14-pre1.tar.bz2
#cd module-init-tools-0.9.14-pre1
#./configure
#make
#make moveold
#make install
#./generate-modprobe.conf /etc/modprobe.conf

其他的相关工具最低要求相对于2.4有所提升,一般发行版(如redhat、debian等)都能满足。具体参考Document/Changes,如下:

o Gnu C 2.95.3 
o Gnu make 3.78 
o binutils 2.12 
o util-linux 2.10o 
o module-init-tools 0.9.9 
o e2fsprogs 1.29 
o jfsutils 1.1.3 
o reiserfsprogs 3.6.3 
o xfsprogs 2.1.0 
o pcmcia-cs 3.1.21 
o quota-tools 3.09 
o PPP 2.4.0 
o isdn4k-utils 3.1pre1 
o nfs-utils 1.0.5 
o procps 2.0.9 
o oprofile 0.5.3 


二. 编译kernel

新的内核在2.4的基础上有所改进,速度更快。同时它增加了一些make目标选项,如下:
make gconfig、allyesconfig、allnoconfig、allmodconfig配置工具。Make现在是首选命令,如果没有目标,它会编译arch-zimage和modules。
“make –jN”是首选的并行make
“make xx.o”可以指定编译某个文件。Make path/指定编译某个目录及其下面的文件。这对驱动开发或内核人员来说,是一个好消息,在我们更改了kernel中的一个文件后,我们可以直接编译这个文件。
“make dep”已经不需要
“make help”帮助

我是步骤如下:

#make menuconfig
#make bzImage && make modules && make modules_install && make install

需要说明的是,make install会自动将相关文件安装到/boot目录下,如bzImage 、vmlinux、System.map,同时生成initrd文件,并在grub.conf中增加相应启动项,所以不需要手工修改grub(我没用lilo测试,如果你有兴趣,可以试试,然后把结果发给我)。Reboot,新的内核就可以启动了。
我在编译过程中,默认情况下,有几个无关紧要的模块不能编译通过,将他们去掉了。


三. 体验2.6内核

新内核目前在以下几方面有所改变:

改进包括改善对硬件构架的支持。在新版内核中增加对最新AMD 64位Opteron CPU以及PowerPC 64位CPU的支持;
更好地支持多处理器系统,将支持16个或以上的CPU、更好地支持嵌入式设备、对点击鼠标和键盘的反应速度更快和彻底改善了块设备软件插件等。
使用新的new 0(1) 调度程序;
使用真正的异步I/O以改善企业应用;
提高了文件系统的性能;
改进了线程功能,可以支持更多的线程;
改进了对宽带联网的支持等。

就我使用的来看,鼠标和键盘明显好用,鼠标滑动更流畅。打开文件,响应也加快。其他的无法感觉到。

新内核在结构和API上有所改变,详细请参考
http://www.codemonkey.org.uk/post-halloween-2.5.txt

各发行版的最近版本上带的软件基本上都能运行。需要注意的一些问题如下:

1.内核编译成功,重起,解压kernel后,屏幕一片黑
解决办法:确定你的.config文件有CONFIG_INPUT=y,CONFIG_VT=y,,CONFIG_VGA_CONSOLE=y 和 CONFIG_VT_CONSOLE=y。许多人没有将CONFIG_VT=y选中。

2.RPM工具将不能使用,会有如下错误:
rpmdb: unable to join the environment
error: db4 error(11) from dbenv->open: Resource temporarily unavailable
error: cannot open Packages index using db3 - Resource temporarily unavailable (11)
error: cannot open Packages database in /var/lib/rpm
warning: initscripts-7.28-1.i386.rpm: V3 DSA signature: NOKEY, key ID 9d6b4012
rpmdb: unable to join the environment
error: db4 error(11) from dbenv->open: Resource temporarily unavailable
error: cannot open Packages database in /var/lib/rpm
解决办法:
#export LD_ASSUME_KERNEL=2.2.5。我将其加到/etc/bashrc中,这样以后不需要export了。

3.模块不能载入,需要更新modutils,参考上面的“编译前准备”

4.2.6内核对键盘等设备提高了灵活的接口,如果你的键盘或鼠标等输入设备不能工作,试着选中下面的选项:
--- Input I/O drivers
< > Serial i/o support
< > i8042 PC Keyboard controller
[ ] Keyboards
[ ] Mice

(记得选中keyboard/mouse里的列表)

5.2.4及以前的内核,打补丁的方式为:
gzip -cd patchXX.gz | patch -p0
在2.6里,linux在diffs里增加了另外的路径元素,所以推荐的方式为用-p1

6.如果想使用Hotplug需要,作如下改动:将/etc/rc.sysinit中的所有/proc/ksyms改为/proc/kallsyms。

7.同时usb的模块名字有改变,这将影响到/etc/modules.conf、/etc/rc.sysinit。如果用到usb的设备,只要将其改动成相应的就行。因为我没有usb的设备,所以没有做其测试。

 好好先生 回复于:2004-02-09 11:29:55
第一部分,准备

  要使用新的内核首先当然要取得新内核的源码,内核的官方网站是http://www.kernel.org ;在上面可以得到最新的内核。2.6的更新是相当快的,你可以在命令行下使用finger @kernel.org命令来快速得到当前最新的内核列表。在这篇文章中我将以2.6.0为准。

  下载了内核源码之后,我们要使用tar jxvf linux-2.6.0.tar.bz2来提取源码,如果你下载的是以tgz结尾的压缩包就使用zxvf参数来解压。我强烈建议你不要使用 /usr/src/linux这个目录来存放源码,因为使用这个目录你需要手工在/usr/include目录下作一些符号链接,这实在不是一个好主意。所以我建议你为源码单独建一个目录,这里我们的目录是/src/linux-2.6.0。

  要编译与正常运行新的内核你需要升级一些软件包,这些信息在源码目录下的Documentation/Changes文件中,请根据你的实际情况选择升级。这其中我强调一下你应该升级Module-Init-Tools,不要被你当前系统中depmod -V输出的版本号迷惑(在RH9中它的输出是2.4.22,感觉好象要比Changes中所要求的要高,实际上它们使用不同的版本规则)。新的 Module-Init-Tools在下面的网址中取得:http: //www.kernel.org/pub/linux/kernel/people/rusty/modules/

  我使用的是0.9.14。如果你下载的是源码使用如下步骤进行编译


./configure --prefix=/
make moveold
#这一步会将你以前的insmod, modprobe, rmmod和 lsmod
#重命名为insmod.old, modprobe.old, rmmod.old lsmod.old
make
make install

 

  然后使用 ./generate-modprobe.conf /etc/modprobe.conf (将原来的/etc/modules.conf转换到/etc/modprobe.conf )

  如果你使用devfs系统你还需要复制modprobe.devfs 到/etc目录下。

  当你升级完相关软件包之后,准备工作就算完成了,下面我们将进入到编译阶段。

第二部分 编译

  2.6的build系统与2.4有很大的不同,实际上是更加简单与方便了。第一步我们要进入源码目录 
cd /src/linux-2.6.0
make mrproper
make menuconfig (基于文本选单的配置界面)

 

  在闪过几行字之后就出现了如图的界面

  在界面的上部是配置工作的使用说明,使用箭头键在各选项间移动,使用enter进入下一层菜单,每个选项上的高亮字母是键盘快捷方式,使用它可以快速的到达你想设置的菜单项上。在括号中按y将这个项目编译进内核中,按M编译为模块,按N为不选择。按?将打印这个选项的帮助信息,按esc将返回到上层菜单。 GUI工具的基本概念也与之类似我们就不详细讨论了。在后面我将主要使用menuconfig来设置各个选项,选项的次序以它为准,其它工具中各选项也基本与之对应。切记把声卡的模块编译进内核不然无法发声!!

编译和安装内核


#make
#make install

 

编译和安装模块


#make modules(编译选择的模块)
#make modules_install(将编译后的模块转移到系统标准位置)

 

  完成后reboot就会发现启动选项就会多出一个2.6内核的选项。

介绍一下新内核中的图形界面配置工具

  新内核中有两个GUI配置工具,过去的make xconfig现在是一个使用QT库作为界面方案的配置工具了,所以你要使用它必需先安装QT库。一般的发行版光盘中都包含了这个软件包。

  另一个是make gconfig这是一个使用GTK库作为界面方案的工具,同样你要使用它就要先安装GTK库。这两个工具与原来的GUI工具在界面上有很大的变化,更加符合一般图形界面程序的使用习惯。

  而传统的控制台配置工具menuconfig则没什么太大的变化基本上保持了原来的样子,不喜欢花里糊哨的GUI工具的兄弟还是用这个吧:)

  在2.6中还添加了几个以调试为目的的make选项,它们是allyesconfig、allnoconfig、allmodconfig分别表示将所有选项加载为y、将所有选项加载为n、将所有选项加载为m。它们是为内核开发人员与测试人员准备的,与我们的关系不大。

  make menuconfig (部分)选项说明

第一项 Code maturity level options (代码成熟度选项)

  按enter进入后选项如下

[*] Prompt for development and/or incomplete code/drivers
  默认情况下是选择的,这将会在设置界面中显示还在开发或者还没有完成的代码与驱动.你应该选择它,因为有许多设备可能必需选择这个选项才能进行配置,实际上它是安全的。

[*] Select only drivers expected to compile cleanly
  选择这个选项你将不会看到一些已知的存在问题的驱动程序选项,默认的情况下也是选择的。如果你有设备没有找到驱动选项,你可以将这一项去掉,或许就可以找到相关驱动了,不过它可能是有BUG的。

[*] Select only drivers that don't need compile-time external firmware
  如果你不需要在内核对一些外部设备的固件作map支持就选择它,这也是默认选项。

第二项 General setup

  其中的选项如下

[*] Support for paging of anonymous memory
  这个选项将使你的内核支持虚拟内存,也就是让你的计算机好象拥有比实际内存更多 多的内存空间用来执行很大的程序。默认是选择的。

[*] System V IPC
  为进程提供通信机制,这将使系统中各进程间有交换信息与保持同步的能力。有些程序只有在选Y的情况下才能运行,所以不用考虑,这里一定要选。

[ ] BSD Process Accounting
  这里选择Y将会让内核为用户层的进程建立一个帐目(进程通过一个特殊的系统调用来通知内核),当程序退出时内核会将进程的相关信息记录到帐目文件中,主要包括进程的创建时间、 创建者,内存占用等信息。如果你需要就Y吧:)

[*] Sysctl support
  这将提供一个接口让你可以动态的更改一些核心参数与变量,而不需要重新启动系统。打开这个选项将会增加内核的体积至少8KB。如果你的内核仅用制作安装与恢复系统系统盘那么可以不选,以减少对内存的占用。

[ ] Kernel .config support
  这将会把内核的配置信息与相关的文档说明编译进内核中,以后可以使用一些工具来提取它用来重新构建内核,一般不用选它。

[ ] Remove kernel features (for embedded systems) --->
  这个选项将会把一些特性从内核中移除,以减少内核体积。对于桌面用户来讲,这可不是一个好主意,所以不要选它。至于其中的内容我会在以后的补遗中介绍。

第三项 Loadable module support (可加载模块选项)

  其选项如下:

[*] Enable loadable module support
  这个选项可以让你的内核支持模块,模块是什么呢?模块是一小段代码,编译后可在系统内核运行时动态的加入内核,从而为内核增加一些特性或是对某种硬件进行支持。一般一些不常用到的驱动或特性可以编译为模块以减少内核的体积。在运行时可以使用modprobe命令来加载它到内核中去(在不需要时还可以移除它)。
  一些特性是否编译为模块的原则是,不常使用的,特别是在系统启动时不需要的驱动可以将其编译为模块,如果是一些在系统启动时就要用到的驱动比如说文件系统,系统总线的支持就不要编为模块了,否在无法启动系统。(当然还有一些变通的方法,我以后会提到)

[ ] Module unloading
  这个选项可以让你卸载不再使用的模块,如果不选的话你将不能卸载任何模块(有些模块一旦加载就不能卸载,不管是否选择了这个选项)。不选择这个选项会让你的内核体积减小一点

[ ] Module versioning support (EXPERIMENTAL)
  这个选项将让你可以使用其它版本内核中编译的模块,不过并不可靠,所以一般我们不选择它

[*] Automatic kernel module loading
  一般情况下,如果我们的内核在某些任务中要使用一些被编译为模块的驱动或特性时,我们要先使用modprobe命令来加载它,内核才能使用。不过,如果你选择了这个选项,在内核需要一些模块时它可以自动调用modprobe命令来加载需要的模块,这是个很棒的特性,当然要选Y喽:)

第四项 Processor type and features

Subarchitecture Type (PC-compatible)
  这是一个比较新的特性,主要的目的是使Linux可以支持多种PC标准,一般我们使用的PC机是遵循所谓IBM兼容结构(pc/at)。这个选项可以让你选择一些其它架构。我们一般选择PC-compatible就可以了。

Processor family (Pentium-4/Celeron(P4-based)/Xeon)
  这个不用我讲了吧,你是什么CPU就选什么吧:)

[ ] Generic x86 support
  这个选项提供了对X86系列CPU最大的兼容性,用来支持一些很少见的x86体系的CPU,它可能会降低一些系统性能。所以如果你的CPU能够在上面的列表中找到就不要选这个吧。

[ ] HPET Timer Support
  这也是一个新的特性,HPET是intel制定的新的用以代替传统的8254(PIT)中断定时器与RTC的定时器,全称叫作高精度事件定时器。如果你有一台较新的机器就选它吧,一般它是一个安全的选项,即使你的硬件不支持HPET也不会造成问题,因为它会自动用8254替换。

[*] Symmetric multi-processing support
  这个也不用多讲了吧,如果你使用多处理器系统就选吧,如果你和我一样使用一个单CPU系统还是把它请出去吧。

( Maximum number of CPUs (2-255)
  这里用来配置让Linux最多支持几路CPU,根据你的需要选择。

[*] Preemptible Kernel
  这可是个新特性,几乎所有介绍2.6的文章都会提到,这就是可抢先式内核。也就是说被一些优先级很高的程序可以先与一些低优先级的程序执行,即使这些程序是在核心态下执行(这实际上仍然不是真正的抢先式内核)。从而减少内核潜伏期,提高系统的响应。当然在一些特殊的点的内核是不可抢先的,比如内核中的调度程序自身在执行时就是不可被抢先的。这个特性可以提高桌面系统、实时系统的性能,所以还是选上吧。

[*] Machine Check Exception
  如果你的系统出现一些问题比如CPU过热,内核将会在屏幕上打印相关信息来提醒你。这个功能是需要硬件支持的。你可以查看/proc/cpuinfo看看是否有mce标志,有的话就选吧。如果你十分十分的不幸,选了它之后出现问题,可以在启动时加nomce参数来关闭它。

[*] Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4
  打开这个选项将会检查你机器上可能存在的问题,如果有一个非致命错误出现将会自动的修复并且记录,这可以帮助你查出程序出现问题的原因,是一个不错的选项,当然它只能用在AMD Athlon/Duron / Intel Pentium 4这类CPU上。如果你正好在用它们中的一个你就选吧。

[*] check for P4 thermal throttling interrupt.
  如果打开这个选项,在P4的CPU温度过高(也就是P4的温控装置起作用)时会在屏幕上显示出相关的信息,根据你的情况选择吧。

< > Toshiba Laptop support
  这个选项是针对Toshiba笔记本的,可以用来访问Toshiba的系统管理模式,也就是可以直接设置BIOS。不过要注意它只在Toshiba自己的 BIOS中起作用。假如你有一台Toshiba笔记本,可惜它的BIOS是Phoenix的,那这个选项仍然是梁山军师----无用:)

< > Dell laptop support
  这个同上面的选项基本相同,自己看着办吧:)

< > /dev/cpu/microcode - Intel IA32 CPU microcode support
  这个选项将让你可以更新Intel IA32系列处理器的微代码,当然你还必须在文件系统选项中选择devfs才能正常的使用它。如果你把它译为模块你还需要在modprobe.conf中加上这一行alias char-major-10-184 microcode
  内核本身并不带有微代码的二进制文件,你可以到这个网址去得到新的信息 

< > /dev/cpu/*/msr - Model-specific register support
  这个选项桌面用户一般用不到,它主要用在Intel的嵌入式CPU中的,这个寄存器的作用也依赖与不同的CPU类型而有所不同,一般可以用来改变一些CPU原有物理结构的用途,但不同的CPU用途差别也很大。

< > /dev/cpu/*/cpuid - CPU information support
  这会在/dev/cpu中建立一系列的设备文件,用以让过程去访问指定的CPU。一般不用选。

< > BIOS Enhanced Disk Drive calls determine boot disk (EXPERIMENTAL)
  这将可以打开实模式下BIOS中的增强磁盘设备服务,以决定从哪个磁盘上启动。这一般是安全的,不过大多数BIOS提供商都没有实现这个特性。

High Memory Support (off)
  如果你有大容量的内存(超过4G)你要选它,以使内核可以使用这部分内存。偶是没这命啦这部分永远为OFF,如果你有你就ON吧。

[ ] Math emulation
  在你的CPU上如果没有数学协处理器的话,打开这个选项可以让内核模拟一个,以提升浮点计算能力,不过慢的可以。如果你使用的不是古董CPU的话(486SX以前的)这一项你永远都不需要。

[*] MTRR (Memory Type Range Register)support
  在Intel p6家族的处理器中(Ppro、 PII和更新的)有一个内存类型范围寄存器,可用来控制处理器访问的内存范围。打开它一般可以提升显卡的显示性能,所以我们当然要在这说Y喽:)

第五项 Power management options (ACPI, APM)(高级电源管理)

[*] Power Management support
  如果你想让你的Linux支持高级电源管理(也就是平常我们说的软关机、系统休眠等)需要选择它。

[ ] Software Suspend (EXPERIMENTAL)
  选择这个选项你可以挂起你的计算机(有点象XP中的休眠),打开这项功能后,你可以使用swsusp或者shutdown -z 来挂起你的计算机。这样系统会将你当前正在进行的工作(也就是当前内存中的内容)作成一个镜象保存到你的交换分区中,在你下一次启动时使用启动参数 “resume=/dev/你的交换分区”,内核就会将上一次的工作内核从镜象文件中恢复到内存,这可以大大提高系统的启动速度。当你不想恢复上次的工作时向内核传递参数“noresume"。不过系统启动后你的交换分区将不可以使用,你可以使用mkswap命令来重新格式化你的交换分区。这个功能不需要高级电源管理的支持。很不错的功能,我一直有用,大家也来试试吧:)

[ ] Suspend-to-Disk Support
  这个选项与上面的功能基本相同,不过更灵活一些,可以通过下面的子选项来指定一个专用的交换分区来保存内存镜象。

() Default resume partition

  与上面的选项配合,来指定保存镜象的分区。

ACPI (Advanced Configuration and Power Interface) Support --->
  从这里进入ACPI电源管理的配置界面,要注意ACPI与APM不能同时使用,如果你同时配置了这两者,那么在系统启动时如果发现一个可工作的ACPI设备那么APM将被关闭,ACPI会被加载:

[*] ACPI Support
  这个选项应该不用我多说了,要想让你的系统使用ACPI来管理你的电源就要选上它,另外要想让它起作用,你还要在系统中安装acpid守护程序。

[*] Sleep States (EXPERIMENTAL)
  选择这个选项可以使你的系统具有挂起的功能,也就是说你可以暂时中断你的工作,让你的系统处与一种低电能消耗的状态(sleep state),你此时的系统状态会保存在内存或者磁盘上(取决于挂起的深度),当你需要时再恢复到正常的工作状态。但由于各种系统之间的差别,目前这项功能并不完善。只有很少的设备可以完美的支持这个特性,所以不建议一般用户使用它。

< > AC Adapter
  这是用来支持移动系统中的交流适配器的,以指示当前系统是不是在使用交流电,对于台式机不需要这个选项。

< > Battery
  这个选项用于通过/proc/acpi/battery来向用户提供移动系统中的电池状态信息。同上面那个选项一样对台式机没有作用。

<*> Button
  这个选项用于注册基于电源按钮的事件,比如power, sleep等,当你按下按钮时事件将发生,一个守护程序将读取/proc/acpi/event,并执行用户在这些事件上定义的动作比如让系统关机。

<*> Fan
  这个选项提供对系统风扇的控制支持,可以通过用户层的程序来对系统风扇进行控制(比如打开,关闭,读取当前风扇的运行状态等,不过只有极少数的硬件支持它)。

<*> Processor
  打开这个选项将让你的系统具有处理IDIE状态的能力,也就是说可以让你的处理器在空闲时节省电能。个人认为这个选项是一定要选的。

<*> Thermal Zone
  当你的系统温度过高时,ACPI可以利用这个选项来控制你的系统,及时调整系统的工作状态以保护你的CPU,非常棒的一个特性一定要选呀,要不然也就不用使用ACPI了。(当然这需要硬件的支持)

< > ASUS/Medion Laptop Extras
  这主要是为ASUS生产的笔记本电脑准备的,以提供对这些系统上那些额外的按钮们的支持,用户可以通过它们来打开或者关闭LCD的背光,调整亮度、定制LED的闪烁指示等功能。用户可以通过/proc/acpi/asus来改变这些设置。

< > Toshiba Laptop Extras
  这个选项是对Toshiba笔记本提供特别支持的,它的作用同上面的选项基本相同,如果你有一台这样的本本的话就选它吧。

[ ] Debug Statements
  如果选择它当ACPI出现错误时会打印出详细的信息,这将会增加内核的体积大约50k,如果没有必要还是不要选它吧。

[ ] Relaxed AML
  选择它的话ACPI翻译器将会放松对AML的错误检查,一些笔记本电脑可能需要它才能正常的使用ACPI(一些糟糕的桌面机可能也需要它,如果你的系统使用ACPI时出现问题不妨选上它试试)
PM (Advanced Power Management) BIOS Support --->
CPU Frequency scaling --->

 jeffreyli 回复于:2004-02-09 11:43:14
good!顶

 飘雪心辰 回复于:2004-03-25 07:07:13
jeffreyli先生您好,你引文章怎么不引文章作者,今早我收一邮件,一人问我的文章是不是抄袭而来,晕!我什么时候抄过人家东西!

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网