18 引导加载程序 GRUB 2 #
本章介绍如何配置 SUSE® Linux Enterprise Desktop 中使用的引导加载程序 GRUB 2。GRUB 是传统 GRUB 引导加载程序(现在称作“GRUB Legacy”)的后继产品。从 SUSE® Linux Enterprise Desktop 12 版开始,就已使用 GRUB 2 作为默认的引导加载程序。产品中提供了一个 YaST 模块来配置最重要的设置。第 16 章 “引导过程简介” 中将引导过程作为一个整体进行了介绍。有关 UEFI 计算机的安全引导支持的细节,请参见第 17 章 “UEFI(统一可扩展固件接口)”。
18.1 GRUB Legacy 与 GRUB 2 之间的主要差异 #
配置存储在不同的文件中。
支持更多的文件系统(例如 Btrfs)。
可以直接读取 LVM 或 RAID 设备上存储的文件。
用户界面可翻译,并可以改变主题。
包含一项用于加载模块的机制,以支持更多功能,例如文件系统等。
自动搜索和生成其他内核与操作系统(例如 Windows)的引导项。
包含一个类似于 Bash 的精简控制台。
18.2 配置文件结构 #
GRUB 2 的配置基于以下文件:
/boot/grub2/grub.cfg
此文件包含 GRUB 2 菜单项的配置。它替代了 GRUB Legacy 中的
menu.lst
。不要编辑grub.cfg
— 它是由命令grub2-mkconfig -o /boot/grub2/grub.cfg
自动生成的。/boot/grub2/custom.cfg
grub.cfg
会在系统引导时直接检索此可选文件,使用该文件可向引导菜单添加自定义项。从 SUSE Linux Enterprise Desktop 12 SP2 开始,使用grub-once
时也会分析这些项。/etc/default/grub
此文件控制 GRUB 2 的用户设置,通常包含背景和主题等其他环境设置。
/etc/grub.d/
下的脚本在执行
grub2-mkconfig -o /boot/grub2/grub.cfg
命令期间,系统会读取此目录中的脚本。主配置文件/boot/grub/grub.cfg
中集成了这些脚本的指令。/etc/sysconfig/bootloader
此配置文件用于保存一些基本设置,例如引导加载程序类型,以及是否启用 UEFI 安全引导支持。
/boot/grub2/x86_64-efi
,/boot/grub2/power-ieee1275
这些配置文件包含特定于体系结构的选项。
GRUB 2 可以通过多种方式进行控制。可以在图形菜单(启动屏幕)中选择现有配置的引导项。配置从文件 /boot/grub2/grub.cfg
加载,而该文件是基于其他配置文件编译的(参见下文)。所有 GRUB 2 配置文件都视为系统文件,编辑这些配置文件需要拥有 root
特权。
手动编辑 GRUB 2 配置文件后,需要运行grub2-mkconfig -o /boot/grub2/grub.cfg
以激活更改。但使用 YaST 更改配置时就不需要如此,因为 YaST 会自动运行此命令。
18.2.1 文件 /boot/grub2/grub.cfg
#
带有引导菜单的图形启动屏幕上的内容取决于 GRUB 配置文件 /boot/grub2/grub.cfg
,该文件包含有关可以通过菜单引导的所有分区或操作系统的信息。
系统每次引导时,GRUB 2 会直接从文件系统加载菜单文件。因此,在更改配置文件后不需要重新安装 GRUB 2。安装或去除内核后,系统会自动重构建 grub.cfg
。
grub.cfg
是在运行 grub2-mkconfig -o /boot/grub2/grub.cfg
命令时,基于文件 /etc/default/grub
以及 /etc/grub.d/
目录中的脚本编译的。因此,切勿手动编辑该文件,而应该编辑相关的源文件,或者根据第 18.3 节 “使用 YaST 配置引导加载程序”中所述,使用 YaST 模块来修改配置。
18.2.2 文件 /etc/default/grub
#
此文件包含 GRUB 2 的其他常规选项,例如,显示菜单的时间,或者要引导的默认操作系统。要列出所有可用选项,请查看以下命令的输出:
>
grep "export GRUB_DEFAULT" -A50 /usr/sbin/grub2-mkconfig | grep GRUB_
您可以引入自定义变量,稍后在位于 /etc/grub.d
目录中的脚本中使用它们。
编辑 /etc/default/grub
后,请使用 grub2-mkconfig -o
/boot/grub2/grub.cfg
更新主配置文件。
此文件中指定的所有选项都是会影响所有引导项的常规选项。与 Xen 超级管理程序相关的选项包含 _XEN_
子字符串。
更复杂的带空格选项需要加上引号,以便整体作为一个选项处理。此类内部引号需要以正确的方式转义,例如:
GRUB_CMDLINE_LINUX_XEN="debug loglevel=9 log_buf_len=5M \"ddebug_query=file drivers/xen/xen-acpi-processor.c +p\""
GRUB_DEFAULT
设置默认会引导的引导菜单项。它的值可以是数字值、菜单项的完整名称或“saved”。
GRUB_DEFAULT=2
引导第三个(从零开始计数)引导菜单项。GRUB_DEFAULT="2>0"
会引导第三个顶级菜单项的第一个子菜单项。GRUB_DEFAULT="Example boot menu entry"
会引导名为“Example boot menu entry”的菜单项。GRUB_DEFAULT=saved
会引导grub2-once
或grub2-set-default
命令指定的项。grub2-reboot
只设置下一次重引导的默认引导项,而grub2-set-default
设置的是永久的默认引导项,直至其被更改。grub2-editenv list
列出下一个引导项。GRUB_HIDDEN_TIMEOUT
等待用户按某个键的指定秒数。在此期间,除非用户按下某个键,否则不显示菜单。如果用户在指定的时间内未按任何键,控制权将转交给
GRUB_TIMEOUT
。GRUB_HIDDEN_TIMEOUT=0
首先会检查是否按下了 Shift,如果是,则显示引导菜单,否则会立即引导默认的菜单项。如果 GRUB 2 只识别了一个可引导操作系统,则默认行为就是如此。GRUB_HIDDEN_TIMEOUT_QUIET
如果指定
false
,并且启用了GRUB_HIDDEN_TIMEOUT
功能,将会在一个空白屏幕上显示倒数计时器。GRUB_TIMEOUT
在自动引导默认引导项之前,显示引导菜单的期限(以秒为单位)。如果按下某个键,则会取消超时,GRUB 2 将等待您手动做出选择。如果指定
GRUB_TIMEOUT=-1
,则在您手动选择引导项之前,菜单会一直显示。GRUB_CMDLINE_LINUX
此行中的项将添加到正常模式和恢复模式的引导项末尾。使用它可以向引导项添加内核参数。
GRUB_CMDLINE_LINUX_DEFAULT
与
GRUB_CMDLINE_LINUX
一样,但只能在正常模式下追加项。GRUB_CMDLINE_LINUX_RECOVERY
与
GRUB_CMDLINE_LINUX
一样,但只能在恢复模式下追加项。GRUB_CMDLINE_LINUX_XEN_REPLACE
此项将替代所有 Xen 引导项的
GRUB_CMDLINE_LINUX
参数。GRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT
与
GRUB_CMDLINE_LINUX_XEN_REPLACE
一样,但只会替代GRUB_CMDLINE_LINUX_DEFAULT
的参数。GRUB_CMDLINE_XEN
这些项会传递给 Xen 超级管理程序的正常模式和恢复模式 Xen 菜单项。例如:
GRUB_CMDLINE_XEN="loglvl=all guest_loglvl=all"
提示:Xen 超级管理程序选项有关 Xen 超级管理程序选项的完整列表,请访问 https://xenbits.xen.org/docs/unstable/misc/xen-command-line.html
GRUB_CMDLINE_XEN_DEFAULT
与
GRUB_CMDLINE_XEN
一样,但只能在正常模式下追加项。GRUB_TERMINAL
启用和指定输入/输出终端设备。可以是
console
(PC BIOS 和 EFI 控制台)、serial
(串行终端)、ofconsole
(开放式固件控制台)或默认值gfxterm
(图形模式输出)。用引号括住所需的选项可以启用多个设备,例如GRUB_TERMINAL="console serial"
。GRUB_GFXMODE
gfxterm
图形终端使用的分辨率。只能使用您的显卡 (VBE) 支持的模式。默认值为“auto”,即尝试选择首选的分辨率。在 GRUB 2 命令行中键入videoinfo
可以显示 GRUB 2 适用的屏幕分辨率。GRUB 2 引导菜单屏幕显示后,键入 C 即可访问命令行。您还可以指定颜色深度,方法是将其值追加到分辨率设置的后面,例如
GRUB_GFXMODE=1280x1024x24
。GRUB_BACKGROUND
设置
gfxterm
图形终端的背景图像。该图像必须是 GRUB 2 可在系统引导时读取的文件,并且必须以.png
、.tga
、.jpg
或.jpeg
后缀结尾。必要时,系统会缩放该图像以适合屏幕。GRUB_DISABLE_OS_PROBER
如果将此选项设置为
true
,将禁用自动搜索其他操作系统的功能。系统只会检测/boot/
中的内核映像,以及/etc/grub.d/
中您自己的脚本内的选项。SUSE_BTRFS_SNAPSHOT_BOOTING
如果将此选项设置为
true
,GRUB 2 可直接引导至 Snapper 快照。有关详细信息,请参见第 10.3 节 “通过从快照引导来执行系统回滚”。
要显示完整的选项列表,请参见 GNU GRUB manual。
18.2.3 /etc/grub.d
中的脚本 #
在执行 grub2-mkconfig -o /boot/grub2/grub.cfg
命令期间,系统会读取此目录中的脚本。脚本的指令将整合到 /boot/grub2/grub.cfg
中。grub.cfg
中菜单项的顺序由此目录中文件的运行顺序来决定。具有前导编号的文件先执行,从最小的编号开始。00_header
在 10_linux
之前运行,而后者又在 40_custom
之前运行。如果存在采用字母名称的文件,这些文件将在采用编号命名的文件后面执行。在执行 grub2-mkconfig
期间,只有可执行文件才能在 grub.cfg
中生成输出。默认情况下,/etc/grub.d
目录中的所有文件都是可执行文件。
grub.cfg
中
由于每次运行 grub2-mkconfig
时都会重新编译 /boot/grub2/grub.cfg
,因此所有自定义内容都会丢失。要想直接在 /boot/grub2/grub.cfg
中插入行并让这些行在运行 grub2-mkconfig
后不丢失,需要将它们插入以下两行之间
### BEGIN /etc/grub.d/90_persistent ###
和
### END /etc/grub.d/90_persistent ###
90_persistent
脚本可确保此类内容会保留下来。
下面列出了最重要的脚本:
00_header
设置环境变量,例如系统文件位置、显示设置、主题和以前保存的项。它还可以导入
/etc/default/grub
中存储的首选项。通常,不需要对此文件进行更改。10_linux
识别根设备上的 Linux 内核,并创建相关的菜单项。这包括关联的恢复模式选项(如果已启用)。主菜单页中只显示最新内核,其他内核包含在子菜单中。
30_os-prober
此脚本使用
os-prober
来搜索 Linux 和其他操作系统,并将结果列于 GRUB 2 菜单中。其中的某些部分可以识别其他特定操作系统,例如 Windows 或 macOS。40_custom
使用此文件可以方便地在
grub.cfg
中包含自定义引导项。切勿更改开头的exec tail -n +3 $0
部分。
处理顺序根据前导编号确定,编号最小的脚本最先执行。如果多个脚本的前导编号相同,则根据整个名称的字母顺序来决定执行顺序。
/boot/grub2/custom.cfg
如果您创建了 /boot/grub2/custom.cfg
并在其中填充了内容,系统会在引导时自动将它包含到 /boot/grub2/grub.cfg
中,放置在 40_custom
的后面。
18.2.4 BIOS 驱动器与 Linux 设备之间的映射 #
在 GRUB Legacy 中,device.map
配置文件用于基于 BIOS 驱动器号派生 Linux 设备名称。不一定总能正确猜测出 BIOS 驱动器与 Linux 设备之间的映射。例如,如果 IDE 和 SCSI 驱动器的引导顺序在 BIOS 配置中被交换,则 GRUB Legacy 就会发生顺序错误。
GRUB 2 在生成 grub.cfg
时使用设备 ID 字符串 (UUID) 或文件系统标签,因此避免了此问题。GRUB 2 实用程序会即时创建一个临时设备映射,这通常足以满足需要,尤其是在单磁盘系统上。
但是,如果您需要覆盖 GRUB 2 的自动设备映射机制,请创建自定义映射文件 /boot/grub2/device.map
。以下示例将更改映射,使 DISK 3
成为引导磁盘。GRUB 2 分区编号从 1
开始,而不是像 GRUB 2 Legacy 中那样从 0
开始。
(hd1) /dev/disk-by-id/DISK3 ID (hd2) /dev/disk-by-id/DISK1 ID (hd3) /dev/disk-by-id/DISK2 ID
18.2.6 设置引导口令 #
即使在操作系统引导之前,GRUB 2 也支持对文件系统的访问。没有 root 权限的用户可以访问 Linux 系统中的文件,而在引导系统后,他们将无权访问这些文件。要阻止此类访问或防止用户引导某些菜单项,请设置引导口令。
如果设置了引导口令,则每次引导时都需要输入该口令,这意味着系统不会自动引导。
使用
grub2-mkpasswd-pbkdf2:
来加密口令:>
sudo
grub2-mkpasswd-pbkdf2 Password: **** Reenter password: **** PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.9CA4611006FE96BC77A...将生成的字符串连同
set superusers
命令一起粘贴到文件/etc/grub.d/40_custom
中。set superusers="root" password_pbkdf2 root grub.pbkdf2.sha512.10000.9CA4611006FE96BC77A...
要将更改导入到主要配置文件中,请运行:
>
sudo
grub2-mkconfig -o /boot/grub2/grub.cfg
在重引导后,当您尝试引导某个菜单项时,GRUB 2 会提示您输入用户名和口令。输入 root
以及您在执行 grub2-mkpasswd-pbkdf2
命令期间键入的口令。如果身份凭证正确,系统将引导选定的引导项。
有关详细信息,请参见https://www.gnu.org/software/grub/manual/grub/grub.html#Security。
18.2.7 引导菜单项的授权访问权限 #
您可以将 GRUB 2 配置为允许根据授权级别访问引导菜单项。您可以配置多个受口令保护的用户帐户,并向其分配不同菜单项的访问权限。要在 GRUB 2 中配置授权,请执行以下步骤:
为要在 GRUB 2 中使用的每个用户帐户创建一个口令并进行加密。按第 18.2.6 节 “设置引导口令”中所述使用
grub2-mkpasswd-pbkdf2
命令。删除文件
/etc/grub.d/10_linux
。这样可以防止输出默认的 GRUB 2 菜单项。编辑
/boot/grub2/custom.cfg
文件,并手动添加自定义菜单项。下面的模板是一个示例,请调整该模板,使其更适合您的用例:set superusers=admin password admin ADMIN_PASSWORD password maintainer MAINTAINER_PASSWORD menuentry 'Operational mode' { insmod ext2 set root=hd0,1 echo 'Loading Linux ...' linux /boot/vmlinuz root=/dev/vda1 $GRUB_CMDLINE_LINUX_DEFAULT $GRUB_CMDLINE_LINUX mode=operation echo 'Loading Initrd ...' initrd /boot/initrd } menuentry 'Maintenance mode' --users maintainer { insmod ext2 set root=hd0,1 echo 'Loading Linux ...' linux /boot/vmlinuz root=/dev/vda1 $GRUB_CMDLINE_LINUX_DEFAULT $GRUB_CMDLINE_LINUX mode=maintenance echo 'Loading Initrd ...' initrd /boot/initrd }
将更改导入到主配置文件中:
>
sudo
grub2-mkconfig -o /boot/grub2/grub.cfg
在上面的示例中:
GRUB 2 菜单包含以下两项:
和 。如果未指定用户,则两个引导菜单项都可以访问,但任何人都无法访问 GRUB 2 命令行或编辑现有菜单项。
admin
用户可访问 GRUB 2 命令行并编辑现有的菜单项。maintenance
用户可选择恢复菜单项。
18.3 使用 YaST 配置引导加载程序 #
在 SUSE Linux Enterprise Desktop 系统中,配置引导加载程序一般选项最简单的方式就是使用 YaST 模块。在 ,选择 › 。该模块会显示您系统的当前引导加载程序配置,并允许您进行更改。
使用
选项卡可查看和更改类型、位置和高级加载程序设置的相关设置。您可以选择要在标准模式还是 EFI 模式下使用 GRUB 2。如果您使用的是 EFI 系统,则只能安装 GRUB2-EFI,否则您的系统不再能够引导。
要重新安装引导加载程序,请务必在 YaST 中更改设置,然后再将其改回来。例如,要重新安装 GRUB2-EFI,请先选择
,然后立即将其切换回 。否则,可能只会重新安装引导加载程序的一部分。
要使用此处未列出的引导加载程序,请选择
。在选择该选项之前,请仔细阅读您的引导加载程序文档。18.3.1 引导加载程序位置和引导代码选项 #
引导加载程序的默认位置为主引导记录 (MBR) 或 /
分区的引导扇区,具体视分区设置而定。要修改引导加载程序的位置,请遵循以下步骤:
选择
选项卡,然后为 选择以下某个选项:选择此选项会在包含
/boot
目录的磁盘 MBR 中安装引导加载程序。通常,这将是挂载到/
的磁盘,但如果/boot
挂载到其他磁盘上的独立分区中,将会使用该磁盘的 MBR。选择此选项会在
/
分区的引导扇区中安装引导加载程序。手动使用此选项来指定引导加载程序的位置。
单击
以应用更改。
选项卡包含以下额外的选项:
激活包含
/boot
目录的分区。对于 POWER 系统,则会激活 PReP 分区。此选项用于具有旧 BIOS 的系统和/或旧式操作系统,因为它们可能无法从非活动的分区引导。您可以放心地启用此选项。如果 MBR 包含自定义的“非 GRUB”代码,此选项会用不受操作系统限制的通用代码替换该代码。如果您停用此选项,系统可能变得无法引导。
启动支持可信计算功能(可信平台模块 (TPM))的 TrustedGRUB2。有关详细信息,请参见https://github.com/Sirrix-AG/TrustedGRUB2。
部分包含以下选项:
适用于传统旧式 BIOS 引导。
适用于 UEFI 引导。
如果您已有一个正常运行的系统,这通常是最适合的选项。
大多数情况下,YaST 默认会使用适合的选项。
18.3.2 调整磁盘顺序 #
如果您的计算机有多个硬盘,您可以指定磁盘的引导顺序。如果从 MBR 引导,将在列表中的第一个磁盘中安装 GRUB 2。默认在该磁盘中安装 SUSE Linux Enterprise Desktop。列表的其余部分是有关 GRUB 2 的设备映射程序的提示(请参见第 18.2.4 节 “BIOS 驱动器与 Linux 设备之间的映射”)。
通常情况下,默认值几乎对所有部署都有效。如果您错误地更改了磁盘的引导顺序,系统下次重引导时可能无法引导。例如,如果列表中的第一个磁盘不在 BIOS 引导序列中,并且列表中的其他磁盘有空 MBR,系统将无法引导。
打开
选项卡。单击
。如果列出了多个磁盘,请选择一个,然后单击
或 来对显示的磁盘重新排序。单击
两次以保存更改。
18.3.3 配置高级选项 #
可以通过
选项卡来配置高级引导参数。18.3.3.1 选项卡 #
通过键入新值或者用鼠标单击相应的方向键来更改
的值。如果选择该选项,引导加载程序将会搜索其他系统(例如 Windows)或其他 Linux 安装。
隐藏引导菜单并引导默认项。
从“默认引导部分”列表中选择所需的项。请注意,引导项名称中的“>”符号用于分隔引导部分及其子部分。
使用一个附加的口令保护引导加载程序和系统。有关手动配置的细节,请参见第 18.2.6 节 “设置引导口令”。如果激活此选项,则每次引导时都需要输入该引导口令,这意味着系统不会自动引导。但是,如果您更喜欢 GRUB 1 的行为方式,请额外启用 。使用此设置时,任何人都可以选择引导项并引导系统,仅在修改引导项时,才需要提供 GRUB 2
root
用户的口令。
18.3.3.2 选项卡 #
在此处指定可选的内核参数,以启用/禁用系统功能、添加驱动程序,等等。
SUSE 针对为防御 CPU 边信道攻击而部署的所有软件缓解措施发布了一个或多个内核引导命令行参数。其中一些参数可能会导致性能损失。请根据您的设置选择以下其中一个选项,在安全性和性能之间取得平衡:
启用您的 CPU 型号所需的全部缓解措施,但不防范跨 CPU 线程的攻击。此设置可能会在一定程度上影响性能,具体视工作负载而定。 :
提供整套可用的安全缓解措施。启用您的 CPU 型号所需的全部缓解策略。此外,它还会禁用同步多线程 (SMT),以免受到跨多个 CPU 线程发起的边信道攻击。此设置可能会进一步影响性能,具体取决于工作负载。 :
禁用所有缓解措施。CPU 可能会遭到边信道攻击,具体取决于 CPU 型号。此设置不会对性能造成任何影响。 :
不设置任何缓解措施级别。请使用内核命令行选项手动指定 CPU 缓解措施。 :
如果选中该选项,引导菜单会显示在图形启动屏幕中,而不是以文本模式显示。默认情况下,系统会自动设置引导屏幕的分辨率,但您可以通过
手动进行设置。可以使用 文件选择器指定图形主题定义文件。请仅在您想要应用自己的定制主题时,才更改此设置。如果您的计算机是通过串行控制台控制的,则可激活此选项并指定要使用的 COM 端口及其运行速度。请参阅
info grub
或 https://www.gnu.org/software/grub/manual/grub.html#Serial-terminal。
18.4 有用的 GRUB 2 命令 #
grub2-mkconfig
基于
/etc/default/grub
以及/etc/grub.d/
中的脚本生成新的/boot/grub2/grub.cfg
。例 18.1︰ grub2-mkconfig 用法 #grub2-mkconfig -o /boot/grub2/grub.cfg
提示:语法检查运行不带任何参数的
grub2-mkconfig
会将配置打印到 STDOUT 中供用户查看。在写入/boot/grub2/grub.cfg
后使用grub2-script-check
可以检查其语法。重要:grub2-mkconfig
无法修复 UEFI 安全引导表如果您使用的是 UEFI 安全引导,而您的系统无法再正常连接 GRUB 2,您可能需要另外重新安装 Shim 并重新生成 UEFI 引导表。要执行此操作,请使用:
#
shim-install --config-file=/boot/grub2/grub.cfggrub2-mkrescue
为安装的 GRUB 2 配置创建一个可引导的救援映像。
例 18.2︰ grub2-mkrescue 用法 #grub2-mkrescue -o save_path/name.iso iso
grub2-script-check
检查给定文件中有无语法错误。
例 18.3︰ grub2-script-check 用法 #grub2-script-check /boot/grub2/grub.cfg
grub2-once
仅设置下次引导的默认引导项。要获取可用引导项的列表,请使用
--list
选项。例 18.4︰ grub2-once 用法 #grub2-once number_of_the_boot_entry
提示:grub2-once
help不使用任何选项调用该程序可以获取所有可用选项的完整列表。
18.5 救援模式 #
救援模式是一个特定的 root
用户会话,用于对引导过程失败的系统进行故障排除和修复。它提供了一个单用户环境,其中本地文件系统和核心系统服务处于活动状态。网络接口未激活。要进入救援模式,请按照下列步骤操作。
重新启动系统。引导屏幕将会出现,其中会显示 GRUB 2 引导菜单。
选择要引导的菜单项,然后按 e 编辑引导行。
在包含内核参数的行中追加以下参数:
systemd.unit=rescue.target
按 Ctrl+X 键,使用这些设置引导系统。
输入
root
的口令。进行必要的一切更改。
在命令行中输入
systemctl isolate multi-user.target
或systemctl isolate graphical.target
,以重新进入正常运行的目标。
18.6 更多信息 #
您可以访问 https://www.gnu.org/software/grub/,查看有关 GRUB 2 的大量信息,另外还可参见 grub
信息页面。您也可以在技术信息搜索页面 (https://www.suse.com/support) 中搜索关键字“GRUB 2”,以获取有关特殊问题的信息。