|
编译安装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!! |
|