centos 编译升级内核的方法及问题处理

准备工作:

yum install bzip2 libncurses5-dev kernel-package zlib1g-dev gcc make kernel-package wget module-init-tools procps libncurses5-dev

1,下载内核包linux-2.6.39.3放到/usr/src 目录下

cd /usr/src

tar -xvjf linux-2.6.39.3.tar.bz2 

cd linux-2.6.39.3

make mrproper   清除环境变量,即清除配置文件

make menuconfig 在菜单模式下选择需要编译的内核模块:

initrd是旧版本mkinitrd生成的。如果直接编译可能会出错

出现:mount:could not find filesystem/dev/root’的解决方法

解决方法就是加入对旧版sysfs路径的支持,方法如下:

1)、通过make menuconfig选中以下对应的选项

General setup -->

[*] enable deprecated sysfs features to support old userspace tools

2)、修改.config文件

             修改.config文件中CONFIG_SYSFS_DEPRECATED_V2,将原本被注释掉的

             CONFIG_SYSFS_DEPRECATED_V2 改成CONFIG_SYSFS_DEPRECATED_V2=y

修改这项是因为旧版的mkinitrd及其nash在内核没有CONFIG_SYSFS_DEPRECATED_V2参数时默认使用旧版sysfs 径格式,从而在新内核下无法正确访问/sys内的硬盘信息节点。

然后可以写一个编译的脚本 vim  neihe.sh  在中间加入

#! /bin/sh

  make dep

  make clean  确保所有东西均保持最新状态.

  make -j4 bzImage  生成内核文件

  make modules 编译模块

  make modules_install 安装模块

  make install  安装

安装完成后去 /boot/grub/grub.conf 中把默认启动内核改为0

这样启动的时候可能还会报错的 作如下修改initrd-2.6.39.3initrd-2.6.39.3.imginitrd-2.6.39.3.imginitrd-2.6.39.3.imginitrd-2.6.39.3.imginitrd-2.6.39.3.imginitrd-2.6.39.3.img

1,解压initrd文件

[root@localhost ~]# cp /boot/initrd-2.6.39.3.img /tmp

[root@localhost ~]# cd /tmp/

[root@localhost tmp]# ls

initrd-2.6.39.3.img

[root@localhost tmp]# mkdir newinitrd

[root@localhost tmp]# cd newinitrd/

[root@localhost newinitrd]# zcat ../initrd-2.6.39.3.img |cpio -i

11537 blocks

释放之后看到如下内容

[root@localhost 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-2.6.39.3.img

11538 blocks

[root@bogon newinitrd]# cd ..

[root@bogon tmp]# gzip -9 < initrd-2.6.39.3 > initrd-2.6.39.3.img

[root@bogon tmp]# ls

initrd-2.6.39.3.img              newinitrd

 

好了,initrd.img就是重新打包的initrd了,然后把initrd.img拷贝到/boot,更改grub.conf里边的initrd-2.6.39.3.img

这样“insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists 就不会有了

 

 编译完成后生成linux deb 包,先dpkg -i装image,再装headers 

安装完成以后再update-grub 进入/boot/grub/menu.lst中选择启动的内核项 默认的第一项为0

ps:在编译完成内核后开机可能出现 Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)的错误 在/boot/grub/menu.lst中可以发现新加的内核可能是没有 initrd   /initrd.img-2.6.37.6 未生成的原因不明 可以手动生成 

执行命令 

 mkinitramfs -o /boot/initrd.img-2.6.34.10 2.6.34.10/boot/initrd.img-2.6.34.10是这个启动加载文件的生成路径 2.6.34.10 /lib/modules/2.6.34.10)然后update-grub 再启动新内核就没有问题了

卸载一个已经安装的内核包

debian卸载旧内核要先看看有哪些旧的内核,用命令:

   dpkg --get-selections |grep linux

如果你的内核是以kernel开头的就把上面的linux改成kernel,之后再用

   dpkg --purge --force-remove-essential linux-image-XXX

你可能感兴趣的:(centos,编译内核)