方法一、

服务器已联网,使用yum包管理工具更新内核

内核3.0以上引入签名机制,需要先导入签名的key。

更新前,内核版本为:

>uname -r  
3.10.0-327.10.1.el7.x86_6412

升级的方法:

1、导入key

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

2、安装elrepo的yum源

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

3、安装内核

yum --enablerepo=elrepo-kernel install  kernel-ml-devel kernel-ml -y

当前为4.4.4:

====================================================================================================
 Package                   架构                版本                  源                   大小
===================================================================================================正在安装:
 kernel-ml                x86_64              4.4.4-1.el7.elrepo     elrepo-kernel        38 M
 kernel-ml-devel          x86_64              4.4.4-1.el7.elrepo     elrepo-kernel        10 M

4、查看默认启动顺序

>awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg  
CentOS Linux (4.4.4-1.el7.elrepo.x86_64) 7 (Core)  
CentOS Linux (3.10.0-327.10.1.el7.x86_64) 7 (Core)  
CentOS Linux (0-rescue-c52097a1078c403da03b8eddeac5080b) 7 (Core)1234

默认启动的顺序是从0开始,新内核是从头插入(目前位置在0,而4.4.4的是在1),所以需要选择0。

grub2-set-default 0

然后reboot重启,使用新的内核,下面是重启后使用的内核版本:

>uname -r  
4.4.4-1.el7.elrepo.x86_64

5、删除旧的内核

yum remove kernel


方法二、

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

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 -y install kernel-3.10.0-123.1.2.el7.x86_64.rpm


方法三、

实际工作当中经常碰到需要修改内核配置,编译驱动,调节相关参数等,这就需要定制内核,为此需要手动生成新的内核。还是以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

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


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