专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Linux » linux内核升级:Linux 2.4->2.6内核升级指南 »正文

linux内核升级:Linux 2.4->2.6内核升级指南

来源: 发布时间:星期四, 2008年12月4日 浏览:45次 评论:0
前言: -2.6.x内核发布后, 坛子里兄弟们肯定都迫不及待地要升级原有2.4.x内核. 但是由于和2.6.x内核配套系统并没有相应来得及更新, 升级过程会碰到很多问题, 因此觉得有必要把我经验和大家share下:-) XD们以后碰到类似问题时, 请先阅读本文, 而不要上来就盲目发帖.

ps, you are welcome to fix me.

1. 备份重要数据

这是个好习惯,就不用多说了:-)

2. 最新2.6.x内核源码包

这个当然要到官方网站WebSitewww.kernel.org或者它mirror站点去了, 最好别到那些unknown网站WebSite去下, 那些源码包有可能被恶意做了手脚. 最新-2.***.tar.bz2源码包大概有33M左右. 时候可以泡杯coffee, 然后点根烟......

在/usr/src/目录下解开源码包, 得到源代码目录/usr/src/linux-2.***/. 在对kernel做任何事情的前, 建议你先看下它README文件和Documentation/Changes文件, 从中你会得到不少有用信息. 这些信息会让你在随后升级过程避免很多不必要麻烦.

在文档Documentation/Changes中给出了欲成功地升级到kernel-2.6.x所需最小系统软件Software要求, 比如对于kernel-2.***是这样:

o Gnu C 2.95.3 # gcc --version
o Gnu make 3.79.1 # make --version
o binutils 2.12 # ld -v
o util-linux 2.10o # fdformat --version
o module-init-tools 0.9.10 # depmod -V
o e2fsprogs 1.29 # tune2fs
o jfsutils 1.1.3 # fsck.jfs -V
o reiserfsprogs 3.6.3 # reiserfsck -V 2>&1|grep reiserfsprogs
o xfsprogs 2.6.0 # xfs_db -V
o pcmcia-cs 3.1.21 # cardmgr -V
o quota-tools 3.09 # quota -V
o PPP 2.4.0 # pppd --version
o isdn4k-utils 3.1pre1 # isdnctrl 2>&1|grep version
o nfs-utils 1.0.5 # showmount --version
o procps 3.2.0 # ps --version
o oprofile 0.5.3 # oprofiled --version

对于RH8/9用户而言, 上述要求基本上都能满足. 大概只有两个需要更新: modutils工具包和mkinitrd.

3. 安装module-init-tools-3.0.tar.gz工具包

linux-2.6.x内核module处理过程有所改变(很多原先在用户态下由modutils处理工作都放到内核里去完成了), 因此2.4.x下modutils工具包已经不在适合新2.6.x内核, 必需将其升级到module-init-tools工具包. 该工具包最新版本是3.0(ps, 该工具包版本从0.9.15下跳到3.0, 其跨度的大...hoho). 可以下载module-init-tools-3.0.tar.gz源码包地方有两个:

o Rusty's Linux Kernel Page: http://www.kernel.org/pub/linux/ker...ools-3.0.tar.gz
o http://www.kernel.org/pub/linux/uti...ools-3.0.tar.gz

接下来, 按照下列步骤安装module-init-tools工具包:

# configure --prefix=/
# make moveold
# make all
# ./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. 但是令人不爽是, 这个生成新配置文件存在BUG, 下面我们将会提到.

4. 更新mkinitrd

可以到站点http://people.redhat.com/arjanv/2.6...1-2.i386.rpm包. 由于mkinitrd包依赖于device-mapper包, 而device-mapper包又倚赖于lvm2包, 因此你还要同时下载device-mapper-1.00.07-1.i386.rpm包和lvm2-2.00.08-2.i386.rpm包.

5. 配置,编译和安装linux-2.6.x内核

新内核在Makefile方面改动很大, "make menuconfig"和"make xconfig"继续存在, 但是"make xconfig"被改写了, 不再使用原来Tcl/Tk语言, 而是基于QT库了. 新增加了"make gconfig", 它是基于GTK库. "make xconfig"和"make gconfig"比原来更强大而且更易于使用了. 但不幸是, 它们好像还不太稳定......因此, 还是使用我最喜欢"make menuconfig"吧:-)

有关新内核配置想提几点:

o 有关"Loadable Module support"选项, 定要选上"Module unloading"和"Automatic kernel module loading"这两个选项.
o 有关"Processor type and features"选项, 定要选上"Preemptible Kernel"选项, 这是2.6.x内核优于2.4.x内核重要原因的.
o 有关"Block Devices"配置, 定要选上对loopback和ramdisk支持.
o 有关"Multi-device support(RAID and LVM)", 要选上"device mapper".
o 有关"Input device support", 记得要选上"Keyboards"和"Mice"支持.
o 有关"Graphics support", 要选上对frame buffer支持.
o 有关ALSA, 要选上"OSS API emulation"选项. OSS可以不用了.
o 有关USB, 能选都选上吧:-)
o 有关文件系统, 选上常用那几种就可以了. 如果要体验sysfs话, 要选上对sysfs支持.

配制好内核后, 就可以直接编译了, "make dep"这步已经显示地需要了.

# make bzImage
# make modules
# make modules_
# make

上面命令"make "将: (1)把压缩内核映象拷贝到/boot目录下, 并创建相应.map符号链接; (2)修改bootloader配置文件; (3)mkinitrd创建内核initrd映象. 对于GRUB而言, 将在/boot/grub/grub.conf配置文件增加如下类似配置行:

title Red Hat Linux (2.***)
root(hd0, 1)
kernel /boot/vmlinuz-2.*** ro root=LABEL=/
initrd /boot/initrd-2.***.img

不幸是, 新内核并不识别"root=LABEL=/"这个启动参数. 如果现在你就重新启动新内核话, 将发生kernel panic. 因此, 必需把这个"root=LABEL=/"启动参数去掉, 就OK了.

到这里, 你已经可以重启机器, 用kernel-2.***启动了. 当然, 多半你不会成功, 不是没鼠标就是没键盘:-)

6. 支持Hotplug

当然, 首先要在内核配置时配置了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}
[ "$KERNELVER" = "2.6" ]; then
#
# This is kernel-2.6.x
#
KSYMS=/proc/kallsyms

#
# 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 "就可以了. 它将产生/etc/hotplug/配置目录.

7. 体验sysfs

首先, 创建目录/sys:

# mkdir /sys

然后, 按照下列步骤修改启动脚本/etc/rc.sysinit文件:

o 找到行: mount -f /proc", 在下面增加:

[ "$KERNELVER" = "2.6" ]; then
mount -f /sys
fi

o 找到行: action $"Mounting proc filesystem: " mount -n -t proc /proc /proc, 在其下面增加这样行:

#
# Mount /sys for kernel-2.6.x
#
[ "$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_reing:

将:
awk '$2 ~ /^\/$|^\/proc|^\/dev/{next}
改为:
awk '$2 ~ /^\/$|^\/proc|^\/sys|^\/dev/{next}

8. 支持USB设备

linux-2.6.xUSB驱动模块名字已经改变了, 所以由此引起问题多多......, 对应于USB-2.0host控制器内核模块名字仍然是ehci-hcd, 对应USB-1.1host控制器内核模块名字已经从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}
[ "$KERNELVER" = "2.6" ]; then
#
# This is kernel-2.6.x
#
KSYMS=/proc/kallsyms
KEYBDEV_NAME=usbkbd
MOUSEDEV_NAME=usbmouse

#
# 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=
[ $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 erface: " 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=
[ $usb = "1" ]; then
[ "$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 erface: " modprobe hid 2> /dev/null

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 erface: " 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

好了, 到此为止, 我们应该可以重新启动机器了, 赶快去体验最新kernel-2.***吧:-)

9. 其它

o 有关在linux-2.6.x系统上不能正常使用RPM命令问题, 请参阅文档[2]和[6].
o 有关声卡问题, 可以参阅参考文档[2]和[6].
o 有关在linux-2.6.x系统上运行vmware问题, 请参阅参考文档[2]和[6].

10. 参考文档

[1] Kernel 2.6.x, the breed: http://linuxbooks.pananix.com/kernel2.6.html
[2] Upgrading RH9 to 2.6.0-test4: http://www.fearthecow.net/index.pl?...amp;page=kernel
[3] HowTo Upgrade To The 2.6 Kernel: http://kerneltrap.org/node/view/799
[4] Building Linux Kernel 2.6 on Red Hat 8: http://www.sabalsoftware.com/articl...26OnRedhat8.php
[5] Migrating to Linux kernel 2.6 on recent Redhat systems: http://linux-sxs.org/upgrading/migration26.html
[6] Migrating to Linux Kernel 2.6: http://thomer.com/linux/migrate-to-2.6.html
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: