介绍

openstack平台需要使用各种Linux发行版模板镜像,其制作方法主要有两种,要么是基于各大Linux发行版ISO光盘手动制作,要么是使用官方提供的模板镜像再做修改

之前制作的openstack centos6.5模板镜像,其内核为2.6.xx,现需要升级其内核到3.18.x,使用这里提供的rpm包kernel-ml-3.18.3-1.el6.elrepo.x86_64.rpm升级内核遇到了下面几个问题,下面谈谈我的解决过程

问题

问题1.virtio驱动加载问题

使用上面提到的rpm包升级kernel之后,重启虚拟机出现错误:

FATAL: Module scsi_wait_scan not found.

再进一步测试,就会发现,在物理机上升级内核,一切ok!

原因是KVM虚拟机使用了virtio_blk.ko这个半虚拟化驱动模块来使虚拟机支持scsi设备,而物理机升级时用不到virtio驱动,自然不会有问题,在kernel3.13版本以前,可以使用"blk_init_queue"这个函数加载virtio_blk.ko模块,而在kernel3.13版本之后,这个函数名变为"blk_mq_init_queue", 此函数名位于"/usr/share/dracut/modules.d/90kernel-modules/installkernel"文件中,可以看到,centos6.5系统中的函数名为"blk_init_queue"

centos6系统中使用Dracut这个程序生成内核的initramfs.img, 而Dracut程序使用的是旧函数"blk_init_queue"(installkernel文件中),因此升级3.18.x内核后,Dracut程序生成的initramfs.img无法包含virtio_blk.ko模块,造成虚拟机启动报错

解决问题的关键在于要确保virtio_blk.ko能够被加载

如果我们单纯是需要解决升级内核后启动失败问题,那么就没必要编译内核rpm包,直接下载文章开始提到的内核rpm包,然后使用下面的步骤解决启动问题

#安装rpm包
rpm -ivh kernel-ml-3.18.3-1.el6.elrepo.x86_64.rpm #添加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 #重启系统
注:以上步骤可以解决虚拟机启动问题,如果你不需要制作centos6.5(3.18.x kernel)模板镜像,那么就不需要进行后续步骤
问题2.云硬盘热拔插问题

解决了虚拟机启动问题,如果需要制作centos6.5(3.18kernel)模板镜像,那上面的方法是不行的,在openstack中使用此模板启动虚拟机后,其云硬盘的动态加载、移除功能无法使用,centos6.5(2.6.xx kernel)是可以动态加载云硬盘的, 检查3.18版本内核的配置文件/boot/config-3.18.3-1.el6.elrepo.x86_64(安装完kernel rpm包,就会生成此文件),其中并没有热拔插功能支持模块的配置项

问题3. 挂载ceph文件系统

2.6.xx内核是不支持ceph文件系统挂载,Linux kernel从3.10版本开始支持ceph文件系统挂载,假如我们的模板镜像需要挂载ceph文件系统,那么也需要确保内核包含cephfs支持相关模块

制作centos6.5(3.18 kernel)模板镜像

1.准备一台虚拟机

首先需要有一个centos6.5(2.6.xx kernel)虚拟机,为了使编译出来的内核rpm包适应openstack虚拟机环境,最好使用一台KVM虚拟机,以下步骤都在此虚拟机环境中操作,我们需要在此环境中编译制作一个3.18 kernel的rpm包

进入虚拟机, 为了解决[问题1],需要修改文件/usr/share/dracut/modules.d/90kernel-modules/installkernel

vim /usr/share/dracut/modules.d/90kernel-modules/installkernel
#第四行中的"blk_init_queue" 替换为"blk_mq_init_queue"
2.下载Linux内核源码(3.18)
#安装编译环境
yum groupinstall "Development Tools"
yum install ncurses-devel #下载源码
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.12.tar.xz
tar -xf linux-3.18..tar.xz -C /usr/src/
cd /usr/src/linux-3.18./
3.添加编译模块

我们在系统原有的内核(2.6.xx)配置文件的基础上建立新的编译选项,所以可以复制系统现有的配置文件/boot/config-2.6.32-431.23.3.el6.x86_64到源码目录/usr/src/linux-3.18.12下,再添加我们需要的编译参数来编译3.18.x内核

#复制配置文件到源码解压目录
cp /boot/config-2.6.32-431.23.3.el6.x86_64 /usr/src/linux-3.18-12/.config #支持热拔插模块需要的参数
CONFIG_HOTPLUG_PCI=y
CONFIG_HOTPLUG_PCI_FAKE=m
CONFIG_HOTPLUG_PCI_ACPI=y
CONFIG_HOTPLUG_PCI_ACPI_IBM=m #支持ceph文件系统挂载需要的参数
CONFIG_CEPH_LIB=m
CONFIG_CEPH_FS=m
CONFIG_CEPH_FSCACHE=y
CONFIG_CEPH_FS_POSIX_ACL=y
4.制作内核rpm包

接下来需要根据上一步骤配置的.config文件编译kernel,生成rpm包

#加载配置文件
sh -c 'yes "" | make oldconfig' #制作rpm包
make rpm #生成的内核rpm包目录位于/root/rpmbuild/RPMS/x86_64下 
6.修改grub.conf
default=0    #default为新内核
timeout=
splashimage=(hd0,)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (3.18.-.el6.elrepo.x86_64)
root (hd0,)
kernel /vmlinuz-3.18.-.el6.elrepo.x86_64 ...
7.重启系统

编译制作Linux 3.18内核rpm包(升级centos6.x虚拟机内核)的更多相关文章

  1. 编译一个Centos6.4下可用的内核rpm升级包-3.8.13内核rpm包

    在Centos6.4下进行内核升级,采用内核源码的升级方式比较简单,但是需要升级的机器多的情况下进行内核升级就比较麻烦,并且编译内核的速度依赖于机器的性能,一般需要20分钟,而通过rpm内核包的方式进 ...

  2. Centos 中如何快速定制二进制的内核RPM 包

    随着Linux服务器越来越多了,底层系统内核想要保持版本统一就需要定制专门的二进制安装包来便捷的升级和管理. RedHat系那当然就是使用rpmbuild来做定制化管理了. 今天我们分俩个部分(roo ...

  3. Red Hat 系列如何快速定制二进制内核 RPM 包?

    随着Linux服务器越来越多了,底层系统内核想要保持版本统一就需要定制专门的二进制安装包来便捷的升级和管理. RedHat系那当然就是使用rpmbuild来做定制化管理了. 今天我们分俩个部分(roo ...

  4. [转帖]Linux学习笔记之rpm包管理功能全解

    Linux学习笔记之rpm包管理功能全解 https://www.cnblogs.com/JetpropelledSnake/p/11177277.html rpm 的管理命令 之前学习过 yum 的 ...

  5. Linux系统手动安装rpm包依赖关系分析(以Kernel升级为例)

    有在Linux系统中安装软件的经历的人都知道,在Linux系统中手动安装软件不想在Windows下安装软件那么方便,直接双击,然后下一步下一步就可以把软件成功的装入到系统中,而在Linux系统中,安装 ...

  6. linux下正确卸载rpm包

    linux下正确卸载rpm包 rpm -qa | grep -i ntp 执行结果: [root@bogon elasticsearch-head]# rpm -qa | grep -i ntp fo ...

  7. CentOS 7 内核RPM方式升级

    RPM包下载地址: https://elrepo.org/linux/kernel/el7/x86_64/RPMS/ 选择lt版本(长期支持) #下载内核RPM包,这里是kernel-lt-4.4.- ...

  8. linux的基本操作(RPM包或者安装源码包)

    RPM包或者安装源码包 在windows下安装一个软件很轻松,只要双击.exe的文件,安装提示连续“下一步”即可,然而linux系统下安装一个软件似乎并不那么轻松了,因为我们不是在图形界面下.所以你要 ...

  9. 【Linux相识相知】rpm包管理

    我们日常在使用Windows的时候,如果要安装某个软件,最简单的方法就是在程序包的官网直接下载软件包到本地,一般是以.exe或者.msi格式的文件,然后一直下一步下一步就能安装成功了,但是在使用lin ...

随机推荐

  1. redis-查看日志

    转: redis-查看日志 redis在默认情况下,是不会生成日志文件的,所以需要配置 配置方法: 1.首先找到redis的配置文件 2.打开配置文件,找到logfile(可能有多个logfile,认 ...

  2. Spring cloud微服务安全实战-7-8ELK+SpringBoot环境搭建

    采集不可聚合的离散的.日志信息的e ELK是三个系统的简称 LogStash:用来做日志的收集.过滤.格式转换 Kibana:和普罗米修斯的grafana一个意思.主要用来展示数据. 用docker来 ...

  3. [LeetCode] 452. Minimum Number of Arrows to Burst Balloons 最少箭数爆气球

    There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided ...

  4. 用浏览器控制台抓取shodan、搜索引擎、zone-h的结果

    0x00 前言 大部分内容来自参考连接的内容,只是一种爬取内容的思路. 在很久以前自己会有爬取zone-h做目标测试的需求,但是总是有各种反爬限制.而且个别网址还有前端自动生成内容的功能,使用Java ...

  5. Django:前后端分离 djangorestframework开发API接口 serializer序列化认证组件

    参考:https://blog.csdn.net/zhangmengran/article/details/84887206 目的: 使用serializer序列化器将QuerySet数据序列化为js ...

  6. C#基于RabbitMQ实现客户端之间消息通讯实战演练

    一.背景介绍和描述 MQ消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.何时需要消息队列?当你需要使用 ...

  7. TIBCO Jaspersoft Studio 报表软件使用教程

    Detail 1里面放置动态内容框可以循环遍历数据 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn ...

  8. 使用qmlscene命令来快速查看编辑的qml文件的实际效果图

    一片金灿灿的树叶落下来,仿佛飞来了许许多多翩翩起舞的黄蝴蝶. Qt SDK 提供 了 一个 命令行 环境, 给那些 有 特殊 需求 的 开发者, 方便 他们 在 不 使用 Qt Creator 集成 ...

  9. 史上最详细bitbucket入门手册,手把手操作指南

    老大要我去调研一下有什么好用的免费软件版本管理工具,有利于小团队开发的.我第一个想到的就是git,经常在git下东西,听说它的代码仓库好用,于是就注册了一个github的账号,创建仓库的时候才发现只能 ...

  10. js 获取服务端时间,并实现时钟

    本例子以vue语法伪代码书写: 1,获取服务端北京时间 getRealTime() { let that = this; var xhr = new XMLHttpRequest(); if( !xh ...