使用grubby在RHEL 8中使用旧内核版本启动的2种方法

时间:2020-01-09 10:37:31  来源:igfitidea点击:

如何使用Grubby在RHEL 8 Linux中设置默认启动内核?如何在RHEL 8中更改内核的默认启动项?如何使用RHEL 8中的旧内核版本启动?如何恢复到以前的内核版本?

早些时候,我分享了在RHEL/CentOS 7 Linux节点中设置默认内核的步骤。

现在,使用RHEL 8,GRUB2配置参数再次更改,现在我们使用grubby设置默认内核或者更改系统中内核的默认启动项。

在撰写本文时,CentOS 8不可用,因此无法在CentOS 8上验证这些步骤,但是我假设相同的步骤也可以在CentOS 8上工作。如果在CentOS 8上执行这些步骤时遇到任何问题,那么请在本文末尾的评论框中添加详细信息。

什么是Grubby?

grubby是一个命令行工具,用于更新和显示有关各种体系结构特定的引导程序的配置文件的信息。它主要设计用于安装新内核并需要查找有关当前引导环境的信息的脚本。

GRUB配置文件

默认的引导加载程序目标主要由构建肮脏的体系结构确定。每个体系结构都有一个首选的引导加载程序,每个引导加载程序都有其自己的配置文件。如果在命令行上未选择引导加载程序,则grubby将使用这些默认设置来搜索现有配置。如果找不到引导程序配置文件,则grubby将使用该体系结构的默认值。下表列出了这些默认值。

ArchBootloader配置文件
x8664[BIOS]grub2
x8664[UEFI]grub2
i386grub2/boot/grub2/grub.cfg
ia64grub2/boot/efi/efi/redhat/elilo.conf文件
ppc[>=Power8]grub2/boot/grub2/grub.cfg
ppc[<=Power7]yaboot/etc/yaboot.conf文件
s390zipl/etc/zipl.conf
s390xzipl/etc/zipl.conf

Grubby参数

下面是我们将在本文中使用的一些参数。这些摘录取自肮脏的手册页

--set-default=kernel-path
       The first entry which boots the specified kernel is made the default boot entry. This Jan not be invoked with --set-default-index.
--set-default-index=entry-index
       Makes the given entry number the default boot entry. This Jan not be invoked with --set-default.  The given value represents the index in the post-modification boot entry list.
--default-kernel
       Display the full path to the current default kernel and exit.
--default-index
       Display the numeric index of the current default boot entry and exit.
			  
--info=kernel-path
       Display  information  on  all  boot entries which match kernel-path. If kernel-path is DEFAULT, then information on the default kernel is displayed. If kernel-path is ALL, then information on all boot entries are dis‐played.

检查默认启动内核

在将系统配置为使用旧内核版本引导或者为RHEL 8系统设置不同的引导内核之前,让我们检查当前的默认内核。

[root@rhel-8 ~]# grubby --default-kernel
/boot/vmlinuz-4.18.0-80.7.1.el8_0.x86_64

这意味着重启后,节点将继续从/boot/vmlinuz-4.18.0-80.7.1.el8_0.x86_64和映射的条目启动

要使用此内核检查映射的索引,请使用以下命令

[root@rhel-8 ~]# grubby --default-index
0

说明:
如果系统上仅安装了一个内核,那么肮脏的--default-index命令将输出NULL。

我们可以在"/boot"下获得系统上可用的initrd镜像列表,如下所示:

[root@rhel-8 ~]# ls -l /boot/vmlinuz-*
-rwxr-xr-x. 1 root root 7872864 May 30 16:00 /boot/vmlinuz-0-rescue-fe04eeb0b80e4239ad8237cfbbef7edf
-rwxr-xr-x. 1 root root 7868768 Jun 14 18:59 /boot/vmlinuz-4.18.0-80.4.2.el8_0.x86_64
-rwxr-xr-x. 1 root root 7876960 Jun 24 16:22 /boot/vmlinuz-4.18.0-80.7.1.el8_0.x86_64
-rwxr-xr-x. 1 root root 7872864 Mar 13 18:04 /boot/vmlinuz-4.18.0-80.el8.x86_64

要获取有关各个initrd镜像的更多信息,可以使用grubby --info

[root@rhel-8 ~]# grubby --info=/boot/vmlinuz-4.18.0-80.7.1.el8_0.x86_64
index=0
kernel="/boot/vmlinuz-4.18.0-80.7.1.el8_0.x86_64"
args="ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet $tuned_params"
root="/dev/mapper/rhel-root"
initrd="/boot/initramfs-4.18.0-80.7.1.el8_0.x86_64.img $tuned_initrd"
title="Red Hat Enterprise Linux (4.18.0-80.7.1.el8_0.x86_64) 8.0 (Ootpa)"
id="fe04eeb0b80e4239ad8237cfbbef7edf-4.18.0-80.7.1.el8_0.x86_64"

使用grubby获取内核的索引ID

在将系统配置为使用RHEL 8中的旧内核版本引导之前,我们必须熟悉索引映射。获取系统上安装的可用内核的列表

[root@rhel-8 ~]# rpm -qa | grep kernel | sort -V
kernel-4.18.0-80.4.2.el8_0.x86_64
kernel-4.18.0-80.7.1.el8_0.x86_64
kernel-4.18.0-80.el8.x86_64
kernel-core-4.18.0-80.4.2.el8_0.x86_64
kernel-core-4.18.0-80.7.1.el8_0.x86_64
kernel-core-4.18.0-80.el8.x86_64
kernel-modules-4.18.0-80.4.2.el8_0.x86_64
kernel-modules-4.18.0-80.7.1.el8_0.x86_64
kernel-modules-4.18.0-80.el8.x86_64
kernel-tools-4.18.0-80.el8.x86_64
kernel-tools-libs-4.18.0-80.el8.x86_64

因此,如我们在本文的演示中所见,我已经安装了3个版本的内核。同样,我将三个不同的initrd镜像映射到各自的内核

[root@rhel-8 ~]# ls -l /boot/vmlinuz-*
-rwxr-xr-x. 1 root root 7872864 May 30 16:00 /boot/vmlinuz-0-rescue-fe04eeb0b80e4239ad8237cfbbef7edf
-rwxr-xr-x. 1 root root 7868768 Jun 14 18:59 /boot/vmlinuz-4.18.0-80.4.2.el8_0.x86_64
-rwxr-xr-x. 1 root root 7876960 Jun 24 16:22 /boot/vmlinuz-4.18.0-80.7.1.el8_0.x86_64
-rwxr-xr-x. 1 root root 7872864 Mar 13 18:04 /boot/vmlinuz-4.18.0-80.el8.x86_64

其中:最新的内核将被视为具有索引0,然后较旧的版本将与索引1映射,然后下一个较旧的版本将被索引2映射,依此类推。
现在:因为我的系统正在使用系统上的最新可用内核运行,所以索引将显示为0

[root@rhel-8 ~]# uname -r
4.18.0-80.7.1.el8_0.x86_64
[root@rhel-8 ~]# grubby --default-index
0

同样,如果我使用较旧的内核启动系统,则索引将分别显示

[root@rhel-8 ~]# grubby --default-index
1
[root@rhel-8 ~]# uname -r
4.18.0-80.4.2.el8_0.x86_64

对于系统上可用的最旧的内核

[root@rhel-8 ~]# grubby --default-index
2
[root@rhel-8 ~]# uname -r
4.18.0-80.el8.x86_64

设置默认启动内核(Grubby)

现在,由于我们知道默认的内核和索引,因此我们可以继续执行下一步,以使用RHEL 8中的grubby设置默认的启动内核,并允许系统使用旧的内核版本启动。有两种使用grubby工具设置默认内核的方法

方法1:使用索引使用旧内核版本启动

我希望我们对内核到索引的映射部分有所了解。因此,其中我将演示--set-default-index使用索引ID设置默认内核的用法。目前,我的系统使用索引0(即最新的内核)运行,现在我将使用索引1更改为较早的内核版本

[root@rhel-8 ~]# grubby --set-default-index=1
The default is /boot/loader/entries/fe04eeb0b80e4239ad8237cfbbef7edf-4.18.0-80.4.2.el8_0.x86_64.conf with index 1 and kernel /boot/vmlinuz-4.18.0-80.4.2.el8_0.x86_64

接下来,我们可以检查默认的内核,下次重新引导时将使用该默认内核来引导系统。

[root@rhel-8 ~]# grubby --default-kernel
/boot/vmlinuz-4.18.0-80.4.2.el8_0.x86_64

同样,检查默认索引值,该值在重新启动后将处于活动状态

[root@rhel-8 ~]# grubby --default-index
1

要激活更改,请重新引导节点

[root@rhel-8 ~]# reboot

重新启动后验证更改

[root@rhel-8 ~]# grubby --default-index
1
[root@rhel-8 ~]# grubby --default-kernel
/boot/vmlinuz-4.18.0-80.4.2.el8_0.x86_64

正如预期的那样,我们的系统正在运行的内核映射了索引1,即4.18.0-80.4.2.el8

[root@rhel-8 ~]# uname -r
4.18.0-80.4.2.el8_0.x86_64

验证活动的GRUB2配置文件中的内容是否相同

[root@rhel-8 ~]# cat /proc/cmdline
BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-80.4.2.el8_0.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet

方法2:使用initrd镜像以旧内核版本启动

现在,在此步骤中,我们无需记住索引值,因此可以减少混乱。其中:我们可以直接提供initrd镜像位置,我们可以使用该位置来设置默认的启动内核。

现在,我的系统目前正在以下内核版本下运行

[root@rhel-8 ~]# uname -r
4.18.0-80.4.2.el8_0.x86_64

要将默认内核更改为" 4.18.0-80.7.1.el8_0.x86_64"(这是我们系统上的最新可用内核),我们将使用映射的initrd镜像

[root@rhel-8 ~]# grubby --set-default=/boot/vmlinuz-4.18.0-80.7.1.el8_0.x86_64
The default is /boot/loader/entries/fe04eeb0b80e4239ad8237cfbbef7edf-4.18.0-80.7.1.el8_0.x86_64.conf with index 0 and kernel /boot/vmlinuz-4.18.0-80.7.1.el8_0.x86_64

接下来,我们可以验证默认内核和默认索引的状态,这些状态在节点重新引导后将处于活动状态

[root@rhel-8 ~]# grubby --default-index
0
[root@rhel-8 ~]# grubby --default-kernel
/boot/vmlinuz-4.18.0-80.7.1.el8_0.x86_64

接下来,让我们重新启动节点以激活更改

[root@rhel-8 ~]# reboot

重新启动后按预期进行,我们的新内核已加载到系统上

[root@rhel-8 ~]# uname -r
4.18.0-80.7.1.el8_0.x86_64

使用GRUB2配置文件验证相同

[root@rhel-8 ~]# cat /proc/cmdline
BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-80.7.1.el8_0.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet

可以使用以下命令再次检查相同的详细信息

[root@rhel-8 ~]# grubby --default-kernel
/boot/vmlinuz-4.18.0-80.7.1.el8_0.x86_64
[root@rhel-8 ~]# grubby --default-index
0