QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2262|回复: 6

编译安装2.6.10内核全过程

[复制链接]
发表于 2004-12-31 11:46:28 | 显示全部楼层 |阅读模式
编译安装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.bz2http://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下有很多关于各种机子的配置:
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

三.编译
这一步没什么好说的,不需要你做什么
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!!
  • 发表于 2004-12-31 12:20:31 | 显示全部楼层
    一切都是非常的顺利,不过在我机器重启进入新的内核启动项后,引导就出现了如下的问题:

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

    请问怎么解决?
    回复

    使用道具 举报

    发表于 2004-12-31 12:52:52 | 显示全部楼层
    可以进入了正在解决 USB问题
    回复

    使用道具 举报

    发表于 2004-12-31 16:46:25 | 显示全部楼层
    说实话,RH9实在是太老了,要升级的太多了,手动改脚本只是迫不得已

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

    使用道具 举报

    发表于 2004-12-31 19:44:31 | 显示全部楼层
    哈哈 ,我今天刚装好ML1.2,是 2.6.9的核心,不过我把它升级到2.6.10了 ,先用make oldconfig,再用make menuconfig修改一下必要的,居然一次性成功了。
    以前用rh时升级了不下10次,没一次成功。在我看来从2.4升级到2.6比登天还难 。
    回复

    使用道具 举报

    发表于 2005-1-6 20:53:38 | 显示全部楼层
    我是按照那个说明升的级
    可是我鼠标就是用不了啊


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

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


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

    使用道具 举报

    发表于 2005-3-1 17:13:40 | 显示全部楼层
    好文章呀!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    GMT+8, 2024-9-20 03:48 , Processed in 0.061769 second(s), 15 queries .

    © 2021 Powered by Discuz! X3.5.

    快速回复 返回顶部 返回列表