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
文件不会影响创建自定义菜单。
-
在基于 BIOS 的机器上,复制
/boot/grub2/grub.cfg
或 UEFI 计算机上的内容,复制/boot/efi/EFI/redhat/grub.cfg
的内容。将grub.cfg
的内容放在现有标题行的/etc/grub.d/40_custom
文件中。必须保留40_custom
脚本的可执行部分。 从放入
/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 }
从
/etc/grub.d/
目录中除以下内容外删除所有文件:-
00_header
, -
40_custom
, -
01_users
(如果存在) 和
README
.或者,如果您要将文件保存在
/etc/grub2.d/
目录中,通过运行chmod a-x <file_name>
命令使其不可执行。
-
-
根据需要编辑、添加或删除
40_custom
文件中的菜单条目。 运行
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