Aug 15 2013

centos 5.x 升级内核到 3.0 以上

Category: 技术ssmax @ 15:17:32

公司的机器终于有申请到ssd硬盘了,昨天插上去服务器,但是发现centos 5.x 虽然可以支持ext4,但是ext4的模块不支持TRIM(discard)功能,用hdpram虽然可以手动TRIM,但不是太保险,查了一下资料,内核太老了,5.x一直是2.6.18.x的内核,centos 6 就可以完美支持TRIM了,但是centos 5.x 不能直接在线升级到 6 ,必须重装系统,不想弄到系统重装这么大件事。

故继续翻资料,发现TRIM支持比较好要到3.0的内核了,好,试试编译内核吧,很久没有玩过了。

1、首先到 https://www.kernel.org/ 找合适的内核,longterm 版本的内核有 2.6.32 (centos 6 就是这个),2.6.34,3.0.90 等等,一不做二不休,直接搞到3.0以上吧,下载内核,解压

2、准备必要的编译工具:

> yum install gcc ncurses ncurses-devel 

2、进入解压目录,要配置内核了,我选择用原来centos 5 的一些内核参数

> cp /boot/config-2.6.18-348.12.1.el5 ./.config
> make oldconfig
> 全部回车,选择默认,或者按照你们自己的需要选择

3、config完毕后,需要手动改写几个参数,vim .config
CONFIG_SAMPLES=n

这个参数可以避免编译阶段 samples/hidraw/hid-example.c编译失败,samples里面有引用当前环境的一些headers

CONFIG_SYSFS_DEPRECATED=y
CONFIG_SYSFS_DEPRECATED_V2=y

这两个参数让内核使用旧版的sysfs,由于centos的确太tmd老了,如果不选择这个选项,文件系统等等无法直接装载

4、修改好.config 文件之后,就要编译了

> make 
#等好多分钟
> make modules_install
# 安装 /lib/modules 目录
> make install
# 安装 vmlinux 到 /boot
> 修改 /boot/grub/menu.lst 使default选择新内核启动

完成了之后就reboot吧。。

5、reboot之后,看看各个服务的启动情况,本来很happy,但是突然看到 udev的一个超时报错

udevd-event: wait_for_sysfs waitnig for xxxxxxx ioerr_cnt failed

这个是怎么回事呢。。。
继续翻资料,发现还是udev太老的问题,新版本已经不需要这些事件了。修改udev配置文件
/etc/udev/rules.d/05-udev-early.rules

#ACTION=="add", SUBSYSTEM=="scsi", WAIT_FOR_SYSFS="ioerr_cnt"
# 注释掉上面这行,加上下面这行
ACTION=="add", SUBSYSTEM=="scsi", KERNEL=="[0-9]*:[0-9]*", WAIT_FOR_SYSFS="ioerr_cnt"

重启,错误消失,但是不知道对scsi硬盘控制器会有什么不良影响,以上流程在vmware(scsi控制器),dell 2950 上面的centos 5.9最新版本试验通过。。。
安装的是3.0.90版本,安装完了以后再去查,发现已经更新到3.0.91 了,太tmd勤快了。

最后一点,记得在yum.conf里面去掉kernel*的检查,要不啥时候update一下就不知不觉升级了2.6.18的内核。。。
exclude=kernel*

各位折腾正式服务器环境之前敬请测试。