在Linux上使用grubby修改grub.cfg配置 |
在系统上安装多个内核版本后,您可能会发现自己需要修改 GRUB 配置。 Grubby 是一个命令行工具,用于显示和更新 lilo、elilo、zipl、yaboot 和 grub 引导加载程序的信息。它通常用于更改 grub.cfg 文件。 Grubby 可用于:
- 修改内核启动项
- 检查并更改默认内核
- 列出活动的已安装内核
- 从 GRUB2 菜单项添加/删除参数
启动条目被定义为存储在通常与特定内核版本相关的配置文件中的选项集合。
本指南旨在演示如何使用 grubby 修改 Linux 上的 grub.cfg 配置。
入门
对于本指南,建议您拥有与系统安装的内核一样多的引导条目。
检查启动项文件,其中包含有关内核版本、初始 ramdisk 映像和内核选择环境变量等信息,通常存储在 /boot/loader/entries/ 中:以下。
$ sudo ls -1 /boot/loader/entries/
723b266ce27e45698c2c0e30032ea83f-0-rescue.conf
723b266ce27e45698c2c0e30032ea83f-4.18.0-305.17.1.el8_4.x86_64.conf
硒
# cat /boot/loader/entries/723b266ce27e45698c2c0e30032ea83f-4.18.0-305.17.1.el8_4.x86_64.conf
title Red Hat Enterprise Linux (4.18.0-305.17.1.el8_4.x86_64) 8.4 (Ootpa)
version 4.18.0-305.17.1.el8_4.x86_64
linux /vmlinuz-4.18.0-305.17.1.el8_4.x86_64
initrd /initramfs-4.18.0-305.17.1.el8_4.x86_64.img $tuned_initrd
options $kernelopts $tuned_params
id rhel-20210830114656-4.18.0-305.17.1.el8_4.x86_64
grub_users $grub_users
grub_arg --unrestricted
grub_class kernel
从输出中可以看出,启动项配置文件中存储了一些详细信息。
使用 grubby 修改 Linux 上的 grub.cfg 配置。
现在我们将看到如何使用这个 grubby 工具修改 Grub 的几个选项。
1.添加新的内核条目
首先,获取所有已安装内核的列表。
$ sudo grubby --info=ALL | grep ^kernel
kernel="/boot/vmlinuz-4.18.0-348.2.1.el8_5.x86_64"
kernel="/boot/vmlinuz-4.18.0-348.2.1.el8_5.x86_64"
kernel="/boot/vmlinuz-4.18.0-305.19.1.el8_4.x86_64"
kernel="/boot/vmlinuz-4.18.0-305.17.1.el8_4.x86_64"
kernel="/boot/vmlinuz-0-rescue-723b266ce27e45698c2c0e30032ea83f"
如果您想向现有的启动选项添加自定义条目,请使用以下语法:
sudo grubby --add-kernel=new_kernel \
--title="entry_title" \
--initrd="new_initrd" \
--copy-default
这里的 –copy-default 标志用于将所有默认内核参数复制到这个新的内核条目。您可以添加自己的自定义内核参数,如下所示:
sudo grubby --add-kernel=new_kernel \
--title="entry_title" \
--initrd="new_initrd" \
--args=kernel_args
例如,我将创建一个新的启动项Linux_Test_4.18.0-348.2.1.el8_5.x86_64,如下所示:
$ sudo grubby --grub2 \
--add-kernel=/boot/vmlinuz-4.18.0-348.2.1.el8_5.x86_64 \
--title="Linux_Test_Kernel" \
--initrd=/boot/initramfs-4.18.0-348.2.1.el8_5.x86_64.img \
--copy-default
内核条目将添加如下。
-rw-r--r--. 1 root root 395 Oct 14 05:41 /boot/loader/entries/723b266ce27e45698c2c0e30032ea83f-0-rescue.conf
-rw-r--r--. 1 root root 371 Oct 25 05:26 /boot/loader/entries/723b266ce27e45698c2c0e30032ea83f-4.18.0-305.17.1.el8_4.x86_64.conf
-rw-r--r--. 1 root root 371 Oct 25 05:29 /boot/loader/entries/723b266ce27e45698c2c0e30032ea83f-4.18.0-305.19.1.el8_4.x86_64.conf
-rw-r--r--. 1 root root 303 Dec 22 03:23 /boot/loader/entries/723b266ce27e45698c2c0e30032ea83f-4.18.0-348.2.1.el8_5.x86_64.0~custom.conf
-rw-r--r--. 1 root root 366 Nov 22 06:15 /boot/loader/entries/723b266ce27e45698c2c0e30032ea83f-4.18.0-348.2.1.el8_5.x86_64.conf
2. 更改默认启动项
首先列出默认内核,如下所示。
$ sudo grubby --default-kernel
/boot/vmlinuz-4.18.0-348.2.1.el8_5.x86_64
您还可以找到默认内核的索引号。
$ sudo grubby --default-index
1
找出内核标题:
$ sudo grubby --default-title
Red Hat Enterprise Linux (4.18.0-305.19.1.el8_4.x86_64) 8.4 (Ootpa)
您可以使用两种方法对默认内核进行持久更改。
方法一:使用内核路径:
sudo grubby --set-default /boot/vmlinuz-4.18.0-305.19.1.el8_4.x86_64
示例输出:
The default is /boot/loader/entries/723b266ce27e45698c2c0e30032ea83f-4.18.0-305.19.1.el8_4.x86_64.conf with index 2 and kernel /boot/vmlinuz-4.18.0-305.19.1.el8_4.x86_64
在上面的代码中,我从默认的 vmlinuz-4.18.0-348.2.1.el8_5.x86_64 切换到 vmlinuz-4.18.0 -305.19.1.el8_4.x86_64 作为我的新默认内核。
方法2:使用内核索引:
查找所有已安装内核的索引
$ sudo grubby --info=ALL | grep -E "^kernel|^index"
index=0
kernel="/boot/vmlinuz-4.18.0-348.2.1.el8_5.x86_64"
index=1
kernel="/boot/vmlinuz-4.18.0-348.2.1.el8_5.x86_64"
index=2
kernel="/boot/vmlinuz-4.18.0-305.19.1.el8_4.x86_64"
index=3
kernel="/boot/vmlinuz-4.18.0-305.17.1.el8_4.x86_64"
index=4
kernel="/boot/vmlinuz-0-rescue-723b266ce27e45698c2c0e30032ea83f"
现在继续并进行所需的更改:
$ sudo grubby --set-default-index=3
The default is /boot/loader/entries/723b266ce27e45698c2c0e30032ea83f-4.18.0-305.17.1.el8_4.x86_64.conf with index 3 and kernel /boot/vmlinuz-4.18.0-305.17.1.el8_4.x86_64
通过重新启动系统来应用更改。
sudo reboot -i
将自动选择默认内核,如下所示。
可以使用以下命令列出所有菜单项的信息:
$ sudo grubby --info=ALL
index=0
kernel="/boot/vmlinuz-4.18.0-348.2.1.el8_5.x86_64"
args="ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap $tuned_params"
root="/dev/mapper/cl-root"
initrd="/boot/initramfs-4.18.0-348.2.1.el8_5.x86_64.img"
title="Linux_Test_Kernel"
id="723b266ce27e45698c2c0e30032ea83f-4.18.0-348.2.1.el8_5.x86_64.0~custom"
index=1
kernel="/boot/vmlinuz-4.18.0-348.2.1.el8_5.x86_64"
args="ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap $tuned_params"
root="/dev/mapper/cl-root"
initrd="/boot/initramfs-4.18.0-348.2.1.el8_5.x86_64.img $tuned_initrd"
title="Red Hat Enterprise Linux (4.18.0-348.2.1.el8_5.x86_64) 8.5 (Ootpa)"
id="723b266ce27e45698c2c0e30032ea83f-4.18.0-348.2.1.el8_5.x86_64"
index=2
kernel="/boot/vmlinuz-4.18.0-305.19.1.el8_4.x86_64"
args="ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap $tuned_params"
root="/dev/mapper/cl-root"
initrd="/boot/initramfs-4.18.0-305.19.1.el8_4.x86_64.img $tuned_initrd"
title="Red Hat Enterprise Linux (4.18.0-305.19.1.el8_4.x86_64) 8.4 (Ootpa)"
id="723b266ce27e45698c2c0e30032ea83f-4.18.0-305.19.1.el8_4.x86_64"
..........
您还可以查看特定内核的 GRUB 菜单。
$ sudo grubby --info /boot/vmlinuz-4.18.0-305.19.1.el8_4.x86_64
index=2
kernel="/boot/vmlinuz-4.18.0-305.19.1.el8_4.x86_64"
args="ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap $tuned_params"
root="/dev/mapper/cl-root"
initrd="/boot/initramfs-4.18.0-305.19.1.el8_4.x86_64.img $tuned_initrd"
title="Red Hat Enterprise Linux (4.18.0-305.19.1.el8_4.x86_64) 8.4 (Ootpa)"
id="723b266ce27e45698c2c0e30032ea83f-4.18.0-305.19.1.el8_4.x86_64"
3.删除内核条目
如果您想删除某个内核条目,请使用该语法。
$ sudo grubby --remove-kernel=old_kernel
或者:
sudo grubby --remove-kernel=menu_index
注意:删除不正确内核的内核条目可能会导致您的系统无法启动,因此需要启动到单用户模式来修复此错误。
4. 添加新的内核参数
您可以使用以下语法向内核添加参数:
sudo grubby --update-kernel=current_kernel --args="kernel_args"
实际上,假设我想在默认内核上禁用 IPV6;
sudo grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="ipv6.disable=1"
您可以按如下方式验证所做的更改:
# 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
一个新的参数也可以添加到所有可用的内核中:
sudo grubby --update-kernel=ALL --args="kernel_args"
5. 删除内核参数
内核参数也可以从内核引导条目中删除。通常使用的语法如下:
grubby --update-kernel=current_kernel --remove-args="kernel_args"
现在要删除先前添加到上面的默认内核中的 IPV6 禁用参数,请使用:
sudo grubby --update-kernel=/boot/vmlinuz-$(uname -r) --remove-args="ipv6.disable=1"
您可以删除所有内核条目的参数,如下所示:
sudo grubby --update-kernel=ALL --remove-args="kernel_args"
6. 删除和添加内核参数
可以使用 Grubby 通过单个命令删除和添加内核参数,语法如下:
sudo grubby --remove-args="kernel-args" --args="kernel_args"
例如,我将删除 IPv6 禁用并添加新参数 console=ttys0,如下所示。
$ sudo grubby --update-kernel=/boot/vmlinuz-$(uname -r) \
--remove-args="ipv6.disable=1" \
--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
结束!
结束语:
学习就够了!我们系统地介绍了如何使用 grubby 在 Linux 上修改 grub.cfg 配置。我们都同意这个工具非常酷。我希望你喜欢它。
查看更多:
- 如何在 Ubuntu/Linux Mint 上安装 Linux 内核 5.x
- 如何将 CentOS 8 转换为 RHEL 8 服务器
- 安装和使用 ArchiveBox 自托管互联网归档
- 使用 Terraform 和 cf-terraforming 管理现有 Cloudflare 记录