如何在RHEL/CentOS 7/8 Linux中正确更新内核
内核是最重要的补丁程序。
作为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下映射initramfs
和vmlinuz
文件。
# 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