测试平台: 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(模块)才不会出错;