![18.04 LTS 上的大型文件(32 GB)损坏](https://linux22.com/image/914419/18.04%20LTS%20%E4%B8%8A%E7%9A%84%E5%A4%A7%E5%9E%8B%E6%96%87%E4%BB%B6%EF%BC%8832%20GB%EF%BC%89%E6%8D%9F%E5%9D%8F%20.png)
我在处理大型文件时遇到了问题。我有 64 GB 的 RAM,存储驱动器都是三星 860 EVO。我在原始驱动器上运行 mdcrypt,在其上运行 luks RAID,并使用 ext4 作为文件系统。我有很多可用的驱动器空间,并且没有运行交换。
我的发行版是 Ubuntu 18.04 LTS(4.18.0-25-generic #26~18.04.1-Ubuntu SMP Thu Jun 27 07:28:31 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux)。
第一次发现这种异常是在克隆大型 USB 拇指驱动器时。然后我注意到大型循环安装的文件系统也会损坏。
片段如下:
我首先创建一个 32 GB 的文件,零:
$ dd if=/dev/zero of=zero-file_32GB bs=1024k count=32768
32768+0 records in
32768+0 records out
34359738368 bytes (34 GB, 32 GiB) copied, 55.3081 s, 621 MB/s
然后我对该文件进行 SHA256 求和以获取哈希码。请注意哈希值如何随着多次迭代而变化:
$ sha256sum zero-file_32GB
5f7f8ea75d87ac7d64c07ecc2c5fdbe407540913ac0feb050ede768990140b38 zero-file_32GB
$ sha256sum zero-file_32GB
64bcf7372df895319ce9e54758aec2814600fa3335fb82c5996a7636e7d637be zero-file_32GB
$ sha256sum zero-file_32GB
3475353b2a00e5abebb1878a9ddb5956eb829c94af26d9cd079f991fbd84435c zero-file_32GB
$ sha256sum zero-file_32GB
cf65fa70ba04d7bb4055b72fdf2ac90bf65ac8457cc80b8e673af5acb57d22d1 zero-file_32GB
MD5 和也存在同样的不一致情况:
$ md5sum zero-file_32GB
8633b9ba83a8ac04c9b56fad0a065ec2 zero-file_32GB
$ md5sum zero-file_32GB
cc289d380b25235b7610a7b86bc4fd47 zero-file_32GB
$ md5sum zero-file_32GB
249f66bd3843b6fcad8316fd0a3e660c zero-file_32GB
$ md5sum zero-file_32GB
888ac00592204be7a026c27e98159ff2 zero-file_32GB
现在,我相当确信我的文件已损坏,而不是哈希求和算法已损坏。为了验证这个假设,我将 32 GB 的零文件拆分成 32 个 1 GB 的块:
$ split --verbose -b 1G zero-file_32GB split-1G_
creating file 'split-1G_aa'
creating file 'split-1G_ab'
creating file 'split-1G_ac'
creating file 'split-1G_ad'
creating file 'split-1G_ae'
creating file 'split-1G_af'
creating file 'split-1G_ag'
creating file 'split-1G_ah'
creating file 'split-1G_ai'
creating file 'split-1G_aj'
creating file 'split-1G_ak'
creating file 'split-1G_al'
creating file 'split-1G_am'
creating file 'split-1G_an'
creating file 'split-1G_ao'
creating file 'split-1G_ap'
creating file 'split-1G_aq'
creating file 'split-1G_ar'
creating file 'split-1G_as'
creating file 'split-1G_at'
creating file 'split-1G_au'
creating file 'split-1G_av'
creating file 'split-1G_aw'
creating file 'split-1G_ax'
creating file 'split-1G_ay'
creating file 'split-1G_az'
creating file 'split-1G_ba'
creating file 'split-1G_bb'
creating file 'split-1G_bc'
creating file 'split-1G_bd'
creating file 'split-1G_be'
creating file 'split-1G_bf'
然后我对新的文件分割进行 SHA256 求和。它们应该完全相同,因为它们每个都应该只包含零。但请注意分裂时的不一致亚利桑那州和巴:
$ sha256sum split-1G_??
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_aa
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_ab
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_ac
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_ad
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_ae
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_af
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_ag
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_ah
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_ai
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_aj
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_ak
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_al
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_am
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_an
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_ao
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_ap
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_aq
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_ar
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_as
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_at
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_au
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_av
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_aw
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_ax
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_ay
702301f26e8df8cf784ca6b45954f1ca3524d1e22c322ee271ab1ac20b4face2 split-1G_az
bd9442046cecfcdec29169f5e8485ee0e226f56fab24cfded23b4ad15275b5d9 split-1G_ba
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_bb
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_bc
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_bd
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_be
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14 split-1G_bf
与 MD5 和类似的不一致之处:
$ md5sum split-1G_??
cd573cfaace07e7949bc0c46028904ff split-1G_aa
cd573cfaace07e7949bc0c46028904ff split-1G_ab
cd573cfaace07e7949bc0c46028904ff split-1G_ac
cd573cfaace07e7949bc0c46028904ff split-1G_ad
cd573cfaace07e7949bc0c46028904ff split-1G_ae
cd573cfaace07e7949bc0c46028904ff split-1G_af
cd573cfaace07e7949bc0c46028904ff split-1G_ag
cd573cfaace07e7949bc0c46028904ff split-1G_ah
cd573cfaace07e7949bc0c46028904ff split-1G_ai
cd573cfaace07e7949bc0c46028904ff split-1G_aj
cd573cfaace07e7949bc0c46028904ff split-1G_ak
cd573cfaace07e7949bc0c46028904ff split-1G_al
cd573cfaace07e7949bc0c46028904ff split-1G_am
cd573cfaace07e7949bc0c46028904ff split-1G_an
cd573cfaace07e7949bc0c46028904ff split-1G_ao
cd573cfaace07e7949bc0c46028904ff split-1G_ap
cd573cfaace07e7949bc0c46028904ff split-1G_aq
cd573cfaace07e7949bc0c46028904ff split-1G_ar
cd573cfaace07e7949bc0c46028904ff split-1G_as
cd573cfaace07e7949bc0c46028904ff split-1G_at
cd573cfaace07e7949bc0c46028904ff split-1G_au
cd573cfaace07e7949bc0c46028904ff split-1G_av
cd573cfaace07e7949bc0c46028904ff split-1G_aw
cd573cfaace07e7949bc0c46028904ff split-1G_ax
cd573cfaace07e7949bc0c46028904ff split-1G_ay
7036950003e53e471654b020330b386e split-1G_az
0a82f6068a91bef3b46294e1e30687be split-1G_ba
cd573cfaace07e7949bc0c46028904ff split-1G_bb
cd573cfaace07e7949bc0c46028904ff split-1G_bc
cd573cfaace07e7949bc0c46028904ff split-1G_bd
cd573cfaace07e7949bc0c46028904ff split-1G_be
cd573cfaace07e7949bc0c46028904ff split-1G_bf
我曾想过不断分割成更小的块来确定实际差异的大小,然后用十六进制编辑器进行分析,但我怀疑这是否能提供任何见解来了解导致数据质量下降的原因。我的 ISO 映像、视频文件和 EXT4 循环文件系统正在损坏。知道罪魁祸首是什么吗?
由于这种情况只在 32 GB 时才开始发生(发生大约是 64 GB RAM 的一半。我没有使用交换区。),我倾向于认为这是内存问题。您怎么说?
更新#1:
不幸的是,内存测试并没有花费预期的时间。:-(
更新 #2(解决方案!)
- 我从计算机上移除了所有 4 个 16 GB 的内存条。
- 然后,我仅将序列号最低的内存条插入第一个 DIMM 插槽,即插槽 #1(我的插槽编号为 1 到 4)。我运行 MemTest86 3:44(三小时四十四分钟),它以零错误完成。
- 我用下一个按顺序编号的内存条替换了该内存条(在明显的断电和静电预防措施之后)。我再次使用了插槽 #1(因为我希望先测试所有内存,然后再开始检查插槽)。我再次运行了 MemTest86。这次测试几乎立即中止,因为错误太多。
- 因此,我将第三个 DIMM 插入插槽 #1。MemTest86 运行了 3:43,没有错误。
- 插槽 #1 中的第四个 DIMM 测试也运行了 3:43,并且没有出现错误。
- 然后我将三条已知良好的 DIMM 插入前三个插槽。MemTest86 运行了 8:54,没有任何错误。
有趣的是,我发现测试三个 DIMM(8:54)所花的时间比测试三个单模块所花的时间(3:44 + 3:43 + 3:43 = 11:10)要少得多。我猜有些测试是同时进行的。
我sha256sum' 生成了一个新的 32 GB 零文件。即使经过多次迭代,总和仍然保持不变。我的总和是97af759fc4597bc41706df77cbab318a57d935bacb262bd409e3ab767e07066f,与@bernard.wei 给出的数字相同。
我要感谢@heynnema 对 MemTest86 的建议。这对解决这个问题很有帮助。
我认为这个问题已经解决了。谢谢大家!
答案1
检查您的三星 860 EVO 的固件更新。
Samsung Magician
是一个用于检查固件的 Windows 应用程序。检查您的 BIOS 版本,
sudo dmidecode -s bios-version
然后访问制造商的网站来查找更新的 BIOS。运行
memtest
检查你的 64G RAM。转到https://www.memtest86.com/并下载/运行免费memtest
测试您的记忆力。至少完成一次所有测试以确认记忆力良好。这将需要很多小时才能完成。
更新#1:
memtest
测试 2/4 失败,[地址测试,自己的地址]
memtest
可能由于一些原因而失败...
安装了错误规格的 RAM
BIOS 设置为对内存进行超频,或以最大速度运行
DIMM 未正确安装在插槽中
DIMM 有缺陷
DIMM 通常成对安装,大小相同,以便利用两个通道 A 和 B(在某些情况下为更多通道)的内存交错速度优势。第一对 DIMM 插入插槽 A1/B1,第二对 DIMM 插入插槽 A2/B2。(假设这是一台具有四个或更多 DIMM 插槽的台式计算机)。
步骤1:
- 检查你的 RAM 规格,确保它们与你的主板兼容
第2步:
- 检查你的 BIOS 设置
步骤#3:
触摸底盘接地,拔下计算机电源插头,按住电源按钮 10 秒钟
重新安装所有 DIMM
重新测试
memtest
如果
memtest
运行成功,你可能已经解决了问题
步骤4:
触摸底盘接地,拔下计算机电源插头,按住电源按钮 10 秒钟
识别 A2/B2 DIMM 并小心地将其移除
重新测试
memtest
如果
memtest
运行成功,则 A1/B1 DIMM 良好如果
memtest
失败,则 A1 或 B1 DIMM 有问题- 移除 A1 或 B1 DIMM
- 将其替换为 A2 或 B2 DIMM
- 重新测试
memtest
- 如果
memtest
运行成功,则说明您拔出的 A1/B1 DIMM 是有缺陷的 - 如果
memtest
失败,则另一个 A1/B1 DIMM 有缺陷
假设您有四个 16G DIMM,继续将剩余的 DIMM 穿过插槽 A1/B1,直到只剩下一个有缺陷的 DIMM 未被安装。请记住,您实际上可能有多个有缺陷的 DIMM。
更新 #2:
使用memtest
,已识别出一个损坏的 DIMM。校验和现在正确且一致。