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是通过"

"文件中给出的函数识别的,如下

CentOS 6内核升级到Kernel 3.x中出现的两个问题

在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 的下载地址请点这里

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/16377.html