鉴于memtest86+ 无法与 UEFI 配合使用,是否有开源替代方案或者我可以使用 grub 来测试内存?
答案1
是的,有,而且现在就是内存测试86+ v6本身。这是Memtest86+的新版本,基于PCM测试,这是Memtest86+的重写,可以从UEFI启动。它的作者仍然将其标记为尚未准备好用于生产,但它确实可以在许多配置中使用。
Memtest86+ v6 的二进制文件可用在 memtest.org 上。
或者,Linux 内核本身包含一个内存测试工具:该memtest
选项将运行最多 17 种模式的内存检查(当前)。如果添加memtest
到内核启动参数,它将在启动时运行所有测试,并保留任何失败的地址,以便不使用它们。如果您想要更少的测试,您可以指定模式的数量(memtest=8
例如)。
这不像 Memtest86+ 的测试那么广泛,但仍然给出了相当不错的结果。
某些发行版内核不包含此功能;您可以通过查找来检查它是否可用CONFIG_MEMTEST
在你的内核配置中(尝试/boot/config-$(uname -r)
)。如果你指定memtest
但内核不支持它,内核不会抱怨;当它运行时,您应该看到类似的输出
[ 0.000000] early_memtest: # of tests: 17
[ 0.000000] 0x0000000000010000 - 0x0000000000099000 pattern 4c494e5558726c7a
[ 0.000000] 0x0000000000100000 - 0x0000000003800000 pattern 4c494e5558726c7a
[ 0.000000] 0x000000000500d000 - 0x0000000007fe0000 pattern 4c494e5558726c7a
[ 0.000000] 0x0000000000010000 - 0x0000000000099000 pattern eeeeeeeeeeeeeeee
[ 0.000000] 0x0000000000100000 - 0x0000000003800000 pattern eeeeeeeeeeeeeeee
[ 0.000000] 0x000000000500d000 - 0x0000000007fe0000 pattern eeeeeeeeeeeeeeee
[ 0.000000] 0x0000000000010000 - 0x0000000000099000 pattern dddddddddddddddd
[ 0.000000] 0x0000000000100000 - 0x0000000003800000 pattern dddddddddddddddd
[ 0.000000] 0x000000000500d000 - 0x0000000007fe0000 pattern dddddddddddddddd
[ 0.000000] 0x0000000000010000 - 0x0000000000099000 pattern bbbbbbbbbbbbbbbb
[ 0.000000] 0x0000000000100000 - 0x0000000003800000 pattern bbbbbbbbbbbbbbbb
...
当内核启动时(或稍后在其启动日志中)。
您可以使用 QEMU 来感受一下:
qemu-system-x86_64 -kernel /boot/vmlinuz-$(uname -r) -append "memtest console=ttyS0" -nographic
(或qemu-system-...
适合您的架构的任何一个),然后查找“early_memtest”。要在内核崩溃后退出 QEMU,请按Ctrla, c, q, Enter。
答案2
您可以添加最新的免费软件(免费啤酒)版本内存测试86进入 Ubuntu 上的 UEFI Grub2。
基于一个教程,我在远程 Ubuntu 16.04 服务器上执行了以下步骤来添加内存测试86UEFI Grub2:
首先,请注意 grub2 不显示 memtest86 也不显示 memtest86+: 尽管事实上我的启动文件夹显然有 memtest86+。见下图。
下载memtest86-usb.zip到笔记本电脑
将 zip 文件发送到远程计算机,然后将其解压缩到某个位置(例如
/home/<username>/memtest86-usb/
)我们需要使用分析 memtest86-usb.img
fdisk -lu memtest86-usb.img
来查看它的安装偏移量。 我们想要安装上面输出中列出的第二个设备memtest86-usb.img2
。上图显示每个扇区为 512 Bytes,memtest86-usb.img2
从 514048 扇区开始。因此从 514048*512 Bytes=263192576 Bytes 开始。创建一个文件夹(例如
/home/<username/memtest-tmp
)并安装它:mkdir /home/<username>/memtest-tmp sudo mount -o loop,offset=263192576 /home/<username>/memtest86-usb/memtest86-usb.img
使用 lsblk 检查有关 EFI 分区以及挂载的 .img 文件的详细信息 在上图中,我们注意到以下几点:
- EFI分区挂载的位置,这里是
/boot/efi
。- 请注意,在我的服务器中,我可以在 BIOS 设置中选择启动模式为
legacy
或。UEFI
我之前已将其设置为legacy
,因此该/boot/efi
文件夹不存在。更改启动模式以UEFI
允许我查看该/boot/efi
文件夹并验证 EFI 分区是否安装在那里。
- 请注意,在我的服务器中,我可以在 BIOS 设置中选择启动模式为
- 设备编号。设备名称为sdA1;这就是这封信A。这一点在后面很重要。
- 分区号。设备名称是sda1;因此它是分区1。这对以后很重要
- 作为健全性检查,我们还注意到memtest86-usb.img2被安装到
/home/<username>/memtest-tmp
.
- EFI分区挂载的位置,这里是
接下来,我们同时复制并重命名
/home/<username>/memtest-tmp/EFI/BOOT
为/boot/efi/EFI/memtest86
(假设目标文件夹/boot/efit/EFI/memtest86
):接下来我们创建一个 GRUB chainloader 条目。创建文件/etc/grub.d/42_memtest,内容类似于以下内容:
#!/bin/sh exec tail -n +3 $0 # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above. menuentry 'memtest86' { insmod part_gpt insmod fat set root='hd0,gpt1' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1 4418-37D3 else search --no-floppy --fs-uuid --set=root 4418-37D3 fi chainloader /EFI/memtest86/BOOTX64.efi}
在上图中,我们这样做了
set root='hd0,gtp1
,因为我们的 EFI 分区被标记为设备名称 =sda1。根据 grub2 约定...- 这A在标准差A对应于0在高清0
- 这1在sda1对应于1在GTp1。
- 我们可以使用总分*指定分区的格式1设备的sda因为我们做到了
insmod part_gpt
。我们可以将磁盘标签类型识别为总蛋白使用fdisk -l
命令,也可以通过查看/boot/grub/grub.cfg
文件。
另请注意,我们使用了 EFI 分区通用唯一标识符,可以从
blkid
显示计算机上所有分区的 UUID 的命令中获取。我们将 grub2 更新为
update-grub2
.
答案3
Memtest 6 应与 uefi 配合使用。测试版可在 memtest.org 上获取
代码可在https://github.com/memtest86plus/memtest86plus
Memtest86+ v6.00 Beta 2 发布:2022-06-03 v6 尚未准备好投入生产!请将实际代码视为实验性代码,并预计会发生崩溃和冻结。第一个非测试版预计将于今年夏天发布。
尽管它是测试版,我还是尝试了一下,下载了 iso,将其添加到 USB 记忆棒上,并且可以从 uefi 启动它,并且它运行了 memtest,就像我习惯的那样。