GRUB/技巧与窍门
替代安装方法
安装到外部 USB 驱动器
BIOS
假设您的 USB 驱动器的第一个分区是 FAT32,并且该分区为 /dev/sdy1
# mount --mkdir /dev/sdy1 /mnt/usb # grub-install --target=i386-pc --debug --boot-directory=/mnt/usb/boot /dev/sdy # grub-mkconfig -o /mnt/usb/boot/grub/grub.cfg
可选备份 grub.cfg 的配置文件
# mkdir -p /mnt/usb/etc/default # cp /etc/default/grub /mnt/usb/etc/default # cp -a /etc/grub.d /mnt/usb/etc
# sync; umount /mnt/usb
EFI
对于可移动安装,您必须使用 --removable 并同时指定 --boot-directory 和 --efi-directory。 [1]
# grub-install --target=x86_64-efi --bootloader-id=GRUB --efi-directory=/mnt/usb --boot-directory=/mnt/usb/boot --removable
安装到分区或无分区磁盘
要将 grub 设置到分区引导扇区、无分区磁盘(也称为超级软盘)或软盘,请运行(例如,使用 /dev/sdaX 作为 /boot 分区)
# chattr -i /boot/grub/i386-pc/core.img # grub-install --target=i386-pc --debug --force /dev/sdaX # chattr +i /boot/grub/i386-pc/core.img
/dev/sdaX仅用于举例。--target=i386-pc指示grub-install仅为 BIOS 系统安装。建议始终使用此选项以消除 grub-install 中的歧义。
您需要使用 --force 选项来允许使用块列表,并且不应使用 --grub-setup=/bin/true(这类似于仅生成 core.img)。
grub-install 会发出类似以下的警告,这应该能让您了解此方法可能出现的问题
/sbin/grub-setup: warn: Attempting to install GRUB to a partitionless disk or to a partition. This is a BAD idea.
/sbin/grub-setup: warn: Embedding is not possible. GRUB can only be installed in this setup by using blocklists.
However, blocklists are UNRELIABLE and their use is discouraged.
不带 --force 选项,您可能会收到以下错误,并且 grub-setup 不会在分区引导扇区设置其引导代码
/sbin/grub-setup: error: will not proceed with blocklists
带 --force 选项,您应该会收到
Installation finished. No error reported.
grub-setup 默认不允许这种情况的原因是,在分区或无分区磁盘的情况下,GRUB 依赖于分区引导扇区中嵌入的块列表来定位 /boot/grub/i386-pc/core.img 文件和前缀目录 /boot/grub。当文件系统在分区中被更改时(复制、删除文件等),core.img 的扇区位置可能会发生变化。有关更多信息,请参阅 https://bugzilla.redhat.com/show_bug.cgi?id=728742 和 https://bugzilla.redhat.com/show_bug.cgi?id=730915。
解决方法是设置 /boot/grub/i386-pc/core.img 的不可变标志(使用上面提到的 chattr 命令),以防止磁盘中 core.img 文件的扇区位置发生更改。仅当 GRUB 安装到分区引导扇区或无分区磁盘时,才需要设置 /boot/grub/i386-pc/core.img 上的不可变标志,而不是安装到 MBR 或不嵌入任何引导扇区(如上所述)的简单生成 core.img 的情况。
不幸的是,创建的 grub.cfg 文件将不包含正确的 UUID 以便启动,即使它报告没有错误。请参阅 https://bbs.archlinux.org/viewtopic.php?pid=1294604#p1294604。为了解决这个问题,以下命令
# mount /dev/sdxY /mnt #Your root partition. # mount /dev/sdxZ /mnt/boot #Your boot partition (if you have one). # arch-chroot /mnt
现在,安装 linux,然后
# grub-mkconfig -o /boot/grub/grub.cfg
单独生成 core.img
要填充 /boot/grub 目录并生成 /boot/grub/i386-pc/core.img 文件,**但不在** MBR、MBR 后区域或分区引导扇区中嵌入任何 GRUB 引导扇区代码,请向 grub-install 添加 --grub-setup=/bin/true
# grub-install --target=i386-pc --grub-setup=/bin/true --debug /dev/sda
/dev/sda仅用于举例。--target=i386-pc指示grub-install仅为 BIOS 系统安装。建议始终使用此选项以消除 grub-install 中的歧义。
然后,您可以将 GRUB 的 core.img 从 GRUB Legacy 或 syslinux 加载为 Linux 内核或 multiboot 内核(另请参阅 Syslinux#Chainloading)。
GUI 配置工具
- grub-customizer — GRUB 或 BURG 的 GTK 自定义工具
直接配置文件
与其编辑 /boot/grub/grub.cfg 配置文件,不如将您的自定义设置作为直接配置文件使用,例如 /etc/default/grub.d/00-custom.cfg。请注意,您必须手动创建 /etc/default/grub.d/ 直接配置目录。不要将此目录与 /etc/grub.d/ 混淆。
视觉配置
在 GRUB 中,默认情况下可以更改菜单的外观。请确保在 /etc/default/grub 中初始化 GRUB 图形终端 gfxterm。
GRUB_TERMINAL_OUTPUT="gfxterm"
设置帧缓冲分辨率
GRUB 可以为 GRUB 本身 (GFXMODE) 和内核 (GFXPAYLOAD) 设置帧缓冲。旧的 vga= 方法已弃用。首选方法是编辑 /etc/default/grub 来设置宽度(像素)x 高度(像素)x 颜色深度
GRUB_GFXMODE=1024x768x32 GRUB_GFXPAYLOAD_LINUX=keep
可以指定多个分辨率,包括默认的 auto,因此建议将该行编辑为 GRUB_GFXMODE=所需分辨率,备选方案如 1024x768,auto。有关更多信息,请参阅 GRUB gfxmode 文档。gfxpayload 属性将确保内核保持该分辨率。
- 只能使用通过 VESA BIOS 扩展 支持的模式。要查看支持的模式列表,请安装 hwinfo 并以 root 身份运行
hwinfo --framebuffer。或者,进入 GRUB 命令行并运行videoinfo命令。 - 早期版本的 NVIDIA 专有驱动程序(已在 GeForce GTX 970 上测试,驱动程序:nvidia 370)接受
GRUB_GFXMODE格式为宽度x高度-深度(例如1920x1200-24,但不是1920x1200x24)。这似乎不适用于较新的显卡和驱动程序。使用更新的驱动程序(已在 GeForce GTX 1060 和 nvidia 381.22 上测试)的 Pascal 显卡将无法按建议格式工作,并且尝试使用它会导致严重问题,包括但不限于系统崩溃和硬锁定。当前驱动程序和显卡最好使用标准宽度x高度x深度格式的GRUB_GFXMODE进行配置。 - 更改后请务必运行
grub-mkconfig -o /boot/grub/grub.cfg。
如果此方法对您不起作用,已弃用的 vga= 方法仍然可用。只需将其添加到 /etc/default/grub 中的 "GRUB_CMDLINE_LINUX_DEFAULT=" 行旁边即可,例如:"GRUB_CMDLINE_LINUX_DEFAULT="quiet splash vga=792" 将为您提供 1024x768 的分辨率。
背景图像和位图字体
GRUB 内置支持 pf2 格式的背景图像和位图字体。GNU Unifont 字体包含在 grub 包中,文件名为 unicode.pf2,或者,仅包含 ASCII 字符的名为 ascii.pf2。运行 pacman -Ql grub | grep pf2 来获取文件路径。
支持的图像格式包括 JPEG、PNG 和 TGA,前提是已加载正确的模块。支持的最大分辨率取决于您的硬件。
请确保已设置正确的 帧缓冲分辨率。
像这样编辑 /etc/default/grub
GRUB_BACKGROUND="/boot/grub/myimage" #GRUB_THEME="/path/to/gfxtheme" GRUB_FONT="/path/to/font.pf2"
/boot/grub/myimage 将自动变成 grub.cfg 中的 /grub/myimage。重新生成 grub.cfg 以应用更改。如果添加了闪屏图像,用户将在命令执行时在终端中看到 "Found background image..."。如果未看到此短语,则图像信息可能未包含到 grub.cfg 文件中。
如果未显示图像,请检查
/etc/default/grub中的路径和文件名是否正确- 图像大小和格式是否正确(tga、png、8 位 jpg)
- 图像是否以 RGB 模式保存,而不是索引模式
/etc/default/grub中是否启用了控制台模式- 必须执行
grub-mkconfig命令,将背景图像信息放入/boot/grub/grub.cfg文件 grub-mkconfig脚本不会在grub.cfg中引用文件名,因此请确保文件名不包含空格
主题
以下是配置 GRUB 包中包含的 Starfield 主题的示例。
编辑 /etc/default/grub
GRUB_THEME="/usr/share/grub/themes/starfield/theme.txt"
重新生成 grub.cfg 以应用更改。如果主题配置成功,您将在终端中看到 Found theme: /usr/share/grub/themes/starfield/theme.txt。
使用主题时,您的闪屏图像通常不会显示。
如果主题路径可能无法访问(例如,由于加密或分区不可用),请将其复制到 /boot/grub/themes/ 或使用 grub-install --themes=主题名称 ... 进行安装。
菜单颜色
您可以在 GRUB 中设置菜单颜色。GRUB 的可用颜色可以在 GRUB 手册中找到。这是一个示例
编辑 /etc/default/grub
GRUB_COLOR_NORMAL="light-blue/black" GRUB_COLOR_HIGHLIGHT="light-cyan/blue"
隐藏菜单
GRUB 的独特功能之一是隐藏/跳过菜单,并在需要时通过按住 Esc 显示它。您还可以调整是否要显示超时计数器。
按需编辑 /etc/default/grub。以下是您需要添加以启用此功能的行,超时设置为五秒并显示给用户
GRUB_TIMEOUT=5 GRUB_TIMEOUT_STYLE='countdown'
GRUB_TIMEOUT 是显示菜单前的秒数。
禁用帧缓冲
使用 NVIDIA 专有驱动程序的用户可能希望禁用 GRUB 的帧缓冲,因为它可能与二进制驱动程序存在问题。
要禁用帧缓冲,请编辑 /etc/default/grub 并取消注释以下行
GRUB_TERMINAL_OUTPUT=console
如果您想保留 GRUB 中的帧缓冲,另一种选择是在启动内核之前恢复到文本模式。为此,请修改 /etc/default/grub 中的变量
GRUB_GFXPAYLOAD_LINUX=text
语言
grub-mkconfig 使用 gettext 进行翻译。使用的语言由 Locale#Variables 确定。
LANGUAGE 变量中的某个区域设置位于 en_US 或 en 之后,grub-mkconfig 可能会选择该次要区域设置。这是因为 grub 使用 C 作为英语的默认区域设置,但不明确命名或别名为 en_US 或 en。请参阅 Locale#LANGUAGE: fallback locales 以获得永久解决方案。在运行 grub-mkconfig 以生成特定语言(例如英语(C 区域设置))的配置时,您可以临时覆盖区域设置
# LC_ALL=C grub-mkconfig -o /boot/grub/grub.cfg
直接通过 GRUB 启动 ISO9660 镜像文件
GRUB 支持通过回环设备直接从 ISO 镜像启动,有关示例,请参阅 Multiboot USB drive#Using GRUB and loopback devices。
GRUB 菜单密码保护
/boot 位于未加密的分区上。请参阅 GRUB#Encrypted /boot 和 Security#Data-at-rest encryption。如果您想保护 GRUB,使其无法更改启动参数或使用命令行,您可以向 GRUB 的配置文件添加用户名和密码。为此,请运行命令 grub-mkpasswd-pbkdf2,然后输入并确认密码
$ grub-mkpasswd-pbkdf2
[...] PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.C8ABD3E93C4DFC83138B0C7A3D719BC650E6234310DA069E6FDB0DD4156313DA3D0D9BFFC2846C21D5A2DDA515114CF6378F8A064C94198D0618E70D23717E82.509BFA8A4217EAD0B33C87432524C0B6B64B34FBAD22D3E6E6874D9B101996C5F98AB1746FE7C7199147ECF4ABD8661C222EEEDB7D14A843261FFF2C07B1269A
然后,将 /etc/grub.d/40_custom 的权限设置为只有 root 可以读取,方法是运行 chmod o-r /etc/grub.d/40_custom。然后按以下方式修改该文件
/etc/grub.d/40_custom
set superusers="username" password_pbkdf2 username password-hash
其中 password-hash 是由 grub-mkpasswd_pbkdf2 生成的以 grub.pbkdf2 开头的字符串。
使用 grub-mkconfig 重新生成您的配置文件。访问 GRUB 命令行、*启动参数* 以及**启动条目**现在都需要指定的用户名和密码。后者可以通过遵循 #仅对 GRUB 编辑和控制台选项进行密码保护 来阻止。
可以通过配置更多用户来放松和进一步自定义,如 GRUB 手册的“安全”部分所述。
仅对 GRUB 编辑和控制台选项进行密码保护
向菜单条目添加 --unrestricted 将允许任何用户启动操作系统,但阻止用户编辑条目并阻止访问 grub 控制台。只有超级用户或使用 --user 开关指定的***用户***才能编辑菜单条目。
/boot/grub/grub.cfg
menuentry 'Arch Linux' --unrestricted --class arch --class gnu-linux --class os ...
为了使 Linux 条目 --unrestricted,可以修改 /etc/grub.d/10_linux 开头的 CLASS 变量。
/etc/grub.d/10_linux
CLASS="--class gnu-linux --class gnu --class os --unrestricted"
按住 Shift 键才显示 GRUB
为了实现最快的启动速度,GRUB 可以隐藏菜单,而不是等待超时,除非在 GRUB 启动期间按住 Shift 键。
为了实现这一点,您应该在 /etc/default/grub 中添加以下行
GRUB_FORCE_HIDDEN_MENU="true"
然后创建包含 [3] 的文件 /etc/grub.d/31_hold_shift,使其 可执行,并重新生成 grub 配置
# grub-mkconfig -o /boot/grub/grub.cfg
结合使用 UUID 和基本脚本
如果您喜欢使用 UUID 来避免不可靠的 BIOS 映射,或者在处理 GRUB 语法时遇到困难,这是一个示例启动菜单项,它使用 UUID 和一个小型脚本来将 GRUB 指向您系统的正确磁盘分区。您只需要将示例中的 UUID 替换为您系统的正确 UUID。该示例适用于具有引导分区和根分区的系统。如果您有其他分区,您显然需要修改 GRUB 配置
menuentry "Arch Linux 64" {
# Set the UUIDs for your boot and root partition respectively
set the_boot_uuid=ece0448f-bb08-486d-9864-ac3271bd8d07
set the_root_uuid=c55da16f-e2af-4603-9e0b-03f5f565ec4a
# (Note: This may be the same as your boot partition)
# Get the boot/root devices and set them in the root and grub_boot variables
search --fs-uuid $the_root_uuid --set=root
search --fs-uuid $the_boot_uuid --set=grub_boot
# Check to see if boot and root are equal.
# If they are, then append /boot to $grub_boot (Since $grub_boot is actually the root partition)
if [ $the_boot_uuid == $the_root_uuid ] ; then
set grub_boot=($grub_boot)/boot
else
set grub_boot=($grub_boot)
fi
# $grub_boot now points to the correct location, so the following will properly find the kernel and initramfs
linux $grub_boot/vmlinuz-linux root=/dev/disk/by-uuid/$the_root_uuid ro
initrd $grub_boot/initramfs-linux.img
}
多个条目
禁用子菜单
如果您安装了多个内核,例如 linux 和 linux-lts,默认情况下 grub-mkconfig 会将它们分组到一个子菜单中。如果您不喜欢这种行为,可以通过在 /etc/default/grub 中添加以下行来回到一个单一菜单
GRUB_DISABLE_SUBMENU=y
回忆上次启动的条目
GRUB 可以记住您上次启动的条目,并将其用作下次启动的默认条目。如果您有多个内核(例如,当前的 Arch 内核和 LTS 内核作为备用选项)或操作系统,这会很有用。为此,请编辑 /etc/default/grub 并更改 GRUB_DEFAULT 的值
GRUB_DEFAULT=saved
这将确保 GRUB 默认使用保存的条目。要启用保存选定的条目,请在 /etc/default/grub 中添加以下行
GRUB_SAVEDEFAULT=true
这仅在 /boot 不是 btrfs 时有效,因为 grub 无法写入 btrfs。但它会生成误导性的错误消息:“不允许稀疏文件。按任意键继续。”。
/etc/grub.d/40_custom 或 /boot/grub/custom.cfg 中的 Windows,需要添加 savedefault。更改默认菜单条目
要更改默认选定的条目,请编辑 /etc/default/grub 并更改 GRUB_DEFAULT 的值
使用菜单标题
GRUB_DEFAULT='Advanced options for Arch Linux>Arch Linux, with Linux linux'
GRUB_DEFAULT 行上方添加 LANG=C,或者根据您区域设置中的正确标题设置 GRUB_DEFAULT。使用数字
GRUB_DEFAULT="1>2"
Grub 将生成的菜单(即 /boot/grub/grub.cfg)中的条目从零开始计数。这意味着 0 表示第一个条目,这是默认值,1 表示第二个,依此类推。主菜单条目和子菜单条目用 > 分隔,并且都可以通过数字、标题或 ID 进行标识。
上面的示例启动了主菜单“Arch Linux 的高级选项”中的第三个条目。
使用 ID(请参阅 grub.cfg 中 --id 或 $menuentry_id_option 后面的值,如果正在生成 grub.cfg)
GRUB_DEFAULT="gnulinux-advanced-39c666d6-c7fc-4fa6-8287-9540056f5a02>gnulinux-linux-zen-advanced-39c666d6-c7fc-4fa6-8287-9540056f5a02"
所有三种标识符方法的文档:https://gnu.ac.cn/software/grub/manual/grub/html_node/default.html
仅一次启动非默认条目
grub-reboot 命令非常有助于仅一次启动除默认条目之外的其他条目。系统下次重新启动时,GRUB 将加载在第一个命令行参数中传递的条目。最重要的是,GRUB 将恢复为所有将来的引导加载默认条目。无需更改配置文件或在 GRUB 菜单中选择条目。
/etc/default/grub 中的 GRUB_DEFAULT=saved(然后重新生成 grub.cfg),或者,如果是手动制作的 grub.cfg,则需要 set default="${saved_entry}" 行。播放音乐
您可以通过 PC 扬声器在启动时(在菜单出现之前)播放音乐,方法是修改变量 GRUB_INIT_TUNE
GRUB_INIT_TUNE="tempo [note_pitch note_duration] [second_note_pitch second_note_duration] ..."
您可以通过创建链接的 /etc/grub.d/91_tune_demo 来添加一个菜单条目来播放这些常见的 GRUB_INIT_TUNE 示例,然后重新运行 grub-mkconfig。
有关此信息,您可以在 info grub -n play 中查找,同时存在一些集合。
手动配置核心镜像以进行早期引导
如果您需要 GRUB 无法自动配置的特殊键映射或其他复杂步骤才能使 GRUB 环境能够访问 /boot,您可以自己生成核心镜像。在 UEFI 系统上,核心镜像是固件启动时加载的 grubx64.efi 文件。构建自己的核心镜像可以让您嵌入非常早期引导所需的任何模块,以及一个用于引导 GRUB 的配置脚本。
首先,以在 UEFI 系统上加密 /boot 输入密码所需的 dvorak 键映射嵌入到早期引导中为例
从生成的 /boot/grub/grub.cfg 文件确定挂载加密的 /boot 所需的模块。例如,在您的 menuentry 下,您应该看到类似以下的行
insmod diskfilter cryptodisk luks gcry_rijndael gcry_rijndael gcry_sha256 insmod ext2 cryptomount -u 1234abcdef1234abcdef1234abcdef set root='cryptouuid/1234abcdef1234abcdef1234abcdef'
记下所有这些模块:它们将需要包含在核心镜像中。现在,创建一个包含您的键映射的 tar 包。这将作为 memdisk 被打包到核心镜像中
# grub-kbdcomp -o dvorak.gkb dvorak # tar cf memdisk.tar dvorak.gkb
现在创建一个用于 GRUB 核心镜像的配置文件。其格式与常规 grub 配置相同,但只需要几行来查找和加载 /boot 分区上的主配置文件
early-grub.cfg
set root=(memdisk) set prefix=($root)/ terminal_input at_keyboard keymap /dvorak.gkb cryptomount -u 1234abcdef1234abcdef1234abcdef set root='cryptouuid/1234abcdef1234abcdef1234abcdef' set prefix=($root)/grub configfile grub.cfg
最后,生成核心镜像,列出在生成的 grub.cfg 中确定的所有必需模块,以及 early-grub.cfg 脚本中使用的任何模块。上面的示例需要 memdisk、tar、at_keyboard、keylayouts 和 configfile。
# grub-mkimage -c early-grub.cfg -o grubx64.efi -O x86_64-efi -m memdisk.tar diskfilter cryptodisk luks gcry_rijndael gcry_sha256 ext2 memdisk tar at_keyboard keylayouts configfile
生成的 EFI 核心镜像现在可以像 grub-install 自动生成的镜像一样使用:将其放置在您的 EFI 系统分区中,并使用 efibootmgr 进行启用,或根据您的系统固件进行相应配置。
另请参阅 Debian cryptsetup 文档。
UEFI 进一步阅读
以下是有关通过 UEFI 安装 Arch 的其他相关信息。
替代安装方法
通常,GRUB 将所有文件(包括配置文件)保留在 /boot 中,无论 EFI 系统分区挂载在哪里。
如果您想将这些文件保留在 EFI 系统分区本身内,请向 grub-install 命令添加 --boot-directory=esp
# grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=grub --boot-directory=esp --debug
这会将所有 GRUB 文件放在 esp/grub 中,而不是放在 /boot/grub 中。使用此方法时,请确保 grub-mkconfig 将配置文件放在相同的位置
# grub-mkconfig -o esp/grub/grub.cfg
配置与以前相同。
UEFI 固件解决方法
请参阅 GRUB#Default/fallback boot path。
GRUB 独立运行
本节假定您正在为 x86_64 系统(x86_64-efi)创建独立的 GRUB。对于 32 位(IA32)EFI 系统,请在适当的地方将 x86_64-efi 替换为 i386-efi。
可以使用 grub-mkstandalone 命令(包含在 grub 中)创建一个 grubx64_standalone.efi 应用程序,该应用程序在 UEFI 应用程序内嵌入了所有模块的 tar 存档,从而无需单独的目录来存放所有 GRUB UEFI 模块和其他相关文件。如下所示
# echo 'configfile ${cmdpath}/grub.cfg' > /tmp/grub.cfg
# grub-mkstandalone -d /usr/lib/grub/x86_64-efi/ -O x86_64-efi --modules="part_gpt part_msdos" --locales="en@quot" --themes="" -o "esp/EFI/grub/grubx64_standalone.efi" "boot/grub/grub.cfg=/tmp/grub.cfg" -v
然后将 GRUB 配置文件复制到 esp/EFI/grub/grub.cfg,并使用 efibootmgr 为 esp/EFI/grub/grubx64_standalone.efi 创建一个 UEFI 启动管理器条目。
--modules="part_gpt part_msdos"(带引号)选项对于 ${cmdpath} 功能正常工作是必需的。- 您可能会发现
grub.cfg文件未加载,因为${cmdpath}缺少斜杠(例如(hd1,msdos2)EFI/Boot而不是(hd1,msdos2)/EFI/Boot),然后您会被转入 GRUB shell。如果发生这种情况,请确定${cmdpath}的设置(echo ${cmdpath})然后手动加载配置文件(例如configfile (hd1,msdos2)/EFI/Boot/grub.cfg)。 - 如果使用带 shim 的 Secure Boot,请记住使用
--sbat /usr/share/grub/sbat.csv添加 SBAT 部分。
技术信息
GRUB EFI 文件始终期望其配置文件位于 ${prefix}/grub.cfg。然而,在独立的 GRUB EFI 文件中,${prefix} 位于 tar 存档内,并嵌入在独立 GRUB EFI 文件本身中(在 GRUB 环境中,它由 "(memdisk)" 表示,不带引号)。此 tar 存档包含在正常的 GRUB EFI 安装中通常会存储在 /boot/grub 中的所有文件。
由于这种将 /boot/grub 内容嵌入独立镜像本身,它不依赖于实际的(外部)/boot/grub 进行任何操作。因此,对于独立 GRUB EFI 文件,${prefix}==(memdisk)/boot/grub,并且独立 GRUB EFI 文件期望配置文件位于 ${prefix}/grub.cfg==(memdisk)/boot/grub/grub.cfg。
因此,为了确保独立的 GRUB EFI 文件读取与 EFI 文件位于同一目录中的外部 grub.cfg(在 GRUB 环境中,它由 ${cmdpath} 表示),我们创建一个简单的 /tmp/grub.cfg,该文件指示 GRUB 使用 ${cmdpath}/grub.cfg 作为其配置(在 (memdisk)/boot/grub/grub.cfg 中执行 configfile ${cmdpath}/grub.cfg 命令)。然后,我们指示 grub-mkstandalone 使用选项 "boot/grub/grub.cfg=/tmp/grub.cfg" 将此 /tmp/grub.cfg 文件复制到 ${prefix}/grub.cfg(实际上是 (memdisk)/boot/grub/grub.cfg)。
这样,独立 GRUB EFI 文件和实际的 grub.cfg 可以存储在 EFI 系统分区内的任何目录中(只要它们在同一目录中),从而使其具有可移植性。
UEFI 和 BIOS 安装
如果您的 arch 安装应能在 UEFI 和 BIOS 系统上启动,请同时使用这两种方法安装 GRUB。将磁盘分区为 GPT,同时创建 EFI 系统分区和 BIOS 引导分区,将 ESP 挂载到 /efi 并为这两种方式运行 GRUB 安装命令。
# grub-install --target=i386-pc --recheck /dev/sdx # grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB --recheck
在 BIOS 系统中,UEFI 变量不存在,因此无法设置 UEFI NVRAM 启动条目,第二个命令将报告错误。通过使用 --no-nvram 和 --removable 选项,系统将很有可能也能在 UEFI 模式下启动
# grub-install --target=i386-pc --recheck /dev/sdx # grub-install --target=x86_64-efi --efi-directory=/efi --recheck --removable --no-nvram
对于某些 BIOS 实现,可能需要设置 PMBR 的引导标志,例如使用 parted
(parted) disk_set pmbr_boot on
加速 LUKS 解密 in GRUB
启动时 GRUB 可能会花费很长时间来验证密码。这可能是由于 密钥派生函数的高成本参数造成的,您可以通过以下方式进行检查
# cryptsetup luksDump /dev/sda3
问题在于,给定密钥槽的成本参数在添加密钥时生成,以确保在高到足以防止暴力破解攻击和低到允许通过估算计算机能力进行快速密钥派生之间取得平衡。然而,当 GRUB 启动时,它可能没有相同的计算资源可用,因此速度要慢得多。
如果您的密码本身具有足够的熵来抵抗常见攻击,您可以降低参数。例如,要降低 PBKDF2 的迭代次数,请使用
# cryptsetup luksChangeKey --pbkdf-force-iterations 1000 /dev/sda3
根据 RFC 2898,建议的最低迭代次数为 1000 次,但如果您可以,应争取更高的值(攻击者的成本和密钥派生时间呈线性关系)。
关于 Argon2 的建议参数在 RFC 9106 中进行了讨论。
--key-slot 选项来显式指定密钥槽。参见
- GRUB 2 主题教程[链接已失效 2025-11-17—HTTP 404]