linux-2.6.x内核发布后,与2.6.x内核配套的系统程序并没有相应的来得及更新, 升级过程会碰到很多问题。虽然网上已有很多关于升级到2.6.x文章,但总是有些细节没有作很好的总结,因此撰写本文将我的经验与大家分享一下。我是在虚拟机上将Linux系统从Redhat
9.0
升
级到
2.6.5
内核,虚拟机软件为:VMware Workstation 4.0.5 build-6030。
准备工作
1、做好重要数据的备份工作,这是一个好习惯。
2、下载最新的2.6.x内核源码包
所有Linux内核的官方版本可以在http://www.kernel.org/ 找到。内核2.6.5 具体的下载地址是:http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.5.tar.gz。
3、升级module-init-tools软件包
要编译与正常运行新的内核你需要升级一些软件包,这些信息在源码目录下的Documentation/Changes文件中,请根据你的实际情况选择升级。
特别要说明的是,因为2.4.x下的modutils工具包已经不在适合新的2.6.x内核, 必需将其升级到module-init-tools工具包.,我下载module-init-tools-3.0.tar.gz源码包的地方是:http://www.kernel.org/pub/linux/kernel/people/rusty/modules/module-init-tools-3.0.tar.gz
接下来, 按照下列步骤安装module-init-tools工具包:
tar -zxvf module-init-tools-3.0.tar.gz
在module-init-tools-3.0目录下,
# configure --prefix=/
# make moveold
# make all install
# ./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.
如果你使用devfs系统你还需要复制modprobe.devfs 到/etc目录下。
当你升级完相关软件包之后,准备工作就算完成了,下面我们将进入到编译阶段。
配置,编译和安装linux-2.6.x内核
2.6的build系统与2.4有很大的不同,实际上是更加简单与方便了。
将linux-2.6.5.tar.gz 复制到 /usr/src/ 下
tar -zxvf linux-2.6.5.tar.gz
cd linux-2.6.5
如果是新内核没有编译过,就不需要用make mrproper 把原来编译产生的垃圾删除
make menuconfig,进入内核选项卡。选择相应的配置时,有三种选择:
Y--将该功能编译进内核
N--不将该功能编译进内核
M--将该功能编译成可以在需要时动态插入到内核中的模块
在编译内核的过程中,最烦杂的事情就是这步配置工作了,很多新手都不清楚到底该如何选取这些选项。实际上在配置时,大部分选项可以使用其缺省值,只有小部分需要根据用户不同的需要选择。选择的原则是将与内核其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不要选;与内核关心紧密而且经常使用的部分功能代码直接编译到内核中。关于这方面,有很多文章,就不作详细介绍了。
其中要注意的是:RH9.0使用的是ext3文件系统,要把ext3 fs编译进内核。如果系统是SCSI硬盘,并且root fs在SCSI硬盘上,配置内核时也要把SCSI装置支持编译进内核。总之,升级后的系统需要什么,就要把相应的内容编译进内核。
· make
· make modules
· make modules_install
· make install
该命令是最近的从2.5.69内核(按照内核发布时间算)开始才有的选项,他可以帮你完成很多东西: (1)把压缩内核映象拷贝到/boot目录下, 并创建相应的System.map符号链接; (2)修改bootloader的配置文件; (3)调用mkinitrd程序创建内核的initrd映象. 对于GRUB而言, 将在/boot/grub/grub.conf配置文件增加如下类似的配置行:
title Red Hat Linux (2.6.5)
root(hd0, 0)
kernel /boot/vmlinuz-2.6.5 ro root=LABEL=/
initrd /boot/initrd-2.6.5.img
注意:一定要先编译并安装模块,再运行make install;否则可能会出现错误,导致升级失败!
修改/boot/grub/grub.conf配置文件。新内核并不识别"root=LABEL=/"这个启动参数, 如果现在你就重新启动新内核的话, 将发生kernel panic错误。因此,必需把这个" LABEL=/"替换成你真实的根分区,就OK了。
如何知道你的根目录""在哪个partition上? 命令为: # df
以下是偶机器的部分输出:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda2 3834496 1609188 2030520 45% /
/dev/hda1 101089 15154 80716 16% /boot
none 46548 0 46548 0% /dev/shm
可见,我的根目录在/dev/hda2上,需要将启动参数改为 "root=/dev/hda2"。
重启便可以看见kernel-2.6.5了。