GRUB/技巧与提示

出自 ArchWiki

其他安装方法

安装到外部 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

为了使 grub 将其 EFI 镜像写入 esp/EFI/BOOT/BOOTX64.efi,启动固件无需任何 UEFI 启动项即可找到它,请在运行 grub-install 时使用 --removable

安装到分区或无分区磁盘

警告: GRUB 强烈不建议 像 GRUB Legacy 或 Syslinux 那样安装到分区引导扇区或无分区磁盘。这种设置容易损坏,尤其是在更新期间,并且 Arch 开发者不支持

要将 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=728742https://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 文件报告没有错误,它创建的 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、post-MBR 区域或分区引导扇区中嵌入任何 GRUB 引导扇区代码,请将 --grub-setup=/bin/true 添加到 grub-install

# 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 内核或多引导内核(另请参见 Syslinux#链式加载)。

GUI 配置工具

  • grub-customizer — 用于 GRUB 或 BURG 的 GTK 自定义工具
https://launchpad.net/grub-customizer || grub-customizer

Drop-in 配置

无需编辑 /boot/grub/grub.cfg 配置文件,可以使用您的自定义设置作为 drop-in 文件,例如 /etc/default/grub.d/00-custom.cfg。请注意,您必须手动创建 /etc/default/grub.d/ drop-in 目录。不要将此目录与 /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=desired_resolution,fallback_such_as_1024x768,auto。有关更多信息,请参阅 GRUB gfxmode 文档gfxpayload 属性将确保内核保持分辨率。

注意
  • 只能使用图形卡通过 VESA BIOS 扩展 支持的模式。要查看支持模式的列表,请安装 hwinfo 并以 root 身份运行 hwinfo --framebuffer。或者,进入 GRUB 命令行并运行命令 videoinfo
  • 早期版本的 NVIDIA 专有驱动程序(使用 GeForce GTX 970,驱动程序:nvidia 370 测试)接受格式为 widthxheight-depthGRUB_GFXMODE(例如 1920x1200-24,但不是 1920x1200x24)。这似乎不适用于较新的显卡和驱动程序。具有较新驱动程序的 Pascal 显卡(使用 GeForce GTX 1060 和 nvidia 381.22 测试)将无法使用建议的格式,并且尝试使用它会导致严重问题,包括但不限于系统崩溃和硬锁。当前的驱动程序和显卡最好使用标准 widthxheightxdepth 格式配置 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 以获取文件路径。

支持的图像格式包括 JPEGPNGTGA,前提是加载了正确的模块。最大支持分辨率取决于您的硬件。

确保您已设置正确的帧缓冲分辨率

像这样编辑 /etc/default/grub

GRUB_BACKGROUND="/boot/grub/myimage"
#GRUB_THEME="/path/to/gfxtheme"
GRUB_FONT="/path/to/font.pf2"
注意: 如果您已将 GRUB 安装在单独的分区上,则 /boot/grub/myimagegrub.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 中引用文件名,因此请确保文件名不包含空格

主题

此文章或章节的准确性存在争议。

原因: /boot/ 应该是独立的,因此 GRUB 主题应始终复制到 /boot/grub/themes/ 或使用 grub-install --themes=theme_names ... 安装。(在 Talk:GRUB/技巧与提示#将 GRUB_THEME 指向 /usr/share/grub/themes 中讨论)

这是一个配置 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 在 luksOpen 之前无法访问加密设备上的任何内容。请参阅 [1]

菜单颜色

您可以在 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 直接引导 ISO9660 镜像文件

GRUB 支持直接从 ISO 镜像通过环回设备启动,有关示例,请参阅 多启动 USB 驱动器#使用 GRUB 和环回设备

GRUB 菜单的密码保护

警告: 如果有人可以物理访问您的机器并且能够从 Live USB/磁盘启动(,BIOS 允许从外部磁盘启动),如果 /boot 位于未加密的分区上,则修改 GRUB 配置文件以绕过此限制非常容易。请参阅 GRUB#加密 /boot安全#静态数据加密

如果您想保护 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.pbkdf2 开头的字符串,由 grub-mkpasswd_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 ...

此文章或章节的准确性存在争议。

原因: 不应编辑 /etc/grub.d/10_linux,当 grub 更新时,它将被覆盖。(在 Talk:GRUB/技巧与提示 中讨论)

为了使 Linux 条目 --unrestricted,可以修改 /etc/grub.d/10_linux 开头的 CLASS 变量。

/etc/grub.d/10_linux
CLASS="--class gnu-linux --class gnu --class os --unrestricted"

除非按下 Shift 键,否则隐藏 GRUB

注意: 这在 UEFI 系统上不起作用,因为固件没有提供检测修饰键状态的方法。

为了实现最快的启动速度,GRUB 可以隐藏菜单,而不是等待超时,除非在 GRUB 启动期间按住 Shift 键。

为了实现这一点,您应该将以下行添加到 /etc/default/grub

GRUB_FORCE_HIDDEN_MENU="true"

然后创建包含 [2] 的文件 /etc/grub.d/31_hold_shift,使其成为可执行文件,并重新生成 grub 配置

# grub-mkconfig -o /boot/grub/grub.cfg
注意: 此设置使用 keystatus 检测按键事件,因此可能在某些机器上不起作用。

结合使用 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 initrd
    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。但这将生成误导性的错误消息:“sparse file not allowed. Press any key to continue.”。

注意: 手动添加的菜单项,例如 /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 标识。

上面的示例引导主菜单“Advanced options for Arch Linux”中的第三个条目。


使用 ID(如果您正在生成 grub.cfg,请参阅 --id 或 $menuentry_id_option 之后的值)

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-mkconfig,添加菜单项来播放每个常见的 GRUB_INIT_TUNE 示例。

有关此信息,您可以查看 info grub -n play,同时存在一些 集合

手动配置用于早期启动的 core 镜像

如果您需要特殊的键盘布局或其他复杂的步骤,而 GRUB 无法自动配置以使 /boot 可用于 GRUB 环境,则可以自己生成 core 镜像。在 UEFI 系统上,core 镜像是在启动时由固件加载的 grubx64.efi 文件。构建自己的 core 镜像将允许您嵌入早期启动所需的任何模块,以及引导 GRUB 的配置文件。

首先,以需要在早期启动中嵌入 dvorak 键盘布局为例,以便在 UEFI 系统上输入加密的 /boot 的密码

从生成的 /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'

记下所有这些模块:它们将需要包含在 core 镜像中。现在,创建一个包含您的键盘布局的 tarball。这将捆绑在 core 镜像中作为内存盘

# grub-kbdcomp -o dvorak.gkb dvorak
# tar cf memdisk.tar dvorak.gkb

现在创建一个配置文件,用于 GRUB core 镜像。这与您的常规 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

最后,生成 core 镜像,列出在生成的 grub.cfg 中确定为必需的所有模块,以及 early-grub.cfg 脚本中使用的任何模块。上面的示例需要 memdisktarat_keyboardkeylayoutsconfigfile

# 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 core 镜像现在可以像 grub-install 自动生成的镜像一样使用:将其放在您的 EFI 系统分区中,并使用 efibootmgr 启用它,或根据您的系统固件进行配置。

另请参阅 Debian cryptsetup 文档

UEFI 延伸阅读

此文章或章节需要语言、wiki 语法或样式改进。请参阅 Help:Style 以供参考。

原因: 这可以更简洁、更好地组织。(在 Talk:GRUB/技巧与提示 中讨论)

以下是关于通过 UEFI 安装 Arch 的其他相关信息。

其他安装方法

此文章或章节需要扩充。

原因: 将 GRUB 的所有文件都放在 ESP 中的原因是什么?(在 Talk:GRUB/技巧与提示#UEFI 延伸阅读/其他安装方法 中讨论)

通常,GRUB 会将所有文件(包括配置文件)保留在 /boot 中,而不管 EFI 系统分区安装在何处。

如果您希望将这些文件保存在 EFI 系统分区本身内,请将 --boot-directory=esp 添加到 grub-install 命令

# 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#默认/回退启动路径

GRUB 独立版

本节假定您正在为 x86_64 系统 (x86_64-efi) 创建独立的 GRUB。对于 32 位 (IA32) EFI 系统,请在适当的地方将 x86_64-efi 替换为 i386-efi

可以创建一个 grubx64_standalone.efi 应用程序,该应用程序在 UEFI 应用程序内的 tar 存档中嵌入了所有模块,从而无需拥有一个单独的目录来填充所有 GRUB UEFI 模块和其他相关文件。这是使用 grub-mkstandalone 命令(包含在 grub 中)完成的,如下所示

# 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,并使用 efibootmgresp/EFI/grub/grubx64_standalone.efi 创建 UEFI 启动管理器条目。

注意: 选项 --modules="part_gpt part_msdos"(带引号)对于 ${cmdpath} 功能正常工作是必要的。
警告
  • 您可能会发现由于 ${cmdpath} 缺少斜杠(即 (hd1,msdos2)EFI/Boot 而不是 (hd1,msdos2)/EFI/Boot),因此未加载 grub.cfg 文件,因此您被放入 GRUB shell。如果发生这种情况,请确定 ${cmdpath} 设置为什么(echo ${cmdpath} ),然后手动加载配置文件(例如 configfile (hd1,msdos2)/EFI/Boot/grub.cfg)。
  • 如果使用带有 shim 的安全启动,请记住使用 --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 安装

此文章或章节需要扩充。

原因: 这与 多启动 USB 驱动器#混合 UEFI GPT + BIOS GPT/MBR 启动 相同吗?它在没有混合 MBR 的情况下工作吗?(在 Talk:GRUB/技巧与提示 中讨论)

如果你的 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 系统中,EFI 变量不存在,因此无法设置 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

加速 GRUB 中的 LUKS 解密

警告: 在阅读本节之前,请确保你理解高熵密码的重要性。关于如何生成安全密码的信息可以在Wikipedia:密码强度 找到。同时请确保你理解所使用的密码学基础知识。使用不适合给定功能的参数可能会导致你的系统无法使用。

启动时,GRUB 在某些情况下可能需要很长时间来验证密码。这可能是由于密钥派生函数的高成本参数造成的,你可以按如下方式检查:

# cryptsetup luksDump /dev/sda3

问题在于,给定密钥槽的成本参数是在添加密钥时生成的,以确保在足够高以防止暴力攻击和足够低以允许通过估计计算机性能进行快速密钥派生之间取得平衡。然而,当 GRUB 启动时,它可能没有相同的计算资源可用,因此会慢得多。

如果你的密码本身提供了足够的熵来抵抗常见的攻击,你可以降低这些参数。例如,要降低 PBKDF2 的迭代计数,请使用:

# cryptsetup luksChangeKey --pbkdf-force-iterations 1000 /dev/sda3

根据 RFC 2898 的建议,最小迭代次数为 1000 次,但如果可以,你应该争取更高的值(攻击者的成本以及密钥派生时间都呈线性增长)。

关于 Argon2 的推荐参数在 RFC 9106 中讨论。

提示: GRUB 顺序尝试启用的密钥槽。添加密钥时,可以使用 --key-slot 选项显式指定密钥槽。

参见