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

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

Linux 2.6.10 kernel installation

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

领测软件测试网 为RH9升级Kernel (2.4.xx - 2.6.xx), 顺便加上iptables IPP2P支持, 用于限制网络中P2P类软件下载. (一切操作是在root用户下,下载的软件放在/opt/soft/相关目录下)

L一.Preparation:
1.参考2.6.xx内核软件包文档(Documentation/Changes)中的软件升级需求升级了ps工具程序到最新版本(是到http://www.rpmfind.net下载对应redaht或者fedora的procps-3.2.5-1.src.rpm,然后运行rpmbuild--rebuild procps-3.2.5-1.src.rpm, 安装编译好的RPM包即可) 安装module-init-tools-3.0.tar.bz2:(http://www.kernel.org )
tar -zxvf module-init-tools-3.0.tar.gz
cd module-init-tools-3.0
./configure --prefix=/
make moveold
make
make install
./generate-modprobe.conf /etc/modprobe.conf

命令"make moveold"将把系统原来的modutils工具程序改名为"*.old"(比如,lsmod.old等等). NOTE!这是非常重要的一步, 千万不要省略. 这将使得你可以继续使用原有的linux-2.4.x系统, 因为在2.4.x系统下,新的module-init-tools工具包实际上是倚赖原来"*.old"程序来加载内核模块. 如果忘记了这一步也不要紧张,可以先下载并安装原来的modutils程序包, 然后按照上面的步骤重来一遍就可以了.
新的module-init-tools工具包不再使用原来的/etc/modules.conf配置文件了, 而是使用新的配置文件/etc/modprobe.conf.因此必需用命令"./generate-modprobe.conf/etc/modprobe.conf"来生成新的配置文件/etc/modprobe.conf.
如果你使用devfs系统你还需要复制modprobe.devfs 到/etc目录下。

2.安装modutils-2.4.26-16.i386.rpm:(http://www.rpmfind.net)
rpm -iUvh modutils-2.4.26-16.i386.rpm

3.下载新的mkinitrd/lvm2软件包
http://www.rpmfind.net
下载 mkinitrd和lvm2最新版本并安装.
rpm -iUvh mkinitrd-xxx.rpm lvm2-xxxx.rpm --nodeps
否则在make install时候会提示以下错误:
No module mptbase found for kernel 2.6.10, aborting.
mkinitrd failed
make[1]: *** [install] Error 1
make: *** [install] Error

4.下载最新的内核(http://kernel.org/pub/linux/kernel/)
linux-2.6.10.tar.bz2或者linux-2.6.10.tar.bz2(最好将内核拷到/usr/src,这样解压方便一点)
解压:
cd /usr/src
tar -xjpvf linux-2.6.10.tar.bz2或者
tar -xzpvf linux-2.6.10.tar.gz

5. Pathc iptables
到http://www.netfilter.org下载最新的iptables和patch-o-matic-ng软件包.
需要注意的是:
1)先卸载了系统原先的iptables软件包
rpm -qa |grep iptables
rpm -e --nodeps iptables-devel
rpm -e --nodeps iptables

2)解压软件包
tar -xjpvf iptables-1.3.0.tar.bz2
tar -xjpvf patch-o-matic-ng-20050225.tar.bz2
cd
patch-o-matic-ng-20050225
./runme extra
输入内核源代码的路径/usr/src/linux-2.6.10
输入iptables源代码的路径/opt/soft/iptables/iptables-1.3.0
然后按你自己的需要把iptables的扩展补丁打到内核(要实现封杀bt一定要选上ipp2p这扩展)
在以下配置内核部分,需要:
把networking support-->networking options-->networking packet filtering-->IP:netfilter configruation-->ipp2p match选上

二.Kernel Configuration
1.内核配置很费事,选项太多了,最好用默认的.在linux-2.6.10/arch下有很多关于各种机子的配置:
alpha cris ia64 m68knommu ppc sh sparc64 x86_64
arm h8300 m32r mips ppc64 sh64 um
arm26 i386 m68k parisc s390 sparc v850
找到你的机子对应的目录,里面会有一个defconfig文件,就是对应机子的默认配置,很不错,如果你的配置跟我的一样的话,几乎不许要改什么地方.
配置可以使用make menuconfig,make xconfig,make gconfig这三个命令中的任何一个,第一个图形界面和控制台下都能用,后两个只能在图形界面下使用,我喜欢在字符界面下工作,所以用make menucofig

cd /usr/src/linux-2.6.10
cp arch/i386/defconfig ./.config
make menuconfig或者make xconfig,make gconfig

三.Compile Kernel
这一步没什么好说的,不需要你做什么
make
make modules
make modules_install
make install
如果你想偷懒的话可以用:
make && make modules && make modules_install && make install
然后就可以去喝杯咖啡,休息一下什么的.如果你想让它编译完连机子都关了的话,用下面这条命令
make && make modules && make modules_install && make install && poweroff

四.Problems
1.不认识root=LABEL/的问题:
如果重新启动新内核无法进入出现root=LABEL/不能识别,用原来的内核启动系统,编辑/boot/grub/grub.conf
vi /boot/grub/grub.conf

找到:
title Red Hat Linux (2.6.10)
root (hd0,3)
kernel /boot/vmlinuz-2.6.10 ro root=LABEL=/
initrd /boot/initrd-2.6.10.img
去掉 root=LABEL=/
title Red Hat Linux (2.6.10)
root (hd0,3)
kernel /boot/vmlinuz-2.6.10 ro
initrd /boot/initrd-2.6.10.img
重启.

2.Hotplug问题(源自snoopyxp大哥的<<2.4->2.6内核升级指南>>)
当然, 首先要在内核配置时配置了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=$
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"变量引用. 配置好后,还必需下载hotplug的用户态辅助工具包:http://www.kernel.org/pub/linux/uti...4_03_11.tar.gz. 解开这个包以后, 直接"make install"就可以了. 它将产生/etc/hotplug/配置目录.


3.USB问题
USB问题主要是因为2.6内核中的这些模块已经改名了
USB-2.0的host控制器的内核模块名字仍然是ehci-hcd
USB-1.1的host控制器的内核模块名字已经从usb-ohci改为ochi-hcd
通用USB host控制器的内核模块名字已经从usb-uhci该为uhci-hcd.
USB键盘的模块名字从keybdev变为usbkbd
支持USB鼠标的模块名字也从mousedev改为usbmouse
因此, 我们必需修改启动脚本/etc/rc.sysinit文件. 同时必须兼容原有的2.4.x系统:

首先修改/etc/modprobe.conf
找到:
alias usb-controller usb-ohci
alias usb-controller1 ehci-hcd

把它改为:

alias usb-controller ohci-hcd
alias usb-controller1 ehci-hcd

修改/etc/rc.sysinit
2.6内核默认将HID编进内核,这样将不会生成hid,usbmouse,和usbkbd模块,也不会有USBMOUSE,USBKEYBOARD选项
Device Drivers--->
USB support--->
<*>USB Human Interface Device(full HID)support
[*]HID layer inout support
[ ]/dev/hiddev raw HID device support
#////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#MOdify by June.Hn.
#2.6内核中找不到usbdevfs
#odl:
#if [ $usb = 1 -a ! -f /proc/bus/usb/devices ]; then
# action $"Mounting USB filesystem: " mount -t usbdevfs usbdevfs /proc/bus/usb
#fi
if [ "$KERNELVER" = "2.4" ]; then
if [ $usb = 1 -a ! -f /proc/bus/usb/devices ]; then
action $"Mounting USB filesystem: " mount -t usbdevfs usbdevfs /proc/bus/usb
fi
fi
#end
#////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

needusbstorage=
if [ $usb = "1" ]; then
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#Add by June.Hn.
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 usbhid 2> /dev/null
else

#end
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#Modify by June.Hn.
#2.6内核中被编进内核,不需要加载
#old:
#action $"Initializing USB keyboard: " modprobe keybdev 2> /dev/null
#action $"Initializing USB mouse: " modprobe mousedev 2> /dev/null
#new:
if [ "$KERNELVER" = "2.4" ]; then
action $"Initializing USB keyboard: " modprobe keybdev 2> /dev/null
action $"Initializing USB mouse: " modprobe mousedev 2> /dev/null
fi
#end
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
fi

如果把USB Human Interface Device(full HID)support编译成模块,有USBMOUSE,USBKEYBOARD选项
Device Drivers--->
USB support--->
USB Human Interface Device(full HID)support
[*]HID layer inout support
[ ]/dev/hiddev raw HID device support
USB HID Boot Protocol drivers--->
[*]USB HIDBP Keyboard(simple Boot)support
[*]USB HIDBP Mouse(simple Boot)support
如果你要把它作为模块,请参考snoopyxp大哥的<<2.4->2.6内核升级指南>>中的这一段

# ----- KERNEL 2.6.x support ------
# This is for compatibility between kernel-2.4.x and kernel-2.6.x
#
UNAME=`uname -r`
KERNELVER=$
if [ "$KERNELVER" = "2.6" ]; then
#
# This is kernel-2.6.x
#
KSYMS=/proc/kallsyms
KEYBDEV_NAME=usbkbd
MOUSEDEV_NAME=usbmouse
else
#
# This is kernel-2.4.x
#
KSYMS=/proc/ksyms
KEYBDEV_NAME=keybdev
MOUSEDEV_NAME=mousedev
fi

然后, 把/etc/rc.sysinit脚本文件中出现keybdev和mousedev的地方都改为$KEYBDEV_NAME和$MOUSEDEV_NAME. 把脚本文件/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

action $"Initializing USB keyboard: " modprobe $KEYBDEV_NAME 2> /dev/null
action $"Initializing USB mouse: " modprobe $MOUSEDEV_NAME 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 usbhid 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
action $"Initializing USB keyboard: " modprobe $KEYBDEV_NAME 2> /dev/null
action $"Initializing USB mouse: " modprobe $MOUSEDEV_NAME 2> /dev/null
fi

延伸阅读

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


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

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