CentOS 6内核升级到Kernel 3.x中出现的两个问题
问题:
之前制作的openstack CentOS6.5模板镜像,其内核为2.6.xx,现需要制作一个内核为3.x的centos6镜像,使用rpm包kernel-ml-3.18.3-1.el6.elrepo.x86_64.rpm升级内核,重启虚拟机出现错误:
FATAL: Module scsi_wait_scan not found.
如果你再进一步测试,就会发现,在物理机上升级内核,一切ok!
注:以下操作都是在kvm虚拟机内进行,物理机升级内核不存在这个问题
分析:
1.这个错误的出现是因为KVM中的虚拟机使用了virtio这个半虚拟化驱动来是虚拟机支持scsi设备,而物理机升级时用不到virtio驱动,自然不会有问题
2.centos6系统中使用Dracut这个程序生成系统的initramfs.img ,在内核安装过程中,Dracut识别内核模块virtio_blk.ko是通过"
"文件中给出的函数识别的,如下
在kernel3.13版本以前,Dracut是通过"blk_init_queue"这个函数安装virtio_blk.ko模块,而在kernel3.13版本之后,安装virtio_blk.ko模块需要新函数"blk_mq_init_queue",但是centos6系统中的Dracut程序依然使用旧的函数"blk_init_queue",因此就无法安装virtio_blk.ko 解决问题的关键在于要确保virtio_blk.ko能够被安装
第一种解决方法:
编辑文件/usr/share/dracut/modules.d/90kernel-modules/installkernel
vim /usr/share/dracut/modules.d/90kernel-modules/installkernel
#第四行中的"blk_init_queue" 替换为"blk_mq_init_queue"
然后使用正常的rpm -ivh 方式安装内核包即可
注:另一种解决方案:
这种解决方案虚拟机也能够成功启动,但是不能够进行硬盘的热拔插,比如在宿主机上使用virsh attach/detach 动态为一台虚拟机加载硬盘,必须重启虚拟机才能生效,而第一种解决方法能够进行以后ing盘的hotplug,即热拔插
1.下载安装新版本内核rpm包(3.18)
这里是下载地址
rpm -ivh kernel-ml-3.18.3-1.el6.elrepo.x86_64.rpm
2.解决virtio驱动问题
#添加virtio_blk支持(新建conf文件)
echo 'add_drivers+="virtio_blk"' >/etc/dracut.conf.d/force-vitio_blk-to-ensure-boot.conf
#备份initramfs
cp /boot/initramfs-3.18.3-1.el6.elrepo.x86_64.img /boot/initramfs-3.18.3-1.el6.elrepo.x86_64.img.bak
#重新编译生成initramfs
dracut -f /boot/initramfs-3.18.3-1.el6.elrepo.x86_64.img 3.18.3-1.el6.elrepo.x86_64
3.修改grub.conf
default=0 #default为新内核
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (3.18.3-1.el6.elrepo.x86_64)
root (hd0,0)
kernel /vmlinuz-3.18.3-1.el6.elrepo.x86_64 ...
Linux Kernel 的详细介绍:请点这里
Linux Kernel 的下载地址:请点这里