Linux内核升级手记(2.4.20-8 ~ 2.6.8)
题记: 最近想研究一下驱动开发,找了一本电子版 的Oreilly.linux.device.drivers.3rd.edition.2005.CHM,第三版针对的内核是2.6的,可我虚拟机里面 的系统内核是2.4的,以前曾经升级过内核, 但是不知道什么原因,现在进不了2.6的内核了.所以下决心重头再来过一遍^_^. 关于内核升级的好文章网上数不胜数, 我写下这篇文章的目的一是为了和大家分
·
题记:
最近想研究一下驱动开发,找了一本电子版 的Oreilly.linux.device.drivers.3rd.edition.2005.CHM,第三版针对的内核是2.6的,可我虚拟机里面 的系统内核是2.4的,以前曾经升级过内核, 但是不知道什么原因,现在进不了2.6的内核了.所以下决心重头再来过一遍^_^. 关于内核升级的好文章网上数不胜数, 我写下这篇文章的目的一是为了和大家分享经验,二是为了便于自己以后查阅.
一、2.6
内核有哪些特点?
首先我推荐你看一下《Linux 2.6内核的精彩世界》, 这篇文章比较详细的介绍了2.6内核新的特性, 我们关注最多的可能是以下几个方面:
1. 内核是抢占式的, 这将显著地提高交互式和多媒体应用程序的性能。
2. 添加了sysfs文件系统, 它集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统(安装在/sys目录)是核心看到的设备树的一个直观反映。
3. 为了区别以 .o 为扩展名的常规对象文件,内核模块现在使用的扩展名是 .ko。
二、安装前的准备--
升级一些必要的工具.
到底哪些工具需要升级呢? 我们首先得看看Documentation/Changes这个文件,里面比较详细的介绍了安装此内核需要工具的版本号, 我是按照里面的要求一一升级的,当然对于你用不到的设备比如pcmcia就没必要升级了.
这里我说一下module-init-tools和mkinitrd的升级.
1. 的升级module-init-tools
module-init-tools提供一组工具用于加载和卸载内核模块, 包括depmod, insmod,modprobe,rmmod,lsmod ,etc. 我下载的版本是3.1, 解压之后查看里面的README文件进行安装, 一般采用如下步骤:
#./configure --prefix=/
#make moveold
#make
#make moveold
#make
#make install
每一步都在README里面有说明.
新的工具采用/etc/modprobe.conf配置文件. 因此我们需要把/etc/modules.conf转换成/etc/modprobe.conf, 只需要在解压目录下输入
./generate-modprobe.conf /etc/modprobe.conf 即可.
2. mkinitrd的升级
这个在Changes文件里面并没有提及,但是如果不升级的话安装内核(make install)的时候会提示:
No module BusLogic found for kernel 2.6.8, aborting.
mkinitrd failed
make[1]: *** [install] Error 1
make: *** [install] Error 2
mkinitrd failed
make[1]: *** [install] Error 1
make: *** [install] Error 2
由于mkinitrd的依赖关系,还需要下载lvm2.device-mapper这两个包
我采用的版本号是:
这里给大家提供一个非常棒的rpm包下载链接:
注意,并不是版本越高越好哦,版本越高依赖关系越多,越麻烦,所以够用就行了^_^.
三
、定制内核
2.6内核的最新版本是2.6.18,我到
www.kernel.org下载下来之后,安装到/usr/src目录下,然后编译,令我奇怪的是从下午1点左右一直编译到4点多还没结束,最后发现尽然一直在一个死循环里面,什么事情都没完成,我ft,得到一个教训:最新的不一定最适合!所以就换了以前用过的2.6.8的内核。
关于内核的定制我不想说太多,一来觉得罗嗦,网上资料太多,二来也是自己懒的去细说,但是我还是要说以下几点:
1. 内 核配置哪些选项该选,哪些不需要选,完全取决于你的硬件配置和你使用的目的,就拿我来说,是在Vmware里面玩得,Vmware的硬盘选择的是 SCSI,它的驱动是BusLogic,网卡驱动是AMD Pcnet32,所以其他的SCSI驱动和网卡驱动一律杀除,再来说USB设备,我想大多数人都没有USB鼠标和USB硬盘,所以只要选择一般的USB支 持就行了,还有什么红外,蓝牙之类的,都不需要选上。我把sound支持去掉了,graphics只支持framebuffer,因为我不需要这些东西。
2. 为 了体验2.6内核新的特性,关于"Processor type and features"选项, 一定要选上 "Preemptible Kernel";关于文件系统, 选上常用的那几种就可以了. 如果要体验sysfs的话, 要选上对sysfs的支持.另外 关于"Loadable Module support"选项, 一定要选上"Module unloading"和
"Automatic kernel module loading"这两个选项,不然的话你不能rmmod了哦。
"Automatic kernel module loading"这两个选项,不然的话你不能rmmod了哦。
定制好内核后
make
make modules_install
make install
2.6内核安装比2.4的方便 ,make这 一步完成了make bzImage和make modules两个过程.
如果没有错误的话, 相信你的grub配置文件已经被修改过了吧(不要告诉我你用的lilo),在/boot目录下多了vmlinuz-2.6.8和initrd-2.6.8.img,System.map-2.6.8
这几个文件, vmlinuz-2.6.8就是arch/i386/boot目录下的bzImage, initrd-2.6.8.img是由make install生成的(mkinitrd).
reboot看看能不能启动2.6的内核.
四
、
修改相应文件使其适应
2.6
内核
我是按这篇文章里面提到的修改的
1. 支持Hotplug
需要改一个最重要的文件/etc/rc.sysconfig 这是一个ln 连接。正真的文件在/etc/rc.d/里.当然, 首先要在内核配置时配置 了HOTPLUG的支持. 然后,由于/proc/ksyms改名为/proc/kallsyms,所以必需修改启动脚/etc/rc.sysinit.
为了兼容原有的linux-2.4.x系统, 可以加上下面几行:
#
# ----- 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"变量引用.
需要改一个最重要的文件/etc/rc.sysconfig 这是一个ln 连接。正真的文件在/etc/rc.d/里.当然, 首先要在内核配置时配置 了HOTPLUG的支持. 然后,由于/proc/ksyms改名为/proc/kallsyms,所以必需修改启动脚/etc/rc.sysinit.
为了兼容原有的linux-2.4.x系统, 可以加上下面几行:
#
# ----- 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"变量引用.
用Vi打开rc.sysinit 在命令模式下输入:s///proc//ksyms//$KSYMS/g 即可.
2.体验sysfs
首先, 创建目录/sys:
# mkdir /sys
然后, 按照下列步骤修改启动脚本/etc/rc.sysinit文件:
找到行: mount -f /proc", 在下面增加:
if [ "$KERNELVER" = "2.6" ]; then
mount -f /sys
fi
首先, 创建目录/sys:
# mkdir /sys
然后, 按照下列步骤修改启动脚本/etc/rc.sysinit文件:
找到行: mount -f /proc", 在下面增加:
if [ "$KERNELVER" = "2.6" ]; then
mount -f /sys
fi
找到行
"Mounting local filesystems: " mount -a -t nonfs,smbfs,ncpfs -O no_netdev
在其下面增加下列几行:
#
# Mount /sys for kernel-2.6.x
#
if [ "$KERNELVER" = "2.6" ]; then
action $"Mounting sysfs filesystem: " mount -n -t sysfs /sys /sys
fi
接下来, 在/etc/fstab文件中, 加入这样一行:
none /sys sysfs defaults 0 0
"Mounting local filesystems: " mount -a -t nonfs,smbfs,ncpfs -O no_netdev
在其下面增加下列几行:
#
# Mount /sys for kernel-2.6.x
#
if [ "$KERNELVER" = "2.6" ]; then
action $"Mounting sysfs filesystem: " mount -n -t sysfs /sys /sys
fi
接下来, 在/etc/fstab文件中, 加入这样一行:
none /sys sysfs defaults 0 0
启动的时候挂载sysfs文件系统.
最后, 修改/etc/init.d/halt脚本中的halt_get_remaining函数:
将:
awk '$2 ~ /^//$|^//proc|^//dev/{next}
改为:
awk '$2 ~ /^//$|^//proc|^//sys|^//dev/{next}
最后, 修改/etc/init.d/halt脚本中的halt_get_remaining函数:
将:
awk '$2 ~ /^//$|^//proc|^//dev/{next}
改为:
awk '$2 ~ /^//$|^//proc|^//sys|^//dev/{next}
3. 支持USB设备
linux-2.6.x的USB驱动模块的名字已经改变了, 所以由此引起的问题多多......,
对应于USB-2.0的host控制器的内核模块名字仍然是ehci-hcd,
对应USB-1.1的host控制器的内核模块名字已经从usb-ohci改为ochi-hcd,
对应于通用USB host控制器的内核模块名字已经从usb-uhci该为uhci-hcd.
然而不幸的是, 在安装module-init-tools程序包时生成的/etc/modprobe.conf配置文件却仍然使用usb-ohci这个名字. 例如:
alias usb-controller usb-ohci
alias usb-controller1 ehci-hcd
因此, 要把它改为:
alias usb-controller ohci-hcd
alias usb-controller1 ehci-hcd
linux-2.6.x的USB驱动模块的名字已经改变了, 所以由此引起的问题多多......,
对应于USB-2.0的host控制器的内核模块名字仍然是ehci-hcd,
对应USB-1.1的host控制器的内核模块名字已经从usb-ohci改为ochi-hcd,
对应于通用USB host控制器的内核模块名字已经从usb-uhci该为uhci-hcd.
然而不幸的是, 在安装module-init-tools程序包时生成的/etc/modprobe.conf配置文件却仍然使用usb-ohci这个名字. 例如:
alias usb-controller usb-ohci
alias usb-controller1 ehci-hcd
因此, 要把它改为:
alias usb-controller ohci-hcd
alias usb-controller1 ehci-hcd
支持USB键盘的模块名字也从keybdev变为usbkbd, 支持USB鼠标的模块名字也从mousedev改为usbmouse.
由于我用不到usb鼠标和usb键盘,所以干脆在/etc/rc.sysinit里面注释这两行:
action $"Initializing USB keyboard: " modprobe kenbdev 2> /dev/null
action $"Initializing USB mouse: " modprobe mousedev 2> /dev/null
当然如果你由usb鼠标和usb键盘的话,把模块名改了就可以了.
最后把/etc/rc.sysinit中的needusbstorage部分从:
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
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
fi
改为
needusbstorage=
if [ $usb = "1" ]; then
if [ "$KERNELVER" = "2.6" ]; then
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /sys/bus/usb/devices 2>/dev/null`
LC_ALL=C grep 'hid' /sys/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null
else
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
fi
if [ $usb = "1" ]; then
if [ "$KERNELVER" = "2.6" ]; then
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /sys/bus/usb/devices 2>/dev/null`
LC_ALL=C grep 'hid' /sys/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null
else
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
fi
fi
4.Vmware tools
修改/usr/bin/vmware-config-tools.pl文件,把里面的/proc/ksyms改为/proc/kallsyms,然后重新运行vmware-config-tools.pl,按照提示往下运行即可.
注意网卡要想工作,需要vmxnet模块的支持,这个是由vmware-config-tools.pl生成的.
五
、
FAQ
1. 进入2.6内核之后,安装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 unavailabl
error: cannot open Packages database in /var/lib/rpm
no packages
解决办法1:
可以升级RPM,比较麻烦.
解决方法2:
export LD_ASSUME_KERNEL=2.2.5 ,网上都说这个有用,可是我这样之后提示:
error while loading shared libraries: libc.so.6:cann’t open shared object file:No such file or directory
解决方法3:
修改
/usr/lib/rpm/macros
在里面寻找
代码 :
%__dbi_cdb create cdb mpool mp_mmapsize=16Mb mp_size=1Mb
修改成
代码 :
%__dbi_cdb create cdb mpool mp_mmapsize=16Mb mp_size=1Mb private
在里面寻找
代码 :
%__dbi_cdb create cdb mpool mp_mmapsize=16Mb mp_size=1Mb
修改成
代码 :
%__dbi_cdb create cdb mpool mp_mmapsize=16Mb mp_size=1Mb private
我通过方法3解决的.^_^
<script type="text/javascript">
</script>
欢迎大家与我交流(
mutecat@126.com)
更多推荐
已为社区贡献1条内容
所有评论(0)