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 ...

Ubuntu 13.10 (Saucy Salamander) 内核已升级至 Linux Kernel 3.10 RC5

Linux Kernel 3.4.62 LTS 现已经提供下载  

如何在Ubuntu 13.10上安装Linux内核 3.12  

如何在Ubuntu 14.10,Ubuntu 14.04及其衍生版本安装 3.16.7 CKT2内核  

Linux Kernel 的详细介绍:请点这里
Linux Kernel 的下载地址:请点这里

相关内容