Linux内核升级
测试平台: RHEL5
内核版本: 2.6.18
1.首先去官网下载一个比较稳定的内核版本,如2.6.38.
2.将其解压到/usr/src目录下,解压后会产生一个内核目录.
3.进入内核目录.
4.配置内核
#make menuconfig ARCH=x86
友情提示:可将原生系统代码目录下的.config拷贝至新内核代码目录下做为默认的配置项。
5.执行编译
#make
6.编译模块
#make modules
实际上执行make时,已经生成了模块,此处应该可以省略.
7.执行安装
#make modules_install
#make install
注意事项:
一定要先安装modules,在/lib/modules/目录下产生该内核模块的目录;
执行安装后,会自动将内核文件复制到/boot目录下,并更新grub;
8.重启系统,在启动界面选择新的内核.
问题及解决方案
问题1:
启动时出现严重错误,不能正常启动.
mount: could not find filesystem '/dev/root'
原因:
initrd是旧版本mkinitrd生成的,需要加入对旧版sysfs路径的支持.
解决方法:
General setup -->
[*] enable deprecated sysfs features to support old userspace tools
或者直接修改.config文件中的
CONFIG_SYSFS_DEPRECATED=y
CONFIG_SYSFS_DEPRECATED_V2=y
默认该选项为not set,被注释掉的,将其改为y,重新编译,重启即可正常。
如果没有找到CONFIG_SYSFS_DEPRECATED_V2,那么只配置CONFIG_SYSFS_DEPRECATED=y
在编译的时候会提示是否编译V2选项,选择YES即可;
问题2:
新内核启动时,提示:
insmod: error inserting '/lib/dm-region-hash.ko': -1 File exists
原因:
模块被加载了两次,第2次加载时会提示文件已存在,虽然并不影响系统正常使用。
解决方法:
1.解压initrd文件
[root@bogon ~]# cp /boot/initrd-2.6.38.img /tmp
[root@bogon ~]# cd /tmp/
[root@bogon tmp]# ls
initrd-2.6.38.img
[root@bogon tmp]# mkdir newinitrd
[root@bogon tmp]# cd newinitrd/
[root@bogon newinitrd]# zcat ../initrd-2.6.38.img |cpio -i
11537 blocks(此行内容是上条命令的系统回应)
[root@bogon newinitrd]# ls
bin dev etc init lib proc sbin sys sysroot
2.编辑init,删掉其中重复的四行中的两行
echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko
echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko
3.重新打包initrd
[root@bogon newinitrd]# find .|cpio -c -o > ../initrd
11538 blocks
[root@bogon newinitrd]# cd ..
[root@bogon tmp]# gzip -9 < initrd > initrd.img
[root@bogon tmp]# ls
initrd-2.6.38.img initrd initrd.img newinitrd
然后把重新打包好的initrd.img拷贝到/boot,并更改grub.conf里边的initrd-2.6.38.img为initrd.img就可以了。
问题3:
执行make install(安装)的时候出现了:
WARNING: No module ata_piix found
解决方案:
Device Drivers -->
SCSI device support -->
SCSCI low-level drivers -->
[M] Serial ATA (SATA) support -->
[M] Intel PIIX/ICH SATA support。
注意事项:
那两项一定要配置成为M(模块)才不会出错;