如何将 chainload 二进制条目添加到 GRUB2 启动菜单?

如何将 chainload 二进制条目添加到 GRUB2 启动菜单?

我使用的是 Ubuntu 22.04 LTS,它附带的memtest86+ v5不支持 UEFI。

我正在尝试在 Ubuntu 22.04 LTS 上安装memtest86+ v6,并且下载了它的二进制文件这里

我移动memtest64.efi到EFI分区并添加以下内容/etc/grub.d/40_custom

menuentry 'Memtest86+ v6' {
  insmod part_gpt
  insmod fat
  set root='hd0,gpt1'
  chainloader (\$root)/EFI/memtest64.efi
}

然后就跑了update-grub。该条目显示在启动菜单上,但是当我输入它时:

Error: No Server is Specified

从 GRUB 控制台,我确定那hd0,gpt1是 EFI 分区。

或者,我希望 GRUB 从 /boot 文件夹启动 Memtest86+,但我不知道如何让 GRUB 找到/boot.

******@Ubuntu-Portable:~$ sudo lsblk -o +fstype
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS            FSTYPE
sda           8:0    0 953.9G  0 disk                        
├─sda1        8:1    0   476M  0 part /boot/efi              vfat
├─sda2        8:2    0   250G  0 part /                      ext4
└─sda3        8:3    0 703.4G  0 part /media/****/****       exfat
sr0          11:0    1  1024M  0 rom                         
nvme0n1     259:0    0   128G  0 disk                        
├─nvme0n1p1 259:1    0   200M  0 part                        vfat
├─nvme0n1p2 259:2    0   128M  0 part                        
└─nvme0n1p3 259:3    0 127.7G  0 part                        ntfs

更新:这有效,但我仍然不知道如何从 /boot 启动而不是从 efi 分区启动。

menuentry 'Memtest86+ v6' {
  insmod part_gpt
  insmod fat
  insmod chain
  set root=(hd0,gpt1)
  chainloader /EFI/memtest64.efi
}

为了保持整洁,我希望一切都在里面完成/etc/grub.d/40_custom

答案1

如果您想放置memtest64.efiEFI/boot系统分区而不是 EFI 系统分区,类似以下内容可能可以完成此任务:

menuentry 'Memtest86+ v6' {
  insmod part_gpt
  insmod ext2
  insmod chain
  set root=(hd0,gpt2)
  chainloader /boot/memtest64.efi
}

但正如您在评论中指出的那样,这依赖于存储设备被假定为(hd0).

当引导 BIOS 风格时,这曾经是一个很好的假设,因为在i386-pcGRUB 的 BIOS () 架构版本上,存储设备标识符通常(hd0)直接映射到 BIOS INT 13h 磁盘号。换句话说,(hd0)指的是磁盘0x80。

在 BIOS 上,指定启动磁盘的唯一可靠且兼容的方法是重新排列 BIOS 磁盘列表,使所需的启动磁盘为磁盘 0x80((hd0)对于 GRUB 也是如此),因此,当您选择启动磁盘时,大多数 BIOS 都会这样做。启动磁盘;因此,实际上,在 BIOS 系统上,虽然没有通用方法可以 100% 确定 GRUB 是从哪个磁盘启动的,(hd0)但这是一个非常非常好的猜测,几乎总是正确的。

有了 UEFI,这一点就不再可靠了。虽然一些 UEFI 实现可能我个人拥有的 UEFI 系统也这样做,而我作为系统管理员看到的系统通常似乎也不会这样做。

因此,set root=(hd0,<partition ID>)您应该使用searchGRUB 命令,而不是 。

您可以只在已知路径中搜索文件(从路径名开始)文件所在文件系统的根目录,可能是也可能不是 Linux 根文件系统):

search --no-floppy --file --set root /boot/memtest64.efi

或者您可以找到相关文件系统的 UUID,然后搜索它,就像grub[2]-mkconfig现在大多数现代版本默认执行的那样:

search --no-floppy --fs-uuid --set root 12345678-9abc-def0-1234-56789abcdef0

该命令--no-floppy告诉 GRUB 跳过尝试搜索软盘驱动器,并--set root导致该search命令将变量设置root为指向满足搜索条件的文件系统。

简而言之:使用lsblk -o +uuid查找包含该目录所在的文件系统的 UUID memtest64.efi,然后编写40_custom如下代码片段:

menuentry 'Memtest86+ v6' {
  insmod part_gpt
  insmod ext2
  insmod chain
  search --no-floppy --fs-uuid --set root <insert filesystem UUID here>
  chainloader /boot/memtest64.efi
}

答案2

这几乎是 EFI/GPT 系统的默认 GRUB 文件:

if loadfont unicode ; then
    set gfxmode=1024x768,800x600,auto
    set gfxpayload=800x600,1024x768
    terminal_output gfxterm
fi

set default=0
set timeout=-1

insmod linux
insmod part_gpt
insmod fat
search --no-floppy --set=root --label "ESP"

menuentry "Start Memtest86+, use built-in support for USB keyboards" {
    linux /EFI/memtest86+/memtest keyboard=both
}
menuentry "Start Memtest86+, use BIOS legacy emulation for USB keyboards" {
    linux /EFI/memtest86+/memtest keyboard=legacy
}
menuentry "Start Memtest86+, disable SMP and memory identification" {
    linux /EFI/memtest86+/memtest nosmp nosm nobench
}

相关内容