更新升级 专属应用 系统故障 硬件故障 电脑汽车 鸿蒙刷机 鸿蒙开发Linux教程 鸿蒙开发Linux命令
当前位置:HMXT之家 > 鸿蒙开发Linux教程 > 使用grubby在Linux系统上修改grub.cfg配置的方法

使用grubby在Linux系统上修改grub.cfg配置的方法

更新时间:2022-01-14 11:26:22浏览次数:947+次

在Linux系统上安装多个内核版本后,这时需要修改GRUB配置。Grubby是一个命令行工具,用于显示和更新lilo、elilo、zipl、yaboot和grub引导加载程序的信息,它通常用于更改grub.cfg文件。Grubby可用于修改内核引导条目、检查和更改默认内核、列出活动安装的内核、从GRUB2菜单条目中添加/删除参数。

入门

检查包含有关的内核版本、初始ramdisk映像和内核opts环境变量的信息的引导条目文件,这些信息通常存储在/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配置的具体方法

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 Jan 13 05:41 /boot/loader/entries/723b266ce27e45698c2c0e30032ea83f-0-rescue.conf

-rw-r--r--. 1 root root 371 Jan 13 05:26 /boot/loader/entries/723b266ce27e45698c2c0e30032ea83f-4.18.0-305.17.1.el8_4.x86_64.conf

-rw-r--r--. 1 root root 371 Jan 13 05:29 /boot/loader/entries/723b266ce27e45698c2c0e30032ea83f-4.18.0-305.19.1.el8_4.x86_64.conf

-rw-r--r--. 1 root root 303 Jan 13 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 Jan 13 06:15 /boot/loader/entries/723b266ce27e45698c2c0e30032ea83f-4.18.0-348.2.1.el8_5.x86_64.conf

2.2.更改默认引导条目

首先列出默认内核,如下所示:

$ sudo grubby --default-kernel

/boot/vmlinuz-4.18.0-348.2.1.el8_5.x86_64

还可以找出默认内核的索引号:

$ sudo grubby --default-index

找出内核标题:

$ 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作为新默认内核。

方法二:使用内核索引

查找所有已安装内核的索引:

$ 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

注意:删除不正确内核的内核条目可能会使Linux系统无法引导,因此需要引导至单用户模式以修复此错误。

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

至此,操作成功。