我使用的是 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.efi
EFI/boot
系统分区而不是 EFI 系统分区,类似以下内容可能可以完成此任务:
menuentry 'Memtest86+ v6' {
insmod part_gpt
insmod ext2
insmod chain
set root=(hd0,gpt2)
chainloader /boot/memtest64.efi
}
但正如您在评论中指出的那样,这依赖于存储设备被假定为(hd0)
.
当引导 BIOS 风格时,这曾经是一个很好的假设,因为在i386-pc
GRUB 的 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>)
您应该使用search
GRUB 命令,而不是 。
您可以只在已知路径中搜索文件(从路径名开始)文件所在文件系统的根目录,可能是也可能不是 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
}