14 引导加载程序 GRUB 2 #
本章介绍如何配置 SUSE® Linux Enterprise Server 中使用的引导加载程序 GRUB 2。GRUB 是传统 GRUB 引导加载程序(现在称作“GRUB Legacy”)的后继产品。从 SUSE® Linux Enterprise Server 版本 12 开始,就已使用 GRUB 2 作为默认的引导加载程序。产品中提供了一个 YaST 模块来配置最重要的设置。第 12 章 “引导过程简介” 中将引导过程作为一个整体进行了介绍。有关 UEFI 计算机的安全引导支持的细节,请参见第 13 章 “UEFI(统一可扩展固件接口)”。
14.1 GRUB Legacy 与 GRUB 2 之间的主要差异 #
配置储存在不同的文件中。
支持更多的文件系统(例如 Btrfs)。
可以直接读取 LVM 或 RAID 设备上储存的文件。
用户界面可翻译,并可以改变主题。
包含一个用于装载模块的机制,以支持更多功能,例如文件系统等。
自动搜索和生成其他内核与操作系统(例如 Windows)的引导项。
包含一个类似于 Bash 的精简控制台。
14.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 Server 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
、/boot/grub2/s390x
这些配置文件包含特定于体系结构的选项。
可以通过多种方式控制 GRUB 2。可以在图形菜单(启动屏幕)中选择现有配置的引导项。配置从文件 /boot/grub2/grub.cfg
装载,而该文件是基于其他配置文件编译的(参见下文)。所有 GRUB 2 配置文件都被视为系统文件,编辑这些配置文件需要拥有 root
特权。
手动编辑 GRUB 2 配置文件后,需要运行 grub2-mkconfig -o /boot/grub2/grub.cfg
以激活更改。但使用 YaST 更改配置时就不需要如此,因为 YaST 会自动运行 此命令。
14.2.1 /boot/grub2/grub.cfg
文件 #
带有引导菜单的图形启动屏幕内容由 GRUB 2 配置文件 /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/
目录中的脚本编译的。因此,切勿手动编辑该文件,而应该编辑相关的源文件,或者根据第 14.3 节 “使用 YaST 配置引导加载程序”中所述,使用 YaST 模块来修改配置。
14.2.2 /etc/default/grub
文件 #
此文件包含 GRUB 2 的其他常规选项,例如,显示菜单的时间,或者要引导的默认操作系统。要列出所有可用选项,请查看以下命令的输出:
tux >
grep "export GRUB_DEFAULT" -A50 /usr/sbin/grub2-mkconfig | grep GRUB_
除了已定义的变量外,用户还可以引入自己的变量,以后在 /etc/grub.d
目录中的脚本内使用。
编辑 /etc/default/grub
后,请使用 grub2-mkconfig -o /boot/grub2/grub.cfg
更新主要配置文件。
此文件中设置的所有选项是会影响所有引导项的常规选项。通过 GRUB_*_XEN_* 配置选项可以设置 Xen 内核或 Xen 超级管理程序的特定选项。有关细节,请参见下文。
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 guest 内核指定内核参数 — 工作原理与
GRUB_CMDLINE_LINUX
相同。GRUB_CMDLINE_XEN_DEFAULT
与
GRUB_CMDLINE_XEN
一样 — 工作原理与GRUB_CMDLINE_LINUX_DEFAULT
相同。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 快照。有关详细信息,请参见第 7.3 节 “通过从快照引导来执行系统回滚”。
有关选项的完整列表,请参见 GNU GRUB 手册。
14.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/grub40/grub.cfg
中紧接在 40_custom 后面的位置。
14.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 Legacy 中那样以 0
开始。
(hd1) /dev/disk-by-id/DISK3 ID (hd2) /dev/disk-by-id/DISK1 ID (hd3) /dev/disk-by-id/DISK2 ID
14.2.6 设置引导口令 #
即使在操作系统引导之前,GRUB 2 也支持对文件系统的访问。没有 root 权限的用户可以访问 Linux 系统中的文件,而在引导系统后,他们将无权访问这些文件。要阻止此类访问或防止用户引导某些菜单项,请设置引导口令。
如果设置了引导口令,则每次引导时都需要输入该口令,这意味着系统不会自动引导。
使用
grub2-mkpasswd-pbkdf2
来加密口令:tux >
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...
要将更改导入到主要配置文件中,请运行:
tux >
sudo
grub2-mkconfig -o /boot/grub2/grub.cfg
在重引导后,当您尝试引导某个菜单项时,系统会提示您输入用户名和口令。输入 root
以及您在执行 grub2-mkpasswd-pbkdf2
命令期间键入的口令。如果身份凭证正确,系统将引导选定的引导项。
有关详细信息,请参见https://www.gnu.org/software/grub/manual/grub.html#Security。
14.3 使用 YaST 配置引导加载程序 #
在 SUSE Linux Enterprise Server 系统中,配置引导加载程序一般选项最简单的方式就是使用 YaST 模块。在 ,选择 › 。该模块会显示您系统的当前引导加载程序配置,并允许您进行更改。
使用
选项卡可查看和更改类型、位置和高级加载程序设置的相关设置。您可以选择要在标准模式还是 EFI 模式下使用 GRUB 2。如果您使用的是 EFI 系统,则只能安装 GRUB2-EFI,否则您的系统不再能够引导。
要重新安装引导加载程序,请务必在 YaST 中更改设置,然后再将其改回来。例如,要重新安装 GRUB2-EFI,请先选择
,然后立即将其切换回 。否则,可能只会重新安装引导加载程序的一部分。
要使用此处未列出的引导加载程序,请选择
。在选择该选项之前,请仔细阅读您的引导加载程序文档。14.3.1 引导加载程序位置和引导代码选项 #
引导加载程序的默认位置为主引导记录 (MBR) 或 /
分区的引导扇区,具体视分区设置而定。要修改引导加载程序的位置,请遵循以下步骤:
选择
选项卡,然后为 选择以下某个选项:选择此选项将在包含
/boot
目录的磁盘 MBR 中安装引导加载程序。通常,这将是挂载到/
的磁盘,但如果/boot
挂载到其他磁盘上的独立分区中,则将会使用该磁盘的 MBR。这将在
/
分区的引导扇区安装引导加载程序。手动使用此选项来指定引导加载程序的位置。
单击
以应用更改。
选项卡包含以下额外的选项:
激活包含
/boot
目录的分区。对于 POWER 系统,则会激活 PReP 分区。此选项用于具有旧 BIOS 的系统和/或旧式操作系统,因为它们可能无法从非活动的分区引导。您可以放心地启用此选项。如果 MBR 包含自定义的“非 GRUB”代码,此选项会用不受操作系统限制的通用代码替换该代码。如果您停用此选项,系统可能变得无法引导。
启动支持可信计算功能(可信平台模块 (TPM))的 TrustedGRUB2。有关详细信息,请参见https://github.com/Sirrix-AG/TrustedGRUB2。
部分包含以下选项:
适用于传统旧式 BIOS 引导。
适用于 UEFI 引导。
如果您已有一个正常运行的系统,这通常是最适合的选项。
大多数情况下,YaST 默认会使用适合的选项。
14.3.2 调整磁盘顺序 #
如果您的计算机有多个硬盘,您可以指定磁盘的引导顺序。如果从 MBR 引导,将在列表中的第一个磁盘中安装 GRUB 2。默认在该磁盘中安装 SUSE Linux Enterprise Server。列表的其余部分是有关 GRUB 2 的设备映射程序的提示(请参见第 14.2.4 节 “BIOS 驱动器与 Linux 设备之间的映射”)。
通常情况下,默认值几乎对所有部署都有效。如果您错误地更改了磁盘的引导顺序,系统下次重引导时可能无法引导。例如,如果列表中的第一个磁盘不在 BIOS 引导序列中,并且列表中的其他磁盘有空 MBR,系统将无法引导。
打开
选项卡。单击
。如果列出了多个磁盘,请选择一个,然后单击
或 来对显示的磁盘重新排序。单击
两次以保存更改。
14.3.3 配置高级选项 #
可以通过
选项卡来配置高级引导参数。14.3.3.1 选项卡 #
通过键入新值或者用鼠标单击相应的方向键来更改
的值。如果选择该选项,引导加载程序将会搜索其他系统(例如 Windows)或其他 Linux 安装。
隐藏引导菜单并引导默认项。
从“默认引导部分”列表中选择所需的项。请注意,引导项名称中的“>”符号用于分隔引导部分及其子部分。
使用一个附加的口令保护引导加载程序和系统。有关手动配置的细节,请参见第 14.2.6 节 “设置引导口令”。如果激活此选项,则每次引导时都需要输入该引导口令,这意味着系统不会自动引导。但是,如果您更喜欢 GRUB 1 的行为方式,请额外启用 。使用此设置时,任何人都可以选择引导项并引导系统,仅在修改引导项时,才需要提供 GRUB 2
root
用户的口令。
14.3.3.2 选项卡 #
在此处指定可选的内核参数,以启用/禁用系统功能、添加驱动程序,等等。
SUSE 针对为防御 CPU 边信道攻击而部署的所有软件缓解措施发布了一个或多个内核引导命令行参数。其中一些参数可能会导致性能损失。请根据您的设置选择以下其中一个选项,在安全性和性能之间取得平衡:
启用您的 CPU 型号所需的全部缓解措施,但不防范跨 CPU 线程的攻击。此设置可能会在一定程度上影响性能,具体视工作负载而定。 :
提供整套可用的安全缓解措施。启用您的 CPU 型号所需的全部缓解措施。此外,它还会禁用同步多线程 (SMT),以免受到跨多个 CPU 线程发起的边信道攻击。此设置可能会进一步影响性能,具体取决于工作负载。 :
禁用所有缓解措施。CPU 可能会遭到边信道攻击,具体取决于 CPU 型号。此设置不会对性能造成任何影响。 :
不设置任何缓解措施级别。请使用内核命令行选项手动指定 CPU 缓解措施。 :
如果选中该选项,引导菜单会显示在图形启动屏幕中,而不是以文本模式显示。默认情况下,系统会自动设置引导屏幕的分辨率,但您可以通过
手动进行设置。可以使用 文件选择器指定图形主题定义文件。请仅在您想要应用自己的定制主题时,才更改此设置。如果您的计算机是通过串行控制台控制的,则可激活此选项并指定要使用的 COM 端口及其运行速度。请参见
info grub
或 http://www.gnu.org/software/grub/manual/grub.html#Serial-terminal
14.4 IBM Z 上终端使用方式的差异 #
在 3215 和 3270 终端上,光标的移动方式以及在 GRUB 2 中发出编辑命令的方式存在一些差异和限制。
14.4.1 限制 #
- 交互能力
交互性存在严重的限制。键入时通常不能获得直观的反馈。要查看光标所在的位置,请键入下划线 (_)。
注意:3270 与 3215 的对比与 3215 终端相比,3270 终端在显示和刷新屏幕方面要好得多。
- 光标的移动
无法进行“传统的”光标移动操作。Alt、Meta、Ctrl 和光标键不起作用。要移动光标,请使用第 14.4.2 节 “组合键”中列出的组合键。
- 加字符
插入符 (^) 用作控制字符。要键入文本 ^ 后再键入一个字母,请键入 ^、^ 和字母。
- 输入
Enter 键不起作用,请改用 ^–J。
14.4.2 组合键 #
常用的替代键 |
^–J |
确认(“Enter”) |
^–L |
中止,返回前一“状态” | |
^–I |
Tab 键补全(在编辑模式与外壳模式下) | |
菜单模式下可用的键: |
^–A |
移到第一项 |
^–E |
移到最后一项 | |
^–P |
移到上一项 | |
^–N |
移到下一项 | |
^–G |
上移一页 | |
^–C |
下移一页 | |
^–F |
引导选定的项或进入子菜单(与 ^–J 的作用相同) | |
E |
编辑选定的项 | |
C |
进入 GRUB-Shell | |
编辑模式下可用的键: |
^–P |
上移一行 |
^–N |
下移一行 | |
^–B |
向左移一个字符 | |
^–F |
向右移一个字符 | |
^–A |
移到行首 | |
^–E |
移到行尾 | |
^–H |
退格 | |
^–D |
delete | |
^–K |
删除光标起当前行 | |
^–Y |
复制 | |
^–O |
插入空行 | |
^–L |
刷新屏幕 | |
^–X |
引导项 | |
^–C |
进入 GRUB-Shell | |
命令行模式下可用的键: |
^–P |
上一个命令 |
^–N |
历史中的下一个命令 | |
^–A |
移到行首 | |
^–E |
移到行尾 | |
^–B |
向左移一个字符 | |
^–F |
向右移一个字符 | |
^–H |
退格 | |
^–D |
delete | |
^–K |
删除光标起当前行 | |
^–U |
删除行 | |
^–Y |
复制 |
14.5 有用的 GRUB 2 命令 #
grub2-mkconfig
基于
/etc/default/grub
以及/etc/grub.d/
中的脚本生成新的/boot/grub2/grub.cfg
。例 14.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 引导表。要执行此操作,请使用:
root #
shim-install --config-file=/boot/grub2/grub.cfggrub2-mkrescue
为安装的 GRUB 2 配置创建一个可引导的救援映像。
例 14.2︰ grub2-mkrescue 用法 #grub2-mkrescue -o save_path/name.iso iso
grub2-script-check
检查给定文件中有无语法错误。
例 14.3︰ grub2-script-check 用法 #grub2-script-check /boot/grub2/grub.cfg
grub2-once
仅设置下次引导的默认引导项。要获取可用引导项的列表,请使用
--list
选项。例 14.4︰ grub2-once 用法 #grub2-once number_of_the_boot_entry
提示:grub2-once
帮助不使用任何选项调用该程序可以获取所有可用选项的完整列表。
14.6 更多信息 #
https://www.gnu.org/software/grub/ 上提供了有关 GRUB 2 的大量信息。还请参见 grub
信息页面。您也可以在技术信息搜索 (“) 中搜索关键字”GRUB 2https://www.suse.com/support,以获取有关特殊问题的信息。