删除的答案很接近

删除的答案很接近

我遇到了一些 btrfs 和 ext4 错误。在决定测试我的 RAM 后,我遇到了以下重复错误memtester。运行一段时间后,我总是会遇到类似的错误memtester。通常在一小时内,但有一次花了 4-5 个小时。

我的电脑的 RAM 已焊接。我有额外的空插槽。BIOS 中没有禁用板载 RAM 的设置。

我已经跑过:

  • Memtest86+ 8 次(约 8 小时)
  • MemTest86 18 次 (约 9 小时)
  • memtester默认情况stressapptest下,Fedora 27 安装在 USB 上(约 10 小时)
  • memtesterUbuntu 17.10 Live 默认设置下stressapptest(约 2 小时)
  • memtester以及stressapptest在 USB 上的 Ubuntu 17.10(约 8 小时)
  • # debsums --changed唯一改变的文件是主题的图像。

他们没有打印任何错误。

我使用的是 Ubuntu 17.10(从 17.04 升级而来),使用默认内核。内核没有被污染。这是一台配备 Intel Haswell i3 的华硕笔记本电脑。

  • 还使用 Linux 4.14.13 和 4.15.0-rc3,rc4、主线进行了测试。
  • 还使用清除的 intel-microcode 包进行了测试。

无论 Nouveau 是否被禁用,错误都是可重现的,没有加载 nvidia 二进制驱动程序。

将以下模块列入黑名单: mtd intel_spi_platform intel_spi因为它们不会在默认 Fedora 27 安装中加载,并且它们似乎导致一些 Lenovo 笔记本电脑变砖。错误仍未停止。

uname -a的输出

Linux hostname 4.13.0-19-generic #22-Ubuntu SMP Mon Dec 4 11:58:07 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

# lsmod的输出

https://paste.ubuntu.com/26222245/

Fedora 27 的# lsmod输出

https://paste.ubuntu.com/26226473/

现在的情况

我把我的硬盘放进一台我知道运行良好的笔记本电脑(备用笔记本电脑)并在那里运行测试。我得到了错误。现在我很确定这是一个软件问题。我尝试了很多个小时,从来没有能够用全新的 Ubuntu 或 Fedora 在我的笔记本电脑上触发错误。

我应该怎么办?

错误示例:

Loop 6:
  Stuck Address       : ok         
  Random Value        : ok
  Compare XOR         : ok
  Compare SUB         : ok
  Compare MUL         : ok
  Compare DIV         : ok
  Compare OR          : ok
  Compare AND         : ok
  Sequential Increment: ok
  Solid Bits          : ok         
  Block Sequential    : ok         
  Checkerboard        : ok         
  Bit Spread          : ok         
  Bit Flip            : testing 262
FAILURE: 0x00000000 != 0xfffffffeffffffff at offset 0x0ef94000.
FAILURE: 0x00000000 != 0x100000000 at offset 0x0ef94008.
FAILURE: 0x00000000 != 0xfffffffeffffffff at offset 0x0ef94010.
FAILURE: 0x00000000 != 0x100000000 at offset 0x0ef94018.
FAILURE: 0x00000000 != 0xfffffffeffffffff at offset 0x0ef94020.
FAILURE: 0x00000000 != 0x100000000 at offset 0x0ef94028.
FAILURE: 0x00000000 != 0xfffffffeffffffff at offset 0x0ef94030.
FAILURE: 0x00000000 != 0x100000000 at offset 0x0ef94038.
  Walking Ones        : ok         
  Walking Zeroes      : ok         
  8-bit Writes        : ok
  16-bit Writes       : ok

当两个 RAM 插槽都已满时,会出现类似的错误:

Loop 1:
  Stuck Address       : ok         
  Random Value        : ok
  Compare XOR         : ok
  Compare SUB         : ok
  Compare MUL         : ok
  Compare DIV         : ok
  Compare OR          : ok
  Compare AND         : ok
  Sequential Increment: ok
  Solid Bits          : ok         
  Block Sequential    : ok         
  Checkerboard        : ok         
  Bit Spread          : testing   4
FAILURE: 0x00000000 != 0x00000050 at offset 0x7da80000.
FAILURE: 0x00000000 != 0xffffffffffffffaf at offset 0x7da80008.
FAILURE: 0x00000000 != 0x00000050 at offset 0x7da80010.
FAILURE: 0x00000000 != 0xffffffffffffffaf at offset 0x7da80018.
FAILURE: 0x00000000 != 0x00000050 at offset 0x7da80020.
FAILURE: 0x00000000 != 0xffffffffffffffaf at offset 0x7da80028.
FAILURE: 0x00000000 != 0x00000050 at offset 0x7da80030.
FAILURE: 0x00000000 != 0xffffffffffffffaf at offset 0x7da80038.
  Bit Flip            : setting 141

错误stressapptest

Report Error: miscompare : DIMM Unknown : 1 : 157s
Hardware Error: miscompare on CPU 2(0x2) at 0x7fcc0726e000(0xb0d18:DIMM Unknown): read:0x0000000000000000, reread:0x0000000000000000 expected:0x4a4a4a4a4a4a4a4a
Report Error: miscompare : DIMM Unknown : 1 : 157s
Hardware Error: miscompare on CPU 2(0x2) at 0x7fcc0726e008(0xb0d18:DIMM Unknown): read:0x0000000000000000, reread:0x0000000000000000 expected:0x4a4a4a4a4a4a4a4a
Report Error: miscompare : DIMM Unknown : 1 : 157s
Hardware Error: miscompare on CPU 2(0x2) at 0x7fcc0726e010(0xb0d18:DIMM Unknown): read:0x0000000000000000, reread:0x0000000000000000 expected:0x4a4a4a4a4a4a4a4a
Report Error: miscompare : DIMM Unknown : 1 : 157s
Hardware Error: miscompare on CPU 2(0x2) at 0x7fcc0726e018(0xb0d18:DIMM Unknown): read:0x0000000000000000, reread:0x0000000000000000 expected:0x4a4a4a4a4a4a4a4a
Report Error: miscompare : DIMM Unknown : 1 : 157s
Hardware Error: miscompare on CPU 2(0x2) at 0x7fcc0726e020(0xb0d18:DIMM Unknown): read:0x0000000000000000, reread:0x0000000000000000 expected:0x4a4a4a4a4a4a4a4a
Report Error: miscompare : DIMM Unknown : 1 : 157s
Hardware Error: miscompare on CPU 2(0x2) at 0x7fcc0726e028(0xb0d18:DIMM Unknown): read:0x0000000000000000, reread:0x0000000000000000 expected:0x4a4a4a4a4a4a4a4a
Report Error: miscompare : DIMM Unknown : 1 : 157s
Hardware Error: miscompare on CPU 2(0x2) at 0x7fcc0726e030(0xb0d18:DIMM Unknown): read:0x0000000000000000, reread:0x0000000000000000 expected:0x4a4a4a4a4a4a4a4a
Report Error: miscompare : DIMM Unknown : 1 : 157s
Hardware Error: miscompare on CPU 2(0x2) at 0x7fcc0726e038(0xb0d18:DIMM Unknown): read:0x0000000000000000, reread:0x0000000000000000 expected:0x4a4a4a4a4a4a4a4a

我怀疑 Ubuntu 的配置与我的笔记本电脑的硬件相结合是导致这些错误的原因。几乎每次都是八个一组。

以下是不重要且不太相关的信息

关于 btrfs 错误;我使用的是 17.04。我在 btrfs 的 irc 中询问过。有人告诉我这可能是硬件错误,也可能是内存管理错误。btrfs 元数据页的一部分被零填充,就像我现在遇到的那样。我确实运行了 memtester 几次,切换到 ext4,并将责任归咎于 nvidia 二进制驱动程序。

我使用的命令及其参数:

# stressapptest -M 10000 -s 1800

10000 是我可以测试的可用内存。我通过free -m-s` 获取它是秒数。

# memtester 4096

笔记本电脑的 CPU 有 2 个核心,所以我通常启动两个实例。4096 是当前可用内存的一半free -m

答案1

删除的答案很接近

此问答中的一条回答已被删除:

您是否已尝试重新安装 ubuntu,因为这听起来像是操作系统级别的内存管理故障

我的答案是类似的,因为它涉及非常低级的内存管理;韩国航空安全远程监视系统在内核级别。

KASLR 的作用

KASLR 代表埃内尔A地址年代步伐大号约图R随机化。我从未听人大声念出这个词,但我在心里将其念成“Casler”。想象一下机器中的友好幽灵。KASLR 是一种安全措施,用于随机化内核模块驻留在内存中的位置。理论上讲,当您不能依赖相同的代码位始终位于相同的内存位置时,内核更难被破解。

KASLR 操作可以被视为内存测试器的对立面,后者会重复读取和写入相同的内存位置,并且不期望发生任何变化。由于这些对立面,它吸引了我(注意到这个成语),在谷歌上搜索了 KASLR 和内存错误。其中一个看似不相关的问题可能值得留言github链接到此问答。原因是他们认为他们是唯一受到内存地址移动影响的人(如果我没有看错的话)。前三个来自红帽我不愿意链接到他们,因为他们的网站只是部分帖子,以便进入谷歌搜索机器人,然后让你付费阅读。

当 KASLR 将内核“内容”加载到内存映射的中间时,会出现一些问题,而这是它不应该做的。不幸的是,我不记得我上周找到的链接,无法将其包含在今晚的答案中。该链接有一个补丁/解决方法,用于指示 KASLR 不使用特定的内存位置。

在确认 KASLR 和内存位置的已知问题后,我在问题下评论禁用 KASLR 并重新运行内存测试。回复说这似乎成功了,所以我发布了这个答案。

如何禁用 KASLR

虽然我已经使用 grub 内核命令行选项“kaslr”好几年了,但至少从版本开始它就成为了内核默认选项4.12。要消除 KASLR 的加载,请使用编辑/etc/default/grub并更改此行:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nokaslr"

除了“quiet”和“splash”之外,您可能还有其他选项。重要的一步是添加“nokaslr”,并保留其他选项。

然后保存文件并运行:

sudo update-grub

当然,禁用 KASLR 的另一种方法是简单地在 Ubuntu 16.04.1 下使用旧内核(如 4.4.0),此时 KASLR 不会自动包含在内。

答案2

这个问题听起来很像是 RAM 的随机位损坏。根据我的经验,MemTest86 对硬件来说是一个“太简单”的测试。它会发现非常糟糕的内存,但轻微的问题往往会被忽视。

如果你想知道你的记忆力是否好,试试跑步Prime95在自我检测/折磨模式下配置为使用尽可能多的 RAM。

另一个很好的测试是运行双面 Rowhammer 测试几个小时。

我相信如果 Prime95 和双面 Rowhammer 都找不到内存的任何问题,那么它可能工作正常。但是,即使内存稍微有点问题(我遇到过这种情况,但长期来看数据损坏),运行 MemTest86、编译程序、安装操作系统、玩游戏似乎也可以正常工作。

答案3

memtester 程序执行malloc()调用来保留堆段中的内存块(请参阅“man memtester”)。程序已使用以下方法保留的内存块malloc()是程序自己使用的,它可以随意读写(参见“man malloc”)。可能几乎 100% 的程序自己或通过库使用这种机制,并且依靠记忆里有确切地他们之前在那个地方写了什么。如果这个有错误,几乎每个程序,包括 Linux 内核,都会有大麻烦,无法正确或稳定地运行。这是根本。如果 KASLR 改变了这些东西,那么上帝保佑我们,因为那时没有程序可以再运行了。所以当然,KASLR才不是更改其他程序中的任何数据内容malloc()稍有保留。

因此,我认为您可能已经以某种方式解决了该问题,但我仍然想为遇到类似问题的人提供建议:

尝试一些 memtest86。如果经过长时间运行后结果正确,则可能是软件问题,您可能需要重新安装 linux。如果它检测到错误,则很可能是硬件故障。

相关内容