升级CentOS 6的Kernel到v3.x
最近,由于某种需求,对CentOS 6.6 的kernel进行了一次升级。我选用的是标准Linux kernel v3.19.8。升级过程遇到了一些问题,记录下来,以备以后查询。
1. initramfs 的问题
编译完新的kernel并安装之后,发现无法启动,屏幕上不停的在打印:
FATAL: Module scsi_wait_scan not found
在网上搜索了一下,发现原因在于 dracut 版本过老,和 kernel 不匹配。从Linux kernel v3.6开始,scsi_wait_scan已经被移除,但是 CentOS6.6 的 dracut 会给 initramfs image 的 /init script 加入 "modeprobe scsi_wait_scan"。
解决方案就是修改 /usr/share/dracut/modules.d/90kernel-modules/installkernel,移除 scsi_wait_scan,并重新生成initramfs image。
另外,由于我是在一台开发机上编译的 kernel,然后再拿到另外一台目标机上面使用。在开发机上面测试OK的kernel,居然在目标机上面启动不了。通过 dracut 的debug参数来调试启动过程(给kernel的boot command line增加了:rdinitdebug, rdinfo和rdshell三个启动参数,移除了rhgb和quiet参数)后,发现实际上是没有找到 root device。经过检查是有一个ahci.ko没有包进 initramfs,导致硬盘device没有找到(我的开发机不需要ahci!)。需要修改 /usr/share/dracut/modules.d/90kernel-modules/installkernel 的module列表,参考了CentOS 7.1的列表进行了调整,还增加了显卡的驱动模块,OK了。
由此产生了另外一个疑问,Linux发行版是怎么让 initramfs 适应不同的机器呢?我的猜测是,它会在安装的时候重新生成一个initramfs image。我已经在CentOS的 /var/log 目录下找到了证据;该目录下有一个 dracut.log 文件,记录了生成 initramfs 的过程。从这个log文件可以看到,不仅是第一次安装的时候,后面每次升级Kernel的时候,都会重新生成一个 initramfs image。
2. driver 模块的size问题
安装完成后,发现module的size比原来的size大了好多。比较了某个相同的模块,差距有10倍。我试着对两个不同版本的模块做了strip,size变成一样了。怀疑是有debug 信息跑进模块里面了。通过查找发现是 CONFIG_DEBUG_INFO 被设置成了“Y”(该配置在 make menuconfig中的位置是 ->Kernel hacking->Compile-time checks and compiler options -> Compile the kernel with debug info)。该配置导致的结果就是使用"gcc -g"来编译kernel和module!
我是从发行版的config直接通过make oldconfig升级上来的,没有动过这个设定。打开CentOS 6.6里面包含的那个config文件,发现居然是“Y”。这是为什么?不明白 CentOS 的开发者为什么这样干。反正将它设成“N”就OK了,size正常。
阅读(2796) | 评论(0) | 转发(0) |