本文出自 “存储之厨” 博客,请务必保留此出处http://xiamachao.blog.51cto.com/10580956/1755354

在基于CentOS平台的工作过程中,难免有时需要升级或者降级内核以验证功能、调试性能或者更新整个系统。

如果从头重新编译一个内核,由于现在内核特性越来越复杂,依赖的库或者工具也不少,加之重新编译耗时不菲,了解更新内核的多种方式就显得尤为必要。

下面根据笔者最近的工作,总结了三种方法,供大家参考。

方法一

如果机器不能联网,可以下载现有内核包到本地机器,直接在本地更新

1.从http://ftp.scientificlinux.org/linux/scientific/7.0/x86_64/updates/security/下载需要的颁布rpm

2. [root@localhost os2]# scp root@192.168.1.64:/home/worker/kernel-3.10.0-123.1.2.el7.x86_64.rpm

root@192.168.1.64's password:

kernel-3.10.0-123.1.2.el7.x86_64.rpm                                         100%   29MB  28.9MB/s   00:00

3.[root@localhost os2]# yum install kernel-3.10.0-123.1.2.el7.x86_64.rpm

Loaded plugins: fastestmirror, langpacks

Examining kernel-3.10.0-123.1.2.el7.x86_64.rpm: kernel-3.10.0-123.1.2.el7.x86_64

Marking kernel-3.10.0-123.1.2.el7.x86_64.rpm to be installed

Resolving Dependencies

--> Running transaction check

---> Package kernel.x86_64 0:3.10.0-123.1.2.el7 will be installed

--> Finished Dependency Resolution

epel/x86_64/metalink                                                                    | 5.2 kB  00:00:00

epel/x86_64                                                                           | 4.3 kB  00:00:01

epel/x86_64/updateinfo                                                                  | 517 kB  00:00:01

epel/x86_64/primary_db                                                                  | 4.0 MB  00:02:36

....

方法二

如果机器已经联网,直接利用包管理工具更新,需要注意的是现在3.0以上的内核引入了签名机制,需要导入签名的key,参考步骤如下:

1、导入key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

当然,如果已经修改了repo的gpgcheck=0也可以不导入key

2、安装elrepo的yum源

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

3、安装内核
在yum的ELRepo源中,有mainline颁布的,可以这样安装:
 yum --enablerepo=elrepo-kernel install  kernel-ml-devel kernel-ml -y

当然也可以安装long term的:

yum --enablerepo=elrepo-kernel  install  kernel-lt -y

其它:

http://elrepo.org/linux/kernel/el6/x86_64/RPMS/
[root@server-mysql yum.repos.d]# yum --enablerepo=elrepo-kernel  list  |grep kernel*
Unable to read consumer identity
* elrepo-kernel: mirrors.tuna.tsinghua.edu.cn
abrt-addon-kerneloops.x86_64 2.0.-.el6 @anaconda-RedHatEnterpriseLinux-.x86_64/6.3
dracut-kernel.noarch -.el6 @anaconda-RedHatEnterpriseLinux-.x86_64/6.3
kernel.x86_64 2.6.-.el6 @anaconda-RedHatEnterpriseLinux-.x86_64/6.3
kernel-devel.x86_64 2.6.-.el6 @anaconda-RedHatEnterpriseLinux-.x86_64/6.3
kernel-firmware.noarch 2.6.-.el6 @anaconda-RedHatEnterpriseLinux-.x86_64/6.3
kernel-headers.x86_64 2.6.-.el6 @anaconda-RedHatEnterpriseLinux-.x86_64/6.3
libreport-plugin-kerneloops.x86_64 2.0.-.el6 @anaconda-RedHatEnterpriseLinux-.x86_64/6.3
abrt-addon-kerneloops.x86_64 2.0.-.el6.centos base
dracut-kernel.noarch -.el6_8. updates
kernel.x86_64 2.6.-642.3..el6 updates
kernel-abi-whitelists.noarch 2.6.-642.3..el6 updates
kernel-debug.x86_64 2.6.-642.3..el6 updates
kernel-debug-devel.i686 2.6.-642.3..el6 updates
kernel-debug-devel.x86_64 2.6.-642.3..el6 updates
kernel-devel.x86_64 2.6.-642.3..el6 updates
kernel-doc.noarch 2.6.-642.3..el6 updates
kernel-firmware.noarch 2.6.-642.3..el6 updates
kernel-headers.x86_64 2.6.-642.3..el6 updates
kernel-lt.x86_64 3.10.-.el6.elrepo elrepo-kernel
kernel-lt-devel.x86_64 3.10.-.el6.elrepo elrepo-kernel
kernel-lt-doc.noarch 3.10.-.el6.elrepo elrepo-kernel
kernel-lt-firmware.noarch 3.10.-.el6.elrepo elrepo-kernel
kernel-lt-headers.x86_64 3.10.-.el6.elrepo elrepo-kernel
kernel-ml.x86_64 4.6.-.el6.elrepo elrepo-kernel
kernel-ml-devel.x86_64 4.6.-.el6.elrepo elrepo-kernel
kernel-ml-doc.noarch 4.6.-.el6.elrepo elrepo-kernel
kernel-ml-firmware.noarch 4.6.-.el6.elrepo elrepo-kernel
kernel-ml-headers.x86_64 4.6.-.el6.elrepo elrepo-kernel
libreport-plugin-kerneloops.x86_64 2.0.-.el6.centos base
perf.x86_64 4.6.-.el6.elrepo elrepo-kernel

方法三

实际工作当中经常碰到需要修改内核配置,编译驱动,调节相关参数等,这就需要定制内核,为此需要手动生成新的内核。还是以3.10.0-123.el7为例子,一般步骤如下:

1.先下载内核:

wget http://vault.centos.org//7.0.1406/os/Source/SPackages/kernel-3.10.0-123.el7.src.rpm

接着解压相关代码:

rpm2cpio kernel-3.10.0-123.el7.src.rpm |cpio -div

默认在/usr/src放有一份kernel的头文件,这样在不需要下载整个内核源代码的情况下就可以编译自己编写的内核模块,如果有patch需要打的话,用patch -p1 *.patch命令给内核打上相应的patch。

2.更新配置文件.config

可以获取系统当前的config文件,也可以用默认的配置文件,比如x86_64_defconfig:

cp /boot/config-3.10.0-123.el7.x86_64  .config  和make oldconfig生产的config一致

然后用make menuconfig来配置。

3.编译和安装

默认的情况下, 内核和initrd会安装到/boot下面,而驱动模块会安装到/lib/modules/`uname -r`下,如果可以都安装都默认的位置,直接运行下面的命令即可:

make -j8;make modules; make modules_install;make install;

如果需要安装到指定的路径,请设置下面的环境变量:

export INSTALL_PATH=….

export INSTALL_MOD_PATH=

4.创建initrd.img

initrd.img即为初始化的ramdisk文件,它是一个内存镜像文件。它是把一些最基本的驱动程序和命令工具打包而成,作用就是在系统还没有挂载根分区前,保证系统能够执行基础的初始化和加载一些基本的驱动,比如挂载scsi驱动等。制作initrd传统的方法是用mkinitramfs这一个系统工具,现在mkinitrd会调用dracut完成实际的工作。比如下面的命令进行:

mkinitrd3.0.4 -o /boot/initrd.img-3.0.4

然后把生成的initrd映像拷贝到/boot下面即可。

5.更新grub

为了让boot loader能够找到刚生成的内核和initrd映像,需要修改grub。注意如果使用的是grub2,不宜直接修改/boot/grub2/grub.cfg文件,而应该修改grub2的配置文件。grub2默认的配置文件在/etc/grub2.cfg。更新完这个文件之后,需要运行下面的文件:

grub2-mkconfig

至于启动那个linux镜像,由/etc/default/grub的GRUB_DEFAULT=saved来决定;

其意思是上一次使用的value;

修改内核默认启动项

grub2-set-default 0

这种方法需要注意kernel和模块签名的问题,如果模块签名没有通过内核检查,将不会加载,这可能导致生成系统启动失败。

总而言之,工程师和维护人员需要集合实际情况灵活选择合适的方法来更新内核。

Centos内核升级的三种方法的更多相关文章

  1. CentOS安装jdk的三种方法

    方法一:手动解压JDK的压缩包,然后设置环境变量 方法二:用yum安装JDK,(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的 ...

  2. RedHat 7.0及CentOS 7.0禁止Ping的三种方法

    作者:荒原之梦 原文链接:http://zhaokaifeng.com/?p=538 前言: "Ping"属于ICMP协议(即"Internet控制报文协议") ...

  3. [CentOS] 环境变量设置的三种方法

    在CentOS系统中添加环境变量的方法有几种,推荐第三种方法.这里以添加 TexLive 2017 的环境变量为例进行说明. 1. 修改  ~/.bash_profile  文档,在文末添加以下代码: ...

  4. CentOS中JDK的三种配置方法

    第一种方法(相对稳妥): 使用yum直接安装,在root用户下执行 "yum install java-openjdk-*" 第二种方法(最为稳妥): 前往'https://www ...

  5. Linux CentOS7 VMware 安装软件包的三种方法、rpm包介绍、rpm工具用法、yum工具用法、yum搭建本地仓库

    一.安装软件包的三种方法 Linux下游三种安装方法,rpm工具.yum工具.源码包.rpm按装一个程序包时,有可能因为该程序包依赖另一个程序包而无法安装:yum工具,可以连同依赖的程序包一起安装. ...

  6. YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法

    上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把 ...

  7. Linux启动新进程的三种方法

    程序中,我们有时需要启动一个新的进程,来完成其他的工作.下面介绍了三种实现方法,以及这三种方法之间的区别. 1.system函数-调用shell进程,开启新进程system函数,是通过启动shell进 ...

  8. Eclipse插件安装的三种方法

    转自:http://www.blogjava.net/tangzurui/archive/2008/06/30/211669.html  整理了一下格式. (前两种安装方式以多国语言包的安装为例) 1 ...

  9. python字符串连接的三种方法及其效率、适用场景详解

    python字符串连接的方法,一般有以下三种:方法1:直接通过加号(+)操作符连接website=& 39;python& 39;+& 39;tab& 39;+& ...

随机推荐

  1. (三)学习MVC之密码加密及用户登录

    1.密码加密采用SHA256 算法,此类的唯一实现是 SHA256Managed.在Common/Text.cs里添加Sha256方法: public static string Sha256(str ...

  2. DataTable 分页

    #region DataTable 分页 /// <summary> /// Datatable 分页 /// </summary> /// <param name=&q ...

  3. POJ 2677 Tour

    题意:双调欧几里得旅行商问题.算法导论15-1题,从最左边的点严格从左走到右再从右走到左回到起点,所有点都要走且只走一次,求最短路径. 解法:定义dp[i][j]表示从i走到j的双调路径,分为两种情况 ...

  4. java中的final关键字

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...

  5. LIBSVM的使用方法

    [原文:http://wenku.baidu.com/view/7e7b6b896529647d27285276.html] 目  录 1 Libsvm下载... 3 2 Libsvm3.0环境变量设 ...

  6. 解决session失效之后登陆后重新返回之前的页面

    在全局拦截器设置保存之前的url存入session中 登陆之后的地址再重session中存 request只用作一次请求 如果页面跳转几次的话原来的url就不存在了建议存在session @Overr ...

  7. Hubot Slack CoffeeScript

    公司买了一台Mac Pro,为了物尽其用,研究了半天把hubot-slack装好了,然后又花了点时间学习CoffeeScript(照着例子写也足够了).用slack来发版本还是很爽的.

  8. Hello,Ubuntu(安装过程中遇到的问题及解决)

    2013-02-23 不折腾不舒服(>_<).在虚拟机上运行Ubuntu程序一多就明显卡顿,感觉效率不高.为了流畅使用Ubuntu,也便于将来学习Vim/Emacs,我决定在笔记本的Win ...

  9. 关于使用digitalocean的vps

    先说说测试速度 平均在延迟125ms,机房选择新加坡 还有其他机房,比如伦敦,西海岸,阿姆斯特丹,基本全球覆盖. 以前用linode,virpus. linode以前有$5的套餐,现在最低都在10刀了 ...

  10. tRNAscan-SE

    tRNAscan-SE是一款可以在基因组上扫描tRNA的序列,也就是说你给定一组基因序列(fasta数据格式),可以用这个软件去预测这个序列是不是tRNA.具体的实现原理,我不搞生物,所以也就不太明白 ...