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
为了使 grub 将其 EFI 镜像写入 esp/EFI/BOOT/BOOTX64.efi
,启动固件无需任何 UEFI 启动项即可找到它,请在运行 grub-install
时使用 --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
文件报告没有错误,它创建的 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 自定义工具
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-depth
的GRUB_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
以获取文件路径。
支持的图像格式包括 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 在 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 和环回设备。
/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 ...
为了使 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"
然后创建包含 [2] 的文件 /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 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
脚本中使用的任何模块。上面的示例需要 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 core 镜像现在可以像 grub-install
自动生成的镜像一样使用:将其放在您的 EFI 系统分区中,并使用 efibootmgr
启用它,或根据您的系统固件进行配置。
另请参阅 Debian cryptsetup 文档。
UEFI 延伸阅读
以下是关于通过 UEFI 安装 Arch 的其他相关信息。
其他安装方法
通常,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
,并使用 efibootmgr 为 esp/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 安装
如果你的 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 解密
启动时,GRUB 在某些情况下可能需要很长时间来验证密码。这可能是由于密钥派生函数的高成本参数造成的,你可以按如下方式检查:
# cryptsetup luksDump /dev/sda3
问题在于,给定密钥槽的成本参数是在添加密钥时生成的,以确保在足够高以防止暴力攻击和足够低以允许通过估计计算机性能进行快速密钥派生之间取得平衡。然而,当 GRUB 启动时,它可能没有相同的计算资源可用,因此会慢得多。
如果你的密码本身提供了足够的熵来抵抗常见的攻击,你可以降低这些参数。例如,要降低 PBKDF2 的迭代计数,请使用:
# cryptsetup luksChangeKey --pbkdf-force-iterations 1000 /dev/sda3
根据 RFC 2898 的建议,最小迭代次数为 1000 次,但如果可以,你应该争取更高的值(攻击者的成本以及密钥派生时间都呈线性增长)。
关于 Argon2 的推荐参数在 RFC 9106 中讨论。
--key-slot
选项显式指定密钥槽。