grubby命令示例

时间:2020-01-09 10:38:47  来源:igfitidea点击:

在本教程中,我将分享有关Linux中grubby命令用法的不同示例,这些命令用于修改内核引导项,检查和更改默认内核,列出活动的已安装内核等等。
grubby是用于处理特定于引导加载程序的配置文件的实用程序。
我们也可以使用grubby更改默认的引导项,以及从GRUB2菜单项添加/删除参数。

什么是启动项

  • 在本教程中,我们将使用内核启动项,因此首先让我简要介绍一下启动项

  • 引导项是选项的集合,这些选项存储在配置文件中并与特定的内核版本绑定。

  • 实际上,引导条目至少与系统已安装内核的数目相同。

  • 上面的文件名由存储在/etc/machine-id文件中的机器ID和内核版本组成。

  • 引导条目配置文件包含有关内核版本,初始ramdisk镜像和kernelopts环境变量的信息,其中包含内核命令行参数。

引导条目配置文件位于/boot/loader/entries /目录中,如下所示。
在/boot/grub2/grubenv文件中定义了kernelopts环境变量。

# cat /boot/loader/entries/d88fa2c7ff574ae782ec8c4288de4e85-4.18.0-193.14.3.el8_2.x86_64.conf
title Red Hat Enterprise Linux (4.18.0-193.14.3.el8_2.x86_64) 8.2 (Ootpa)
version 4.18.0-193.14.3.el8_2.x86_64
linux /vmlinuz-4.18.0-193.14.3.el8_2.x86_64
initrd /initramfs-4.18.0-193.14.3.el8_2.x86_64.img $tuned_initrd
options $kernelopts $tuned_params
id rhel-20170720141339-4.18.0-193.14.3.el8_2.x86_64
grub_users $grub_users
grub_arg --unrestricted
grub_class kernel

1. grubby命令添加新的内核条目

假设我们已经构建了自己的内核,该内核已安装在服务器上,并且希望为此新内核添加一个自定义条目。
因此,我们可以使用以下语法:

grubby --add-kernel=new_kernel --title="entry_title" --initrd="new_initrd" --copy-default

其中我使用--copy-default将所有内核参数从默认内核复制到此新内核条目。
要添加自己的自定义内核参数,可以使用:

grubby --add-kernel=new_kernel --title="entry_title" --initrd="new_initrd" --args=kernel_args

获取可用启动项的列表

# ls -l /boot/loader/entries/*
-rw-r--r--. 1 root root 408 Nov 13  2019 /boot/loader/entries/d88fa2c7ff574ae782ec8c4288de4e85-0-rescue.conf
-rw-r--r--  1 root root 366 Aug 15 16:03 /boot/loader/entries/d88fa2c7ff574ae782ec8c4288de4e85-4.18.0-193.1.2.el8_2.x86_64.conf
-rw-r--r--  1 root root 371 Aug 15 16:07 /boot/loader/entries/d88fa2c7ff574ae782ec8c4288de4e85-4.18.0-193.14.3.el8_2.x86_64.conf
-rw-r--r--  1 root root 336 Aug 15 15:12 /boot/loader/entries/d88fa2c7ff574ae782ec8c4288de4e85-4.18.0-193.el8.x86_64.conf

在此示例中,我将为4.18.0-193.el8.x86_64内核创建一个新的引导项。

# grubby --grub2 --add-kernel=/boot/vmlinuz-4.18.0-193.el8.x86_64 --title="Red Hat Enterprise 8 Test" --initrd=/boot/initramfs-4.18.0-193.el8.x86_64.img --copy-default

验证新添加的启动项:

# ls -l /boot/loader/entries/*
-rw-r--r--. 1 root root 408 Nov 13  2019 /boot/loader/entries/d88fa2c7ff574ae782ec8c4288de4e85-0-rescue.conf
-rw-r--r--  1 root root 366 Aug 15 16:03 /boot/loader/entries/d88fa2c7ff574ae782ec8c4288de4e85-4.18.0-193.1.2.el8_2.x86_64.conf
-rw-r--r--  1 root root 371 Aug 15 16:07 /boot/loader/entries/d88fa2c7ff574ae782ec8c4288de4e85-4.18.0-193.14.3.el8_2.x86_64.conf
-rw-r--r--  1 root root 287 Aug 16 15:17 /boot/loader/entries/d88fa2c7ff574ae782ec8c4288de4e85-4.18.0-193.el8.x86_64.0~custom.conf
-rw-r--r--  1 root root 287 Aug 16 15:29 /boot/loader/entries/d88fa2c7ff574ae782ec8c4288de4e85-4.18.0-193.el8.x86_64.conf

现在,我们可以更改默认内核并重新引导服务器以验证更改。

2.删除内核条目

重要的提示:

请谨慎使用此命令,因为它将删除提供的内核的引导项。
如果删除了不正确内核的内核条目,则系统可能无法启动,然后必须启动到单用户模式才能修复损坏的服务器

# grubby --remove-kernel=old_kernel

或者我们也可以使用

grubby --remove-kernel=menu_index

3.添加新的内核参数

要在GRUB2中添加新参数,请使用:

grubby --update-kernel=current_kernel --args="kernel_args"

例如,我将在此命令中禁用IPv6:

# grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="ipv6.disable=1"

我使用了uname -r来获取默认内核的发行信息。
这种方式比提供内核版本要容易得多。
尽管如果我们打算向默认内核以外的其他内核添加新参数,则必须手动提供内核版本。

现在验证更改。

# grep ipv6 /boot/loader/entries/d88fa2c7ff574ae782ec8c4288de4e85-$(uname -r).conf
options root=/dev/mapper/rhel-root ro resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet biosdevname=0 net.ifnames=0 enforcing=0 $tuned_params ipv6.disable=1

向所有可用内核添加新的内核参数

grubby --update-kernel=ALL --args="kernel_args"

4.删除内核参数

与添加类似,我们还可以使用以下命令从内核引导项中删除其他内核参数:

grubby --update-kernel=current_kernel --remove-args="kernel_args"

在上一个示例中,我禁用了ipv6,因此现在我将删除此内核参数

# grubby --update-kernel=/boot/vmlinuz-$(uname -r) --remove-args="ipv6.disable=1"

验证默认内核的启动条目,以确保已删除该条目

# grep ipv6 /boot/loader/entries/d88fa2c7ff574ae782ec8c4288de4e85-$(uname -r).conf

同样从所有内核中删除内核条目

grubby --update-kernel=ALL --args="kernel_args"

5.删除并添加内核参数

我们可以结合使用grubby命令删除和添加内核参数。

grubby --remove-args="kernel-args" --args="kernel_args"

在此示例中,我在同一grubby命令中删除了" quiet"并添加了" console = ttys0"参数。

# grubby --update-kernel=/boot/vmlinuz-$(uname -r) --remove-args="quiet" --args="console=ttsy0"

验证更改

# grep console /boot/loader/entries/d88fa2c7ff574ae782ec8c4288de4e85-$(uname -r).conf
options root=/dev/mapper/rhel-root ro resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb biosdevname=0 net.ifnames=0 enforcing=0 $tuned_params console=ttsy0

6.列出已安装的内核

要列出所有已安装的内核,可以使用:

# grubby --info=ALL | grep ^kernel
kernel="/boot/vmlinuz-4.18.0-193.14.3.el8_2.x86_64"
kernel="/boot/vmlinuz-4.18.0-193.1.2.el8_2.x86_64"
kernel="/boot/vmlinuz-4.18.0-193.el8.x86_64"
kernel="/boot/vmlinuz-0-rescue-d88fa2c7ff574ae782ec8c4288de4e85"

7.获取有关内核启动项的更多信息

要获得有关已安装内核的更多详细信息,我们可以使用grubby --info
这将为我们提供诸如索引号,引导项ID,应用于内核的参数等信息。

# grubby --info="/boot/vmlinuz-$(uname -r)"
index=1
kernel="/boot/vmlinuz-4.18.0-193.1.2.el8_2.x86_64"
args="ro resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb biosdevname=0 net.ifnames=0 enforcing=0 $tuned_params console=ttsy0"
root="/dev/mapper/rhel-root"
initrd="/boot/initramfs-4.18.0-193.1.2.el8_2.x86_64.img $tuned_initrd"
title="Red Hat Enterprise Linux (4.18.0-193.1.2.el8_2.x86_64) 8.2 (Ootpa)"
id="d88fa2c7ff574ae782ec8c4288de4e85-4.18.0-193.1.2.el8_2.x86_64"

8.默认内核的列表路径

默认内核是将在重新引导后激活的内核版本。
如果我们已经安装/删除了任何内核,则活动内核版本可能会与默认内核版本不同。

要获取默认内核版本,请使用:

# grubby --default-kernel
/boot/vmlinuz-4.18.0-193.el8.x86_64

9.默认内核的列表索引

现在要获取默认内核的索引值,请使用grubby --default-index
例如下面的输出来自我的服务器:

# grubby --default-index
2

10.列出默认内核标题

内核标题是在重新引导Linux服务器时在GRUB2菜单中看到的输出。
因此,要检查默认内核的标题,请使用:

# grubby --default-title
Red Hat Enterprise Linux (4.18.0-193.1.2.el8_2.x86_64) 8.2 (Ootpa)

11.使用内核路径设置默认内核

要更改默认内核,即使用内核路径在重启后激活的内核:

# grubby --set-default="/boot/vmlinuz-4.18.0-193.1.2.el8_2.x86_64"
The default is /boot/loader/entries/d88fa2c7ff574ae782ec8c4288de4e85-4.18.0-193.1.2.el8_2.x86_64.conf with index 1 and kernel /boot/vmlinuz-4.18.0-193.1.2.el8_2.x86_64

因此,现在将" kernel-4.18.0-193.1.2.el8_2"设置为默认启动,以便在重启后激活。

12.使用索引设置默认内核

除了使用内核vmlinuz条目之外,我们还可以提供索引号来更改默认内核。

要获取所有已安装内核的索引号:

# grubby --info=ALL | grep -E "^kernel|^index"
index=0
kernel="/boot/vmlinuz-4.18.0-193.14.3.el8_2.x86_64"
index=1
kernel="/boot/vmlinuz-4.18.0-193.1.2.el8_2.x86_64"
index=2
kernel="/boot/vmlinuz-4.18.0-193.el8.x86_64"
index=3
kernel="/boot/vmlinuz-4.18.0-193.el8.x86_64"
index=4
kernel="/boot/vmlinuz-0-rescue-d88fa2c7ff574ae782ec8c4288de4e85"

因此,现在我们有了服务器上安装的每个内核的映射索引号。
现在我们可以使用--set-default-index = <val>来更改默认内核

# grubby --set-default-index=2
The default is /boot/loader/entries/d88fa2c7ff574ae782ec8c4288de4e85-4.18.0-193.el8.x86_64.0~custom.conf with index 2 and kernel /boot/vmlinuz-4.18.0-193.el8.x86_64

我们可以验证输出,以确保添加了正确的内核作为默认内核