如何在RHEL/CentOS 7/8 Linux中正确更新内核

时间:2020-01-09 10:39:48  来源:igfitidea点击:

内核是最重要的补丁程序。

作为Linux操作系统的核心,升级后的内核会影响所有事情。
在计划更新内核时,应遵循以下几个原则:

  • 切勿以覆盖现有内核的方式升级到新内核。
    在完成新内核的测试之前,请勿删除现有内核。

  • 大多数发行版支持新内核和现有内核的并行安装。
    实际上,当我们使用自定义的二进制软件包安装(而不升级)现有内核时,Red Hat/Fedora,SUSE和Debian都会"双重引导"新内核和现有内核。

  • 测试新内核如何管理引导过程。
    观察它检测到硬件并启动服务。
    如果存在问题或者什至异常的延迟,则新内核可能与关联的硬件或者服务有问题。

  • 检查与启动过程关联的日志文件。
    请特别注意无法启动的服务或者未检测到的硬件。

  • 根据发行说明在系统上测试新内核。
    确保新内核可以在计算机上正常工作。

  • 在新内核下测试服务和应用程序。
    注意行为上的任何变化。
    记录这些更改。

  • 当我们准备在生产计算机上升级内核时,请告诉用户他们的期望。

切勿使用" rpm -U"升级内核

每当我们安装补丁程序时,都有风险。
从经验上专业地讲,应该始终避免使用rpm -U更新内核。
使用-U开关,我们可以升级现有内核,这意味着升级后如果出现故障,则没有任何后备内容。
例如,许多内核补丁可能会导致我们无法启动Linux。

如果遇到补丁导致崩溃的情况,则可以从备份中还原系统。

如果我们无法为此目的引导系统,则可能需要使用"救援模式"进行分发。

可使用与Red Hat/Fedora和SUSE关联的第一张安装CD来使用救援模式。

更新内核是一项重要的更改,因此始终建议在删除旧内核之前保留旧内核。
让我告诉你我的意思。
目前," 3.10.0-957.21.3.el7"版本的内核已加载到我的RHEL Linux节点上

# uname -r
3.10.0-957.21.3.el7.x86_64
# rpm -q kernel
kernel-3.10.0-957.21.3.el7.x86_64

列出所有已安装的内核rpm。
(主要是kernel-3.10.0-957.21.3.el7.x86_64)

# rpm -qa| grep kernel
kernel-tools-libs-3.10.0-957.21.3.el7.x86_64
kernel-3.10.0-957.21.3.el7.x86_64
kernel-tools-3.10.0-957.21.3.el7.x86_64

现在,我已经从RHEL在线门户下载了内核rpm和依赖项rpm的更新版本。

# rpm -Uvh /tmp/kernel-3.10.0-1062.el7.x86_64.rpm /tmp/linux-firmware-20190429-72.gitddde598.el7.noarch.rpm
warning: /tmp/kernel-3.10.0-1062.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                          ################################# [100%]
Updating/installing...
   1:linux-firmware-20190429-72.gitddd################################# [ 25%]
   2:kernel-3.10.0-1062.el7           ################################# [ 50%]
Cleaning up/removing...
   3:kernel-3.10.0-957.21.3.el7       ################################# [ 75%]
   4:linux-firmware-20160911-69.git85c################################# [100%]

从消息中可以看到,较旧的内核已被删除。
现在,rpm无法识别内核rpm和其他系统rpm之间的差异,因此它以相同的方式对待内核。

# rpm -qa| grep kernel
kernel-3.10.0-1062.el7.x86_64
kernel-tools-libs-3.10.0-957.21.3.el7.x86_64
kernel-tools-3.10.0-957.21.3.el7.x86_64

如果系统由于某些问题而停止运行,并且无法启动,则现在在引导后就无法恢复Linux节点了。
剩下的唯一选择是进入救援模式,然后尝试恢复系统,这很麻烦(我这么说时请相信我)

使用yum更新内核

现在让我们尝试使用yum命令执行相同的任务。
使用yum,我们可以使用yum install或者yum update来更新内核,任一种方式yum都会了解我们正在尝试更新内核,因此它将执行"安装"操作。
因此,较旧的内核将不会被删除,而较新的内核仍将被安装。

检查存储库中可用的内核列表

# yum list kernel
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
Installed Packages
kernel.x86_64                     3.10.0-957.el7                           @anaconda/7.6
Available Packages
kernel.x86_64                     3.10.0-1062.1.1.el7                      rhel-7-server-rpms

说明:

如果我们尚未订阅RHN,则可以手动下载内核rpm及其依赖项,然后通过提供rpm的绝对路径来执行yum安装。

接下来,让我们尝试安装新内核。
为了这个例子,我将更新内核和所有其他相关软件包

# yum install kernel kernel-tools kernel-tools-libs
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
Resolving Dependencies
--> Running transaction check
---> Package kernel.x86_64 0:3.10.0-1062.1.1.el7 will be installed
--> Processing Dependency: linux-firmware >= 20190429-72 for package: kernel-3.10.0-1062.1.1.el7.x86_64
---> Package kernel-tools.x86_64 0:3.10.0-957.el7 will be updated
---> Package kernel-tools.x86_64 0:3.10.0-1062.1.1.el7 will be an update
---> Package kernel-tools-libs.x86_64 0:3.10.0-957.el7 will be updated
---> Package kernel-tools-libs.x86_64 0:3.10.0-1062.1.1.el7 will be an update
--> Running transaction check
---> Package linux-firmware.noarch 0:20160911-69.git85c5d90.el7 will be updated
---> Package linux-firmware.noarch 0:20190429-72.gitddde598.el7 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
===================================================================================================================================
 Package                        Arch                Version                                  Repository                       Size
===================================================================================================================================
Installing:
 kernel                         x86_64              3.10.0-1062.1.1.el7                      rhel-7-server-rpms               50 M
Updating:
 kernel-tools                   x86_64              3.10.0-1062.1.1.el7                      rhel-7-server-rpms              7.8 M
 kernel-tools-libs              x86_64              3.10.0-1062.1.1.el7                      rhel-7-server-rpms              7.7 M
Updating for dependencies:
 linux-firmware                 noarch              20190429-72.gitddde598.el7               rhel-7-server-rpms               73 M
Transaction Summary
===================================================================================================================================
Install  1 Package
Upgrade  2 Packages (+1 Dependent package)
Total size: 139 M
Total download size: 65 M
Is this ok [y/d/N]: y
Downloading packages:
No Presto metadata available for rhel-7-server-rpms
(1/3): kernel-tools-3.10.0-1062.1.1.el7.x86_64.rpm                                                          | 7.8 MB  00:00:01
(2/3): kernel-tools-libs-3.10.0-1062.1.1.el7.x86_64.rpm                                                     | 7.7 MB  00:00:01
(3/3): kernel-3.10.0-1062.1.1.el7.x86_64.rpm                                                                |  50 MB  00:00:07
----------------------------------------------------------------------------------------------------------------------------------
Total                                                                                              9.1 MB/s |  65 MB  00:00:07
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Updating   : linux-firmware-20190429-72.gitddde598.el7.noarch                                                                1/7
  Updating   : kernel-tools-libs-3.10.0-1062.1.1.el7.x86_64                                                                    2/7
  Updating   : kernel-tools-3.10.0-1062.1.1.el7.x86_64                                                                         3/7
  Installing : kernel-3.10.0-1062.1.1.el7.x86_64                                                                               4/7
  Cleanup    : kernel-tools-3.10.0-957.el7.x86_64                                                                              5/7
  Cleanup    : linux-firmware-20160911-69.git85c5d90.el7.noarch                                                                6/7
  Cleanup    : kernel-tools-libs-3.10.0-957.el7.x86_64                                                                         7/7
  Verifying  : kernel-3.10.0-1062.1.1.el7.x86_64                                                                               1/7
  Verifying  : kernel-tools-3.10.0-1062.1.1.el7.x86_64                                                                         2/7
  Verifying  : kernel-tools-libs-3.10.0-1062.1.1.el7.x86_64                                                                    3/7
  Verifying  : linux-firmware-20190429-72.gitddde598.el7.noarch                                                                4/7
  Verifying  : kernel-tools-libs-3.10.0-957.el7.x86_64                                                                         5/7
  Verifying  : linux-firmware-20160911-69.git85c5d90.el7.noarch                                                                6/7
  Verifying  : kernel-tools-3.10.0-957.el7.x86_64                                                                              7/7
Installed:
  kernel.x86_64 0:3.10.0-1062.1.1.el7
Updated:
  kernel-tools.x86_64 0:3.10.0-1062.1.1.el7                     kernel-tools-libs.x86_64 0:3.10.0-1062.1.1.el7
Dependency Updated:
  linux-firmware.noarch 0:20190429-72.gitddde598.el7
Complete!

现在我们更新内核的任务成功了。
我们可以使用以下命令验证相同的内容。
如我们所见,我们已经安装了两个版本的内核rpm。

# rpm -qa | grep kernel
kernel-tools-3.10.0-1062.1.1.el7.x86_64
kernel-tools-libs-3.10.0-1062.1.1.el7.x86_64
abrt-addon-kerneloops-2.1.11-52.el7.x86_64
kernel-3.10.0-1062.1.1.el7.x86_64
kernel-3.10.0-957.el7.x86_64

目前,我的系统仍在使用较旧的内核版本运行

# uname  -r
3.10.0-957.el7.x86_64

但是,如我们所见,重新启动后,RHEL Linux节点计划使用新安装的内核(`3.

10.0-1062.1.1.el7.x86_64`)。
如果安装了多个版本的内核,则还可以在不同的内核版本之间切换以更改RHEL 7和RHEL 8的启动顺序。

# grep saved /boot/grub2/grubenv
saved_entry=Red Hat Enterprise Linux Server (3.10.0-1062.1.1.el7.x86_64) 7.6 (Maipo)

现在,我们将重新启动RHEL 7 Linux主机。
如预期的那样,该节点提出了新内核

# uname -r
3.10.0-1062.1.1.el7.x86_64

而且我们的节点上仍然安装了两个版本的内核。

# rpm -qa | grep kernel
kernel-tools-3.10.0-1062.1.1.el7.x86_64
kernel-tools-libs-3.10.0-1062.1.1.el7.x86_64
abrt-addon-kerneloops-2.1.11-52.el7.x86_64
kernel-3.10.0-1062.1.1.el7.x86_64
kernel-3.10.0-957.el7.x86_64

对于所有可用的内核,我们还将在/boot下映射initramfsvmlinuz文件。

# ls -l /boot/
total 163328
-rw-r--r--. 1 root root   152980 Aug 14 00:14 config-3.10.0-1062.1.1.el7.x86_64
-rw-r--r--. 1 root root   151918 Oct  5  2016 config-3.10.0-957.el7.x86_64
drwx------. 3 root root     4096 Jun 28  2016 efi
drwx------. 5 root root     4096 Sep 12 23:13 grub2
-rw-------. 1 root root 74302690 May 11 12:25 initramfs-0-rescue-22ee5ba282da4d6ca9bfead578a8fe21.img
-rw-------. 1 root root 32195401 Sep 12 23:13 initramfs-3.10.0-1062.1.1.el7.x86_64.img
-rw-------. 1 root root 32608707 May 11 12:28 initramfs-3.10.0-957.el7.x86_64.img
drwx------. 2 root root    16384 May 11 12:09 lost+found
-rw-r--r--. 1 root root   318717 Aug 14 00:15 symvers-3.10.0-1062.1.1.el7.x86_64.gz
-rw-r--r--. 1 root root   314036 Oct  5  2016 symvers-3.10.0-957.el7.x86_64.gz
-rw-------. 1 root root  3595191 Aug 14 00:14 System.map-3.10.0-1062.1.1.el7.x86_64
-rw-------. 1 root root  3543471 Oct  5  2016 System.map-3.10.0-957.el7.x86_64
-rwxr-xr-x. 1 root root  6635920 May 11 12:25 vmlinuz-0-rescue-22ee5ba282da4d6ca9bfead578a8fe21
-rwxr-xr-x. 1 root root  6734128 Aug 14 00:14 vmlinuz-3.10.0-1062.1.1.el7.x86_64
-rwxr-xr-x. 1 root root  6635920 Oct  5  2016 vmlinuz-3.10.0-957.el7.x86_64

现在,由于我们知道我们的系统已成功安装了较新的内核,因此现在我们可以安全地删除旧的内核(如果需要,或者我们可以计划保留它)

# rpm -e kernel-3.10.0-957.el7.x86_64