分类: LINUX
2009-12-30 01:38:12
1.首先必须对一些相关软件进行升级
内核升级中用到下面几个软件(软件版本号并不要求一定是下面列出来的):
device-mapper.1.01.04
LVM2.2.01.14
mkinitrd-4.1.18-2
modutils-2.4.27
module-init-tools-3.2.2
所有这些软件可以去下面几个网站下载:
下面就是我下载的几个软件,可以去91files我的页面下载():
device-mapper.1.01.04.tgz
LVM2.2.01.14.tgz
mkinitrd-4.1.18-2.i386.rpm
modutils-2.4.27.tar.bz2
module-init-tools-3.2.2.tar.bz2
1.1 安装 device-mapper
#tar -zxvf device-mapper.1.01.04.tgz
#cd device-mapper.1.01.04
#./configure --prefix=/usr 否则LVM2在配置时找不到libdevmapper.h
#make all
#make install
1.2 安装 LVM2
#tar -zxvf LVM2.2.01.14.tgz
#cd LVM2.2.01.14
#./configure --prefix=/
#make all
#make install
1.3 升级 mkinitrd
#rpm -Uvh --nodeps mkinitrd-4.1.18-2.i386.rpm
这里要加上“--nodeps”,不然又显示没装LVM2的错误了。
1.4 升级 modutils
#tar -xvjf modutils-2.4.27.tar.bz2
#cd modutils-2.4.27
#./configure --prefix=/
#make all
#make install
1.5 安装 module-init-tools
#tar -xvjf module-init-tools-3.2.2.tar.bz2
#cd module-init-tools-3.2.2
#./configure --prefix=/
#make moveold
#make
#make install
2. 编译和安装内核
下载内核文件,我下载的是linux-2.6.18.tar.bz2(可以去下载)
拷贝到/usr/src目录并解压缩,注意一定要在Linux下解开,如果你是在Windows下解开Linux内核的话就会遇到
这个问题,因为Windows不区分文件大小写, ipt_TOS.c和ipt_tos.c在Windows中是一回事,就被替换掉了,改
在Linux下解开它就没有问题了。
#cd /usr/src
#tar -xvjf linux-2.6.18.tar.bz2
#make mrproper
#make menuconfig(这里需要对一些选项进行配置,请参照第三部分)
#make
#make modules_install
#make install
3. 内核选项
配置2.6.18内核时如果你的主板是Intel芯片的话,你用默认配制也许就可以得到一个满意的内核。这里的难点是虚拟机下的SCSI选项,弄不好内核编译就必然失败。还有就是网卡,声卡芯片的型号了,他们的型号你都可以用lspci(非常重要的命令)查找到。你只要把你pci上的东西全部选择对了,剩下就用默认的就可以了。
3.1 Device Drivers -> Block devices ->
<*> RAM disk support
(16) Default number xxxxx
(16384) Default RAM disk size 一定要改为16384以上
[*] Initial RAM disk (initrd) support
3.2 有SCSI卡(如VMware中的BusLogic BT946C) 的要把它编译成模块(M) 不然会在make install 出错。
(其它关于SCSI的选项为内核内建,Buslogic可以选择为模块,只是最后需要制作initrd模块)
Device Drivers->SCSI device support-><*>SCSI device support
Device Drivers->SCSI device support-><*>SCSI disk support
Device Drivers->SCSI device support->SCSI low-level drivers-><*>BusLogic SCSI support
Device Drivers ---> Fusion MPT device support --->
3.3 网卡驱动:请务必把自己网卡对应的驱动编译进内核,常用的网卡是realtek 8139,以下就是这种网卡的配置,
Device Drivers---> Networking support---> Ethernet (10 or 100Mbit) --->
3.4 USB支持
Device Drivers ---> USB support ---><*> USB Mass Storage support
Device Drivers -> USB support ->USB HID Boot Protocol drivers ->
[ M ] USB HIDBP Keyboard support
[ M ] USB HIDBP Mouse support
必须选,否则不支持USB鼠标和USB键盘
3.5 CDROM支持
Device Drivers --->
<*> ATA/ATAPI/MFM/RLL support
<*> Intel PIIXn chipsets support
如果这一项不选则升级内核后无法挂载CDROM。 (根据你的CDROM类型自行选择)
3.6 声卡驱动Sound card support ,也要选择自己声卡对应的驱动编译进内核,比较普遍的声卡是AC97,以下就是这种声卡的配置。
关键是把Sound card support 以及 Advanced Linux Sound Architecture 里面的选项选成模块(M)
Device Drivers ---> Sound --->
<*> Sound card support
Advanced Linux Sound Architecture --->
<*> Advanced Linux Sound Architecture
<*> Sequencer support
< > Sequencer dummy client
<*> OSS Mixer API
<*> OSS PCM (digital audio) API[*] OSS Sequencer API
<*> RTC Timer support
PCI devices --->
<*> Intel/SiS/nVidia/AMD/ALi AC97 Controller
<*> (Creative) Ensoniq AudioPCI 1371/1373 (虚拟机)
Open Sound System --->
< > Open Sound System (DEPRECATED)
可以选上新支持的模块Advanced Linux Sound Architecture ,至于旧的Open Sound System 模块就不要再选了。
3.7 文件系统
请务必要选中ext3文件系统,
File systems--->
[*] Ext3 journalling file system support
[*] Ext3 Security Labels
[*] JBD (ext3) debugging support
File Systems --->Psedo File Systems --->
[ * ] devfs support (OBSOLETE)
[ * ] Automatically mount at boot
配置内核是大多数新手编译内核时最大的难点,只要将以上选项编译进内核,成功的机会是大大的。
4. 修改相应文件已适应2.6内核
4.1 grub.conf
这里要说明下关于/boot/grub/grub.conf这个文件,我看到网上有的说要修改grub.conf这个文件,去掉ro root=LABEL=/.我没有修改,直接就重启,成功进入运行内核.另外,我需要说明一点,RH 9.0的grub.conf较Fedora的缺少"rhgb".如果重启后出现问题修改成 ro root=LABEL=/dev/hda10(hda10是根据自己的机子决定)
4.2 支持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=$
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的用户态辅助工具包hotplug-2004_09_23.tar.gz. 解开这个包以后,直接"make install"就可以了.它将产生/etc/hotplug/配置目录.我的配置文件需要修改的地方只有
[ -r /proc/ksyms ] && cat /proc/ksyms
4.3 体验sysfs
首先, 创建目录/sys:
# mkdir /sys
然后, 按照下列步骤修改启动脚本/etc/rc.sysinit文件:
o 找到行: mount -f /proc", 在下面增加:
if [ "$KERNELVER" = "2.6" ]; then
mount -f /sys
fi
o 找到行:
如果是RH 9.0,就是action $"Mounting proc filesystem: " mount -n -t proc /proc /proc
如果是Fedora,就是action $"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
最后, 修改/etc/init.d/halt脚本中的halt_get_remaining函数:
将:
awk '$2 ~ /^\/$|^\/proc|^\/dev/{next}
改为:
awk '$2 ~ /^\/$|^\/proc|^\/sys|^\/dev/{next}
4.4 支持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
如果不做这样的修改, 那么使用USB-1.1 host控制器的机器在启动内核的时候将着不到相应的驱动模块.
支持USB键盘的模块名字也从keybdev变为usbkbd, 支持USB鼠标的模块名字也从mousedev改为usbmouse.
因此, 我们必需修改启动脚本/etc/rc.sysinit文件. 同时为了兼容原有的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
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 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
action $"Initializing USB keyboard: " modprobe $KEYBDEV_NAME 2> /dev/null
action $"Initializing USB mouse: " modprobe $MOUSEDEV_NAME 2> /dev/null
fi