将Redhat9升级到Kernel2.6
Redhat9自带的内核是2.4.20版,已经是几年以前的了,最近打算将它升级到最新的2.6.8.1内核。 ————————————- # 下载内核并做安装准备
首先到官方网站http://www.kernel.org/ 上下载了kernel-2.6.8.1。将其展开到/usr/src/下。参考了网上的一些文章,得知Redhat9要想成功编译2.6.8.1版内核需要升级两个工具:modutils和mkinitrd。modutils很好找,于是就找了一个module-init-tools3.0版,然后升级:
# ./configure --prefix=/
# make moveold
# make all install
# ./generate-modprobe.conf /etc/modprobe.conf
由于modutils3.0和Redhat9自带的modutils2.4版不兼容,所以需要在make之前使用make moveold命令将Redhat9自带的modutils2.4版的文件改名为.old,这样使得即使在使用原有的2.4内核时modutils能够调用旧版本的modutils来工作。
新版的modutils不再使用/etc/modules.conf,而是使用/etc/modprobe.conf。
至于mkinitrd,一时没有找到该软件,所以就没有装(不过到最后还是不得不装)。
内核编译
然后进行内核配置。首先进入/usr/src/linux-2.6.8.1,执行make mrproper以保证内核源码干净,然后使用make menuconfig进行内核配置。2.6.8.1版的内核中已经默认选中了很多特性的模块支持,所以我基本上没有进行任何改动――主要增加了以下的几个选项:Loadable Module support中的Module unloading;Processor type and feathures中的Preemptible Kernel;File System中的NTFS支持和NTFS写支持;Device Drivers -> Graphics support中有个Logo configuration,觉得有点新鲜就选中了其中的Bootup Logo和Standard 244-color Linux logo;还有个Console display driver support,选中了里面的Framebuffer Console Support和Select compiled-in fonts和VGA 8x16font。注意Framebuffer Console Support一定要选成built-in不要选成module,否则启动时系统无法使用VESA的控制台。另外检查一下Graphics support中的Support for frame buffer devices和VESA VGA graphics support要被选中。
开始编译内核:
# make bzImage
# make modules
# make modules_install
# make install
make install之后检查/boot/grub/menu.lst,发现新内核的启动菜单已经自动添加上了。重新启动电脑,选择新的内核进行启动,结果Kernel panic,说找不到root=LABEL=/。查了一下资料发现原来2.6.8.1版内核不支持LABEL=/参数,于是重新启动时在grub中修改启动参数,删除了root=LABEL=/启动参数,结果还是Kernel panic,说找不到init程序。不得已重新启动,在grub中删除了initrd一行,结果启动成功。想想第二次Kernel panic时的错误信息是有关启动镜像initrd的错误,于是觉得是不是由于没有升级mkinitrd的缘故而导致initrd启动镜像与新的内核不兼容?于是找了一个mkinitrd-3.5.14-1的rpm包安装:
# rpm -e --nodeps mkinitrd
# rpm -i mkinitrd-3.5.14-1.i386.rpm
之后进入/usr/src/linux-2.6.8.1,执行make install,然后修改/boot/grub/menu.lst,去掉root=LABEL=/参数(以后每次make install之后都要进行这一步,麻烦)。重新启动,成功。看来mkinitrd还是要升级的。
支持hotplug
2.8的内核中,/proc/ksyms变成了/proc/kallsyms,因此启动脚本/etc/rc.sysinit中相应的文件名都要跟着改变。为了兼容原有的2.4内核,需要添加以下几行:
#
# ----- KERNEL 2.6.x support ------
# This is for compatibility between kernel-2.4.x and kernel-2.6.x
#
UNAME=`uname -r`
KERNELVER=${UNAME:0:3}
if [ "$KERNELVER" = "2.6" ]; then
#
# This is kernel-2.6.x
#
KSYMS=/proc/kallsyms
else
#
# This is kernel-2.4.x
#
KSYMS=/proc/ksyms
fi
然后把rc.sysinit中出现的/proc/ksyms全部替换成$KSYMS即可。
支持sys文件系统
2.8内核中的一部分设备信息已经由proc转移到sysfs中,因此需要在系统中增加对sysfs的支持。首先建立/sys目录,然后修改/etc/rc.sysinit,在mount -f /proc下增加:
if [ "$KERNELVER" = "2.6" ]; then
mount -f /sys
fi
在action $"Mounting proc filesystem: " mount -n -t proc /proc /proc
下增加:
if [ "$KERNELVER" = "2.6" ]; then
action $"Mounting sysfs filesystem: " mount -n -t sysfs /sys /sys
fi
然后在/etc/fstab中增加:
none /sys sysfs defaults 0 0
最后, 修改/etc/init.d/halt脚本中的halt_get_remaining函数:
将:
awk '$2 ~ /^\/$|^\/proc|^\/dev/{next}
改为:
awk '$2 ~ /^\/$|^\/proc|^\/sys|^\/dev/{next}
支持USB设备
修改/etc/modprobe.conf,寻找usb-controller,可以看到modutils自动生成的modprobe.conf文件中,usb模块名使用的还是原来的usb-ochi、usb-uhci等,而2.8内核中usb模块的名字已经变成了ohci-hcd等。所以需要将这里改成
alias usb-controller ohci-hcd
alias usb-controller1 ehci-hcd
alias usb-controller2 uhci-hcd
rpm工具在2.8内核下不能使用的问题
启动到新的内核之下后,运行rpm -q glibc,你会发现rpm程序死在那里了,只能通过killall -9 rpmq来杀掉。可以通过下面这个方式来临时解决:
export LD_ASSUME_KERNEL=2.2.5
当然你可以将该行添加到~/.bashrc或/etc/bashrc中。
百兆网卡不能正常工作的问题
安装好新内核之后试图下载其他的软件,发现速度奇慢,仿佛是在用10M网卡一样。查了一下资料得知可以用mii-tool来修改网卡的工作方式。执行
mii-tool -F 100baseTx-FD
以强制网卡工作在100M全双工方式下。原以为重新启动系统之后需要重新设置网卡工作方式,谁知启动之后执行mii-tool它报告说eth0: no autonegotiation, 100baseTx-FD, link ok,不知何故系统能够自动识别网卡的工作模式了。
自定义启动Logo
以前在配置内核的时候选中了启动Logo的支持,现在只要在启动的时候加上参数vga=0x318就可以使用VESA方式启动并看到小企鹅的Logo了。
不过使用下面的方法可以将企鹅的Logo换成自己喜欢的任意图片。内核所能支持的图片格式为ppm,最大色数为224色。
首先准备一幅自己喜欢的图片(尺寸不要太大,因为是要编译到内核中的,太大了会增大内核的体积),然后将背景涂成黑色(由于控制台的背景就是黑色嘛)。然后将该图片保存成png格式,例如linuxlogo.png。在Linux下使用下面的命令:
# pngtopnm linuxlogo.png > linuxlogo.pnm
# pnmquant 224 linuxlogo.pnm > linuxlogo224.pnm
# pnmtoplainpnm linuxlogo224.pnm > linuxlogo224.ppm
然后用生成的linuxlogo224.ppm替换/usr/src/linux-2.6.8.1/drivers/video/logo/logo_linux_clut224.ppm(最好先做好备份),然后删除同一目录下的logo_linux_clut224.c文件,重新编译内核,安装之后别忘了修改/boot/grub/menu.lst,去掉root=LABEL=/并加上vga=0x318。启动之后就可以在屏幕左上方看到自己的Logo了。