Linux更新内核的三种方法

Centos内核升级的三种方法

在基于CentOS平台的工作过程中,难免有时需要升级或者降级内核以验证功能、调试性能或者更新整个系统。如果从头重新编译一个内核,由于现在内核特性越来越复杂,依赖的库或者工具也不少,加之重新编译耗时不菲,了解更新内核的多种方式就显得尤为必要。下面根据笔者最近的工作,总结了三种方法,供大家参考。

方法一

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

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

2.
[[email protected] os2]# scp
[email protected]:/home/worker/kernel-3.10.0-123.1.2.el7.x86_64.rpm .

[email protected]‘s
password:

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

[[email protected]
os2]# man yum

[[email protected]
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

Dependencies
Resolved

================================================================================================================

Package
       Arch            Version                       Repository    
                           Size

================================================================================================================

Installing:

kernel
        x86_64          3.10.0-123.1.2.el7          
/kernel-3.10.0-123.1.2.el7.x86_64          127 M

Transaction
Summary

================================================================================================================

Install
1 Package

Total
size: 127 M

Installed
size: 127 M

Is
this ok [y/d/N]: y

Downloading
packages:

Running
transaction check

Running
transaction test

Transaction
test succeeded

Running
transaction

Installing
: kernel-3.10.0-123.1.2.el7.x86_64                                  
                        1/1

Verifying
: kernel-3.10.0-123.1.2.el7.x86_64                                  
                         1/1

Installed:

kernel.x86_64
0:3.10.0-123.1.2.el7

Complete!

方法二

如果机器已经联网,直接利用包管理工具更新,需要注意的是现在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-kernelinstallkernel-lt -y

方法三

实际工作当中经常碰到需要修改内核配置,编译驱动,调节相关参数等,这就需要定制内核,为此需要手动生成新的内核。还是以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和模块签名的问题,如果模块签名没有通过内核检查,将不会加载,这可能导致生成系统启动失败。

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

时间: 2024-10-24 17:47:10

Linux更新内核的三种方法的相关文章

Linux 下系统调用的三种方法

系统调用(System Call)是操作系统为在用户态运行的进程与硬件设备(如CPU.磁盘.打印机等)进行交互提供的一组接口.当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系统调用函数.下面介绍Linux 下三种发生系统调用的方法: 通过 glibc 提供的库函数 glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库,即运行时库.glibc 为程序员提供丰富的 API(Application Programming Interfac

【转】 Linux 线程同步的三种方法

线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 通过锁机制实现线程间的同步. 初始化锁.在Linux下,线程的互斥量数据类型是pthread_mutex_t.在使用前,要对它进行初始化.静态分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;动态分配:int pthread_mutex_init(pthread_m

用Python获取Linux资源信息的三种方法

方法一:psutil模块 #!usr/bin/env python # -*- coding: utf-8 -*- import socket import psutil class NodeResource(object): def get_host_info(self): host_name = socket.gethostname() return {'host_name':host_name} def get_cpu_state(self): cpu_count = psutil.cpu

linux设置变量的三种方法

1在/etc/profile文件中添加变量对所有用户生效(永久的) 用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久生效”. 例如:编辑/etc/profile文件,添加CLASSPATH变量 # vi /etc/profile export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib 注1:profile文件在系统启动时将被运行.大家可以在里面加入其他命令,但是一定要加正确,不然的话系统会启动不

Linux 线程同步的三种方法(互斥锁、条件变量、信号量)

互斥锁 1 #include <cstdio> 2 3 #include <cstdlib> 4 5 #include <unistd.h> 6 7 #include <pthread.h> 8 9 #include "iostream" 10 11 using namespace std; 12 13 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 14 15 int tmp; 16

Linux 开机启动的三种方法

一.修改开机启动文件:/etc/rc.local(或者/etc/rc.d/rc.local) # 1.编辑rc.local文件 [[email protected] ~]# vi /etc/rc.local 如下图保存并退出. (命令后面让得加&号,表示后台运行) # 2.最后修改rc.local文件的执行权限 [[email protected] ~]# chmod +x /etc/rc.local 二.自己写一个shell脚本 将写好的脚本(.sh文件)放到目录 /etc/profile.d

从U盘运行Linux操作系统的三种方法

摘要: 从U盘运行Linux操作系统的三种方法 usb_linux_0 你或许听说过在U盘上运行live Linux操作系统,但你知不知道可以永久的保存运行时的数据,或者直接将Linux安装到U盘?本文将介绍把Linux装进口袋(U盘)的三种方法,挑一种你最喜欢的方法吧! 将ISO映像烧录到U盘 usb_linux_1 把一个Linux发行版的Live ISO映像烧录到U盘中已 经变的极其容易了. 从U盘运行Linux操作系统的三种方法 usb_linux_0 你或许听说过在U盘上运行live

ubuntu/linux mint 创建proc文件的三种方法(二)

在做内核驱动开发的时候,可以使用/proc下的文件,获取相应的信息,以便调试. 大多数/proc下的文件是只读的,但为了示例的完整性,都提供了写方法. 方法一:使用create_proc_entry创建proc文件(简单,但写操作有缓冲区溢出的危险): 方法二:使用proc_create和seq_file创建proc文件(较方法三简洁): 方法三:使用proc_create_data和seq_file创建proc文件(较麻烦,但比较完整): 示例四:在proc文件中使用内核链表的一个示例(用的方

ubuntu/linux mint 创建proc文件的三种方法(四)

在做内核驱动开发的时候,可以使用/proc下的文件,获取相应的信息,以便调试. 大多数/proc下的文件是只读的,但为了示例的完整性,都提供了写方法. 方法一:使用create_proc_entry创建proc文件(简单,但写操作有缓冲区溢出的危险): 方法二:使用proc_create和seq_file创建proc文件(较方法三简洁): 方法三:使用proc_create_data和seq_file创建proc文件(较麻烦,但比较完整): 示例四:在proc文件中使用内核链表的一个示例(用的方