Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

26.5. 自定义 GRUB 2 配置文件

GRUB 2 脚本搜索用户的计算机并根据脚本找到的操作系统构建引导菜单。为了反映最新的系统引导选项,当内核更新或添加新内核时,会自动重新构建引导菜单。

但是,用户可能希望构建包含特定条目的菜单,或者按特定顺序拥有条目。GRUB 2 允许基本自定义引导菜单,使用户能够控制屏幕上实际显示的内容。

GRUB 2 使用一系列脚本来构建菜单;它们位于 /etc/grub.d/ 目录中。包括以下文件:

  • 00_header,它将从 /etc/default/grub 文件中加载 GRUB 2 设置。
  • 01_users,从 user.cfg 文件中读取超级用户密码。在 Red Hat Enterprise Linux 7.0 和 7.1 中,该文件仅在安装期间在 kickstart 文件中定义引导密码时创建,并且该文件以纯文本形式包含定义的密码。
  • 10_Linux,在 Red Hat Enterprise Linux 的默认分区中找到内核。
  • 30_OS-prober,为其他分区上的操作系统构建条目。
  • 40_custom,模板,可用于创建额外的菜单条目。

/etc/grub.d/ 目录中的脚本按字母顺序读取,因此可重命名为更改特定菜单条目的引导顺序。

重要

要隐藏可引导内核列表,请不要在 /etc/default/grub 中将 GRUB_TIMEOUT 设置为 0。使用此类设置时,系统始终会在默认菜单条目中立即启动,如果默认内核无法引导,则无法引导较早的内核。

相反,为了避免 GRUB 2 在系统启动时显示可引导内核列表,请在 /etc/default/grub 文件中设置 GRUB_TIMEOUT_STYLE 选项,如下所示:

GRUB_TIMEOUT_STYLE=hidden

要在引导时显示列表,请在使用键盘或其他串行控制台显示 BIOS 信息时按 并按住任何字母数字键,并且 GRUB 2 将为您提供 GRUB 2 菜单。

26.5.1. 更改默认引导条目

默认情况下,/etc/default/grub 文件中的 GRUB_DEFAULT 指令的键是 保存 的词语。这指示 GRUB 2 将 saved_entry 指令指定的内核加载到位于 /boot/grub2/grubenv 的 GRUB 2 环境文件中。您可以使用 grub2-set-default 命令将另一个 GRUB 2 记录设置为默认值,该命令将更新 GRUB 2 环境文件。

默认情况下,saved_entry 值被设置为软件包类型为内核的最新安装的内核的名称 这在 /etc/sysconfig/kernel 中由 UPDATEDAULT 和DEFAULT KERNEL 指令定义。该文件可由 root 用户查看,如下所示:

~]# cat /etc/sysconfig/kernel
# UPDATEDEFAULT specifies if new-kernel-pkg should make
# new kernels the default
UPDATEDEFAULT=yes

# DEFAULTKERNEL specifies the default kernel package type
DEFAULTKERNEL=kernel

The DEFAULTKERNEL 指令指定将用作默认软件包类型。安装类型为 kernel-debug 的软件包不会更改默认内核,而 DEFAULTKERNEL 设置为软件包类型 内核

GRUB 2 支持使用数字值作为 saved_entry 指令的键,以更改载入操作系统的默认顺序。要指定应首先加载的操作系统,请将编号传递到 grub2-set-default 命令。例如:

~]# grub2-set-default 2

请注意,列表中菜单条目的位置由以零开头的数字表示;因此,在上面的示例中,将加载第三个条目。该值将被要安装的下一个内核的名称覆盖。

要强制系统始终使用特定的菜单条目,请使用菜单条目名称作为 /etc/default/grub 文件中的 GRUB_DEFAULT 指令的密钥。要列出可用的菜单条目,以 root 用户身份运行以下命令:

~]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg

文件名 /etc/grub2.cfg 是指向 grub.cfg 文件的符号链接,其位置取决于架构。出于可靠性的原因,本章中的其他示例不使用该符号链接。最好在写入文件时使用绝对路径,特别是在修复系统时。

/etc/default/grub 的更改需要重新构建 grub.cfg 文件,如下所示:

  • 在基于 BIOS 的机器中,以 root 用户身份运行以下命令:

    ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
  • 在基于 UEFI 的机器中,以 root 用户身份运行以下命令:

    ~]# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

26.5.2. 编辑菜单条目

如果需要,使用不同的参数准备新的 GRUB 2 文件,请在 /etc/default/grub 文件中编辑 GRUB_CMDLINE_LINUX 键的值。请注意,您可以为 GRUB_CMDLINE_LINUX 密钥指定多个参数,这与在 GRUB 2 引导菜单中添加参数类似。例如:

GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,9600n8"

console=tty0 是第一个虚拟终端,console=ttyS0 是要使用的串行终端。

/etc/default/grub 的更改需要重新构建 grub.cfg 文件,如下所示:

  • 在基于 BIOS 的机器中,以 root 用户身份运行以下命令:

    ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
  • 在基于 UEFI 的机器中,以 root 用户身份运行以下命令:

    ~]# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

26.5.3. 添加新条目

执行 grub2-mkconfig 命令时,GRUB 2 根据位于 /etc/grub.d/ 目录中的文件搜索 Linux 内核和其他操作系统。/etc/grub.d/10_linux 脚本搜索同一分区上已安装的 Linux 内核。/etc/grub.d/30_os-prober 脚本将搜索其他操作系统。更新内核时,菜单条目也会自动添加到引导菜单中。

位于 /etc/grub.d/ 目录中的 40_custom 文件是自定义条目的模板,如下所示:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.

可以编辑或复制此文件。请注意,一个有效的菜单条目必须至少包含以下项:

menuentry "<Title>"{
<Data>
}

26.5.4. 创建自定义菜单

如果您不希望菜单项自动更新,您可以创建自定义菜单。

重要

在继续之前,如果您需要稍后恢复更改,请备份 /etc/grub.d/ 目录的内容。

注意

请注意,修改 /etc/default/grub 文件不会影响创建自定义菜单。

  1. 在基于 BIOS 的机器上,复制 /boot/grub2/grub.cfg 或 UEFI 计算机上的内容,复制 /boot/efi/EFI/redhat/grub.cfg 的内容。将 grub.cfg 的内容放在现有标题行的 /etc/grub.d/40_custom 文件中。必须保留 40_custom 脚本的可执行部分。
  2. 从放入 /etc/grub.d/40_custom 文件中的内容,仅需要 菜单输入 块来创建自定义菜单。/boot/grub2/grub.cfg/boot/efi/EFI/redhat/grub.cfg 文件可能会在 菜单输入 块的上方、下面包含功能规格和其他内容。如果您将这些不必要的行放在上一步中的 40_custom 文件中,请将其清除。

    这是自定义 40_custom 脚本的示例

    #!/bin/sh
    exec tail -n +3 $0
    # This file provides an easy way to add custom menu entries. Simply type the
    # menu entries you want to add after this comment. Be careful not to change
    # the 'exec tail' line above.
    
    menuentry 'First custom entry' --class red --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.10.0-67.el7.x86_64-advanced-32782dd0-4b47-4d56-a740-2076ab5e5976' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_msdos
        insmod xfs
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
         search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 7885bba1-8aa7-4e5d-a7ad-821f4f52170a
        else
         search --no-floppy --fs-uuid --set=root 7885bba1-8aa7-4e5d-a7ad-821f4f52170a
        fi
        linux16 /vmlinuz-3.10.0-67.el7.x86_64 root=/dev/mapper/rhel-root ro rd.lvm.lv=rhel/root vconsole.font=latarcyrheb-sun16 rd.lvm.lv=rhel/swap vconsole.keymap=us crashkernel=auto rhgb quiet LANG=en_US.UTF-8
        initrd16 /initramfs-3.10.0-67.el7.x86_64.img
    }
    menuentry 'Second custom entry' --class red --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-0-rescue-07f43f20a54c4ce8ada8b70d33fd001c-advanced-32782dd0-4b47-4d56-a740-2076ab5e5976' {
        load_video
        insmod gzio
        insmod part_msdos
        insmod xfs
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
         search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 7885bba1-8aa7-4e5d-a7ad-821f4f52170a
        else
         search --no-floppy --fs-uuid --set=root 7885bba1-8aa7-4e5d-a7ad-821f4f52170a
        fi
        linux16 /vmlinuz-0-rescue-07f43f20a54c4ce8ada8b70d33fd001c root=/dev/mapper/rhel-root ro rd.lvm.lv=rhel/root vconsole.font=latarcyrheb-sun16 rd.lvm.lv=rhel/swap vconsole.keymap=us crashkernel=auto rhgb quiet
        initrd16 /initramfs-0-rescue-07f43f20a54c4ce8ada8b70d33fd001c.img
    }
  3. /etc/grub.d/ 目录中除以下内容外删除所有文件:

    • 00_header
    • 40_custom,
    • 01_users (如果存在)
    • README.

      或者,如果您要将文件保存在 /etc/grub2.d/ 目录中,通过运行 chmod a-x <file_name> 命令使其不可执行。

  4. 根据需要编辑、添加或删除 40_custom 文件中的菜单条目。
  5. 运行 grub 2-mkconfig -o 命令重建 grub.cfg 文件,如下所示:

    • 在基于 BIOS 的机器中,以 root 用户身份运行以下命令:

      ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
    • 在基于 UEFI 的机器中,以 root 用户身份运行以下命令:

      ~]# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg