升级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升级工作完成了。
lsusb, usbview, kde 信息中心中usb目录定义仍然不对,所以通过这些命令你看不到系统任何usb信息
自己修正吧,其他的软件问题也不少,所以以上的工作是最基础的,所以建议大家没事不要赶什么潮流。
对了,忘了说了,kernel-2.6安装后,我测试重新编译kernel-2.6,gcc出现异常,连续测试7次,每次
都在随机的位置退出编译,说明gcc已经不能正常工作,可能又要LD_ASSUME_KERNEL,始终不是一件好事。
继续升级glibc, gcc再所难免'