跳转至内容

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

对于可移动安装,您必须使用 --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 强烈不建议像 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 文件将不包含正确的 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 自定义工具
https://launchpad.net/grub-customizer || grub-customizerAUR

直接配置文件

与其编辑 /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 来获取文件路径。

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

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

像这样编辑 /etc/default/grub

GRUB_BACKGROUND="/boot/grub/myimage"
#GRUB_THEME="/path/to/gfxtheme"
GRUB_FONT="/path/to/font.pf2"
注意 如果您已将 GRUB 安装在单独的分区上,/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

使用主题时,您的闪屏图像通常不会显示。

注意 GRUB 只能从启动时可访问的路径加载主题。在加密驱动器上,GRUB 在解密/映射之前无法访问加密设备上的任何内容。请参阅 [2]

如果主题路径可能无法访问(例如,由于加密或分区不可用),请将其复制到 /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

语言

本文或本节正考虑移除。

原因:Locale#LANGUAGE: fallback locales 中存在永久解决方案时,无需临时解决方案。(在 Talk:GRUB/Tips and tricks#Section 4.7: Language - Removal Template 中讨论)

grub-mkconfig 使用 gettext 进行翻译。使用的语言由 Locale#Variables 确定。

提示 如果您的 LANGUAGE 变量中的某个区域设置位于 en_USen 之后,grub-mkconfig 可能会选择该次要区域设置。这是因为 grub 使用 C 作为英语的默认区域设置,但不明确命名或别名为 en_USen。请参阅 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 菜单密码保护

警告 如果有人可以物理访问您的机器并能够启动 live USB/磁盘(*即*,BIOS 允许从外部磁盘启动),那么修改 GRUB 配置文件以绕过此保护相对容易,前提是 /boot 位于未加密的分区上。请参阅 GRUB#Encrypted /bootSecurity#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 ...

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

原因: 不应编辑 /etc/grub.d/10_linux,因为在 grub 更新时会被覆盖。(在 Talk:GRUB/Tips and tricks 中讨论)

为了使 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"

然后创建包含 [3] 的文件 /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 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

仅一次启动非默认条目

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

原因: 似乎只有一些 Debian 衍生版本不再需要注中的设置(在 Talk:GRUB/Tips and tricks#Is now days, grub-reboot does not take care for everything? 中讨论)

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 脚本中使用的任何模块。上面的示例需要 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 核心镜像现在可以像 grub-install 自动生成的镜像一样使用:将其放置在您的 EFI 系统分区中,并使用 efibootmgr 进行启用,或根据您的系统固件进行相应配置。

另请参阅 Debian cryptsetup 文档

UEFI 进一步阅读

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因: 可以使其更简洁,组织得更好。(在 Talk:GRUB/Tips and tricks 中讨论)

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

替代安装方法

本文章或章节需要扩充。

原因: 将 GRUB 的所有文件放在 ESP 中的原因是什么?(在 Talk:GRUB/Tips and tricks#UEFI further reading/Alternative install method 中讨论)

通常,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,并使用 efibootmgresp/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 安装

本文章或章节需要扩充。

原因: 这与 Multiboot USB drive#Hybrid UEFI GPT + BIOS GPT/MBR boot 相同吗?在没有混合 MBR 的情况下也能工作吗?(在 Talk:GRUB/Tips and tricks#Section 12.4: UEFI and BIOS installation 中讨论)

如果您的 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

警告 在遵循本节内容之前,请确保您了解高熵密码的重要性。有关如何生成安全密码的信息可以在 Wikipedia:Password strength 中找到。同时请确保您了解所用密码学的基础知识。使用不适合给定功能的参数可能会导致您的系统无法使用。

启动时 GRUB 可能会花费很长时间来验证密码。这可能是由于 密钥派生函数的高成本参数造成的,您可以通过以下方式进行检查

# cryptsetup luksDump /dev/sda3

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

如果您的密码本身具有足够的熵来抵抗常见攻击,您可以降低参数。例如,要降低 PBKDF2 的迭代次数,请使用

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

根据 RFC 2898,建议的最低迭代次数为 1000 次,但如果您可以,应争取更高的值(攻击者的成本和密钥派生时间呈线性关系)。

关于 Argon2 的建议参数在 RFC 9106 中进行了讨论。

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

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.