我该如何将Memtest86+选项添加回Grub菜单?

如果使用UEFI,请参阅此问题,"我是否可以在使用UEFI时启动memtest86+?"

在我的Lenovo B570上安装64位版本的Ubuntu 12.04后,我遇到了与使用uEFI系统安装11.10时相同的问题,即Grub无法正常工作。我使用了与上次解决问题的相同技术(使用Super Grub Disc LiveCD会话修复Grub),我的系统可以愉快地双重引导Ubuntu和Windows 7。

然而,现在当我启动Grub菜单时,只显示

  • Ubuntu,带有Linux 3.2.0-24-generic
  • Ubuntu,带有Linux 3.2.0-24-generic(恢复模式)
  • 以前的Linux版本
  • Windows 7(加载程序)(在/dev/sda1上)
  • Windows恢复环境(加载程序)(在/dev/sda4上)
我再也看不到之前存在的使用Memtest86+的选项了,在Ubuntu软件中心检查后,我发现该软件包已安装,但是如何使运行它的选项再次出现在Grub菜单中呢?
我尝试过:
sudo update-grub 

这没有任何区别。

sudo chmod +x /etc/grub.d/20_memtest86+ 

结果为:

chmod:无法访问/etc/grub.d/20_memtest86+':没有那个文件或目录

并输入

ls /etc/grub.d/

结果为:

00_header        10_linux      30_os-prober  41_custom
05_debian_theme  20_linux_xen  40_custom     README

尝试按照下面的详细脚本添加,从我的机器上复制它,执行 chmod +x 和 grub update,看看是否有效。看到你已经这样做了,欢迎。 - 23 93 26 35 19 57 3 89
6个回答

尝试打开终端并运行
sudo chmod +x /etc/grub.d/20_memtest86+
sudo update-grub

检查一下是否有它。
grep memtest /boot/grub/grub.cfg

刚刚做了和我禁用的一样的事情。
hob@hob-HP-dx5150-MT:~$ cat /boot/grub/grub.cfg |grep memtest
hob@hob-HP-dx5150-MT:~$ sudo chmod +x /etc/grub.d/20_memtest86+
[sudo] password for hob: 
hob@hob-HP-dx5150-MT:~$ sudo update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.2.0-24-generic
Found initrd image: /boot/initrd.img-3.2.0-24-generic
Found linux image: /boot/vmlinuz-3.2.0-23-generic
Found initrd image: /boot/initrd.img-3.2.0-23-generic
Found memtest86+ image: /boot/memtest86+.bin
Found Ubuntu 11.10 (11.10) on /dev/sda6
Found Trisquel 5.5 (5.5) on /dev/sda8
Found Ubuntu 12.04 LTS (12.04) on /dev/sda9
done
hob@hob-HP-dx5150-MT:~$ cat /boot/grub/grub.cfg |grep memtest
### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry "Memory test (memtest86+)" {
    linux16 /boot/memtest86+.bin
menuentry "Memory test (memtest86+, serial console 115200)" {
    linux16 /boot/memtest86+.bin console=ttyS0,115200n8
### END /etc/grub.d/20_memtest86+ ###

你可以尝试在终端中使用nano创建文件,如果文件不存在的话。
sudo nano /etc/grub.d/20_memtest86+

或者使用图形界面编辑器
gksudo gedit /etc/grub.d/20_memtest86+

填满它

#!/bin/sh
set -e

if [ -f /usr/lib/grub/grub-mkconfig_lib ]; then
  . /usr/lib/grub/grub-mkconfig_lib
  LX=linux16
elif [ -f /usr/lib/grub/update-grub_lib ]; then
  . /usr/lib/grub/update-grub_lib
  LX=linux
else
  # no grub file, so we notify and exit gracefully
  echo "Cannot find grub config file, exiting." >&2
  exit 0
fi

# We can't cope with loop-mounted devices here.
case ${GRUB_DEVICE_BOOT} in
  /dev/loop/*|/dev/loop[0-9]) exit 0 ;;
esac

prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/")"

if test -e /boot/memtest86+.bin ; then
  MEMTESTPATH=$( make_system_path_relative_to_its_root "/boot/memtest86+.bin" )
  echo "Found memtest86+ image: $MEMTESTPATH" >&2
  cat << EOF
menuentry "Memory test (memtest86+)" {
EOF
  printf '%s\n' "${prepare_boot_cache}"
  cat << EOF
    $LX $MEMTESTPATH
}
menuentry "Memory test (memtest86+, serial console 115200)" {
EOF
  printf '%s\n' "${prepare_boot_cache}"
  cat << EOF
    $LX $MEMTESTPATH console=ttyS0,115200n8
}
EOF
fi

#if test -e /boot/memtest86+_multiboot.bin ; then
#  MEMTESTPATH=$( make_system_path_relative_to_its_root "/boot/memtest86+_multiboot.bin" )
#  echo "Found memtest86+ multiboot image: $MEMTESTPATH" >&2
#  cat << EOF
#menuentry "Memory test (memtest86+, experimental multiboot)" {
#EOF
#  printf '%s\n' "${prepare_boot_cache}"
#  cat << EOF
#   multiboot   $MEMTESTPATH
#}
#menuentry "Memory test (memtest86+, serial console 115200, experimental multiboot)" {
#EOF
#  printf '%s\n' "${prepare_boot_cache}"
#  cat << EOF
#   multiboot   $MEMTESTPATH console=ttyS0,115200n8
#}
#EOF
#fi

确保在此之后运行chmod +x命令。
我有点担心它是否丢失了 - 你的grub.d文件夹里其他的东西都有吗?
ls /etc/grub.d/


00_header        10_linux.bak       20_memtest86+  41_custom
05_debian_theme  10_linux.dpkg-old  30_os-prober   README
10_linux         20_linux_xen       40_custom

运行sudo chmod +x /etc/grub.d/20_memtest86+命令后出现了chmod: cannot access /etc/grub.d/20_memtest86+': No such file or directory的错误提示。 - coversnail
已编辑答案,包含了这一部分 - 23 93 26 35 19 57 3 89
已将 ls /etc/grub.d/ 的结果添加到问题中,没有提到 memtest,但是你的答案现在使其完美运行,谢谢。 - coversnail
1我在/etc/grub.d.bak/里面无意中发现了20_memtest86+。我把它放到了正确的位置,更新了GRUB,一切都正常运行。 - Naftuli Kay
5update-grub 无论我怎么做都找不到 memtest 二进制文件 :( - expert
那个文件存在,并且填充了那些内容和权限,我添加了分号以便你知道输出的行何时结束:aaronfranke@aaron-xubuntu:/etc/grub.d$ sudo update-grub; 正在生成 grub 配置文件...; 找到 Linux 镜像:/boot/vmlinuz-4.4.0-22-generic; 找到 initrd 镜像:/boot/initrd.img-4.4.0-22-generic; 找到 Linux 镜像:/boot/vmlinuz-4.4.0-21-generic; 找到 initrd 镜像:/boot/initrd.img-4.4.0-21-generic; 在 /dev/sdb2@/EFI/Microsoft/Boot/bootmgfw.efi 上找到 Windows 引导管理器; 为 EFI 固件配置添加引导菜单项; 完成; - Aaron Franke
3如果文件存在但选项仍未显示在Grub菜单中,可能的原因是什么? - Mpizos Dimitris
8这不是因为 memtest 的 GPL 版本不支持 EFI 吗?所以如果你通过 EFI 引导,使用 Ubuntu 自带的 memtest 是 没有办法 让它工作的吗? - Jeff Atwood
3我得到了以下内容,X@ubuntu:~$ cat /boot/grub/grub.cfg | grep memtest

开始 /etc/grub.d/20_memtest86+

结束 /etc/grub.d/20_memtest86+

- DarrenRhodes
我试过这个,选择memtest86+后出现了空白页面,但是如果我点击"enter"或者"f1",它会发出嘟嘟声,好像正在运行。你有什么建议吗? - enjoy
@JeffAtwood 戳 - Evan Carroll
当我输入sudo nano /etc/grub.d/20_memtest86+时,它打开了文件,并且已经包含了所有内容。但是chmod命令无法识别该文件,也无法使用grep进行搜索。我在电脑上双启动了Ubuntu和Windows。 - Awakened
Linux可以进行内存测试。https://unix.stackexchange.com/a/439769/105120 - user1133275

apt install memtest86+

这将自动重新配置grub并将条目添加到启动菜单中。
如果您收到错误消息memtest86+ is already the newest version,请使用sudo apt-get install --reinstall memtest86+
如果所有其他方法都失败了,您可以获取一个可引导的ISO文件,将其刻录到光盘上并从光盘启动。当然,如果您正在启动UEFI,您应该在这里进行操作。

1对于Ubuntu 16.04服务器,这正是解决方案。如果没有提到apt-get install memtest86+,那么我的系统上就没有/etc/grub.d/20_memtest86+文件。 - mstrap
1@mstrap,这对我来说也是解决方案。我不明白为什么我的答案被投了两次反对票。 - Michael Franzl
1这个解决方案对我无效 - 上述命令收到了一个“memtest86+已经是最新版本”的消息。我怀疑这个解决方案只适用于非UEFI系统,而原始问题明确涉及UEFI系统上的内存测试。 - Jaydin
2这对我也没用,就像JayDin说的,memtest已经安装好了。 我使用synaptik软件包管理器来移除memtest,重启后重新安装它。这样问题就解决了。 - user111667
这个能在活动的USB上使用吗? - Aaron Franke

我遇到了同样的问题,由于我的笔记本电脑上有EFI,所以Ubuntu提供的memtest86+ 4.x版本无法使用,因为EFI只支持5版本及更高版本。
最新版本是非GPL的,必须从memtest网站手动下载(它们有ISO和USB镜像),但至少是免费的。

2http://www.memtest86.com/download.htm - Marcos
1最新版本的memtest不是GPL协议的,必须从memtest官网手动下载(它们提供ISO和USB镜像),但至少是免费的。memtest86是专有软件,而memtest86+则是遵循GPL协议。 - Ramchandra Apte

我在两天的时间内没有成功做到这一点,然后我在Synaptic中检查了grub软件包... 似乎问题的根源是缺少grub-imageboot软件包。
sudo apt-get install grub-imageboot

我尝试过这个,但没有成功。 - Hitechcomputergeek
4找到 memdisk: /boot/memdisk 未找到图像路径 /boot/images - Aaron Franke

这是我为了在UEFI引导时将最新的(非免费)memtest86+添加到grub引导菜单中所做的操作。当前的memtest版本是8.2。 所需工具:磁盘映像挂载器和grub-customizer,后者仅用于方便 :) 文件:memtest二进制文件(见下文)
从以下链接下载memtest二进制文件:https://www.memtest86.com/download.htm 选择“用于在Windows/Linux/Mac系统上创建可启动USB驱动器的映像”即可。
提取IMG文件(memtest86-usb.img)。
使用磁盘映像挂载器打开IMG文件(在Ubuntu上右键单击)。
从挂载的映像中提取/EFI/BOOT/BOOTX64.efi。
创建memtest86引导目录:
sudo mkdir /boot/efi/EFI/memtest86
将BOOTX64.efi复制到引导分区上的新文件夹中(例如/boot/efi/EFI/memtest86)。
打开grub-customizer。
添加菜单项,给它一个名称,选择类型:其他。
添加以下引导顺序(假设您从hd0引导):
insmod part_gpt
insmod fat
set root='hd0,gpt2'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  1A22-970F
else
  search --no-floppy --fs-uuid --set=root 1A22-970F
fi
chainloader /EFI/memtest86/BOOTX64.efi

10. 保存并退出 grub-customizer 11. 重新启动并享受 Memtest86

对于其他人/我自己:#3 磁盘映像挂载器 = gnome-disks。#6 必须使用root权限。#8 为什么类型不是memtest而是其他?#9 如何知道是否从hd0引导?[点击编辑引导驱动器条目并复制setroot的条目]。顺便说一句,非常感谢你提供这个出色的答案。 - dez93_2000
如果一个人的Ubuntu根目录是hd2,那么可以假设你需要在4个地方将0改为2,包括ahci吗?不管怎样,我收到了错误信息"no such device 1A22-970F"和文件'/EFI/memtest86/BOOTX64.efi'未找到。该文件明确位于/boot/efi/EFI/memtest86/目录下。有什么想法吗?谢谢! - dez93_2000
1错误:找不到磁盘HD2,GPT2;现在显示为“没有此设备”;不再出现文件未找到的错误。不确定为什么会发生变化... - dez93_2000
这可能会帮助其他人解决挂载img文件的EFI分区的问题:https://ubuntuforums.org/archive/index.php/t-1576011.html - Natetronn
memtest86+(https://www.memtest.org/)是免费的,而且采用GPL许可证!memtest86(这里没有加号)(https://www.memtest86.com/)则不是。我为自己澄清了这个混淆的问题。 - Martian2020
使用“sudo blkid”命令获取正确的EFI分区UUID。对于我来说,EFI分区位于/dev/sdb3,因此root='hd1,gpt3',而ahci0被替换为ahci1。 - leszek.hanusz

请参阅Unix StackExchange上的this answer。简而言之,Linux内核内置了一个简单的内存测试。

执行grep CONFIG_MEMTEST "/boot/config-$(uname -r)"来确定它是否已启用(如果未启用,则会被注释掉)。

然后,编辑/etc/default/grub并将memtest添加到GRUB_CMDLINE_LINUX_DEFAULT,运行sudo update-grub,然后重新启动。

一旦它完成启动(由于还需运行内存测试,所以需要更长时间),请检查/var/log/kern.log以获取测试结果。