junehn 发表于 2004-12-31 11:46:28

编译安装2.6.10内核全过程

编译安装2.6.10内核全过程
June.Hn.        2004-12-31
QQ:67842531
email:[email protected]

明天就是2005年了,所以今天把这篇文章写出来,算是2004年的最后一件想做的事不吧,希望能对大家有所帮助.

我用2.6的内核一经很久了,从2.6.0到2.6.10,几乎每一次更新我都会重新编译.但一直有几个问题没有解决:usb keyboard,usb mouse,HID,EHCI,OHCI,相信有不少人也遇到过这些问题,这两天天狠下一条心,顶着考试的压力终于把问题解决了.

我的配置:
p4 2.0GHz
声卡:i810 AC97
显卡;Intel 845G
OS:Red Hat 9.0

一.准备工作:
1.安装module-init-tools-3.0.tar.bz2:(http://www.kernel.org/pub/linux/kernel/people/rusty/modules/module-init-tools-3.0.tar.gz )
tar -zxvf module-init-tools-3.0.tar.gz
cd module-init-tools-3.0
./configure --prefix=/sbin
make
make install
./generate-modprobe.conf /etc/modprobe.conf

2.安装modutils-2.4.26-9.i386.rpm:(大家可以在http://rpm.phone.net搜索你想要的RPM包,只是好象不支持多线程,下载有点慢)
rpm -ivh modutils-2.4.26-9.i386.rpm
如果安装不上,试试
rpm -Uvh modutils-2.4.26-9.i386.rpm

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


二.配置内核
1.内核配置很费事,选项太多了,最好用默认的.在linux-2.6.10/arch下有很多关于各种机子的配置:
alphacris   ia64m68knommuppc    sh   sparc64x86_64
arm    h8300m32rmips       ppc64sh64   um
arm26i386   m68kparisc   s390   sparcv850
找到你的机子对应的目录,里面会有一个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

三.编译
这一步没什么好说的,不需要你做什么
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

四.要解决的问题
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=${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"变量引用. 配置好后, 还必需下载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--->
                <m>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=${UNAME:0:3}
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


附上我的配置文件

希望大家能顺利的编译通过,这篇文章中有很多不足的地方还望多多指点.

最后祝大家:新年快乐!Happy New Year!!

45855531 发表于 2004-12-31 12:20:31

一切都是非常的顺利,不过在我机器重启进入新的内核启动项后,引导就出现了如下的问题:

kernel panic-not syncing:no init found.try passing init=option to kernel

请问怎么解决?

45855531 发表于 2004-12-31 12:52:52

可以进入了正在解决 USB问题

cnhnln 发表于 2004-12-31 16:46:25

说实话,RH9实在是太老了,要升级的太多了,手动改脚本只是迫不得已

不过还是麻烦斑竹给个精吧

txr 发表于 2004-12-31 19:44:31

哈哈 ,我今天刚装好ML1.2,是 2.6.9的核心,不过我把它升级到2.6.10了 ,先用make oldconfig,再用make menuconfig修改一下必要的,居然一次性成功了。
以前用rh时升级了不下10次,没一次成功。在我看来从2.4升级到2.6比登天还难 。

45855531 发表于 2005-1-6 20:53:38

我是按照那个说明升的级
可是我鼠标就是用不了啊


如果你要把它作为模块,请参考snoopyxp大哥的<<2.4->2.6内核升级指南>>中的这一段

这句话之前是一种改法 之后是另一种改发对吧~
我是这样理解的。用的是snoopyxp大哥的改法
哦~~~还有就是关机的时候有个MIX什么结束失败~~不知道有没有关系。
由于2.6内核鼠标太快,用触摸板操作实在是困难。现在只好还在用2.4
希望大家多多提出自己的想法~~~


谢过了先~~~
谢谢你在我发的帖子里的说明!

dongni386 发表于 2005-3-1 17:13:40

好文章呀!
页: [1]
查看完整版本: 编译安装2.6.10内核全过程