我遇到了一些 btrfs 和 ext4 错误。在决定测试我的 RAM 后,我遇到了以下重复错误memtester
。运行一段时间后,我总是会遇到类似的错误memtester
。通常在一小时内,但有一次花了 4-5 个小时。
我的电脑的 RAM 已焊接。我有额外的空插槽。BIOS 中没有禁用板载 RAM 的设置。
我已经跑过:
- Memtest86+ 8 次(约 8 小时)
- MemTest86 18 次 (约 9 小时)
memtester
默认情况stressapptest
下,Fedora 27 安装在 USB 上(约 10 小时)memtester
Ubuntu 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。如果它检测到错误,则很可能是硬件故障。