为什么这个SSD返回不一致的数据,为什么备份映像文件与校验和不匹配?

为什么这个SSD返回不一致的数据,为什么备份映像文件与校验和不匹配?

这是关于笔记本电脑中的 SSD 的问题。看来 SSD 已经出现问题,甚至可能损坏数据。每次在不使用时访问它时,它似乎都会返回不同的数据(详情见下文)。可以使用哪些工具来证实这一怀疑?

当硬盘驱动器开始慢慢损坏时,SMART 输出中通常会有明确的指示,图形工具(例如)gsmart control会用红色突出显示某个值,服务(例如)smartd可能已经生成了警告。此时,用户可能仍有时间在驱动器开始损坏数据之前创建备份。当然,如果驱动器已经开始损坏数据,则备份中的某些文件可能会损坏。

SMART 输出中似乎没有针对此 SSD 的明确警告,dmesg 等中没有记录任何内核错误(另一方面,ecryptfs 记录了错误)。换句话说,只是偶然发现这个 SSD 可能已经很糟糕了,即使不使用也会损坏数据。
在备份此 SSD(sda)后(1:1 dd 映像),我发现映像文件的校验和与 SSD 的校验和不匹配。当然,这是在实时系统中,因此 SSD 未安装,这意味着其内容在备份过程中不可能发生变化。

这是我制作备份副本的方法。“BUTTER”是我安装外部驱动器的地方,该驱动器使用 BTRFS 格式化,这样我就能够在备份驱动器也坏的情况下找出数据错误(与大多数其他文件系统不同,BTRFS 有校验和)。

[root@localhost mnt]# time dd if=/dev/sda of=BUTTER/SSD.dd.img bs=400M && echo OK
610+1 records in
610+1 records out
256060514304 bytes (256 GB, 238 GiB) copied, 5188.27 s, 49.4 MB/s

real    86m28.726s
user    0m0.008s
sys 7m3.597s
OK

我创建了镜像文件和 SSD 的另一个 MD5 校验和,但它们不匹配。重复此过程后,我意识到SSD 的 MD5 校验和每次都不同

[root@localhost mnt]# time dd if=/dev/sda bs=400M | md5sum >/tmp/MD5-again

610+1 records in
610+1 records out
256060514304 bytes (256 GB, 238 GiB) copied, 1059.87 s, 242 MB/s

real    17m39.904s
user    8m21.708s
sys 3m58.466s
[root@localhost mnt]# cat /tmp/MD5-again
24e71715359158f3ab38e748af93718c  -
[root@localhost mnt]# time dd if=/dev/sda bs=400M | md5sum >>/tmp/MD5-again
610+1 records in
610+1 records out
256060514304 bytes (256 GB, 238 GiB) copied, 1073.7 s, 238 MB/s

real    17m53.735s
user    8m28.494s
sys 4m23.993s
[root@localhost mnt]# cat /tmp/MD5-again
24e71715359158f3ab38e748af93718c  -
569d517626c1b7394acca0c4020c99bc  -

再次强调,SSD 在整个过程中从未被安装过。

# mount | grep -c sda
0

我运行了 SMART 测试,但未发现任何问题。没有记录 SMART 错误。SMART
属性:

设备型号:SanDisk SD8TN8U256G1001

[root@localhost mnt]# smartctl -A /dev/sda
smartctl 6.6 2017-11-05 r4594 [x86_64-linux-4.16.3-301.fc28.x86_64] (local build)
Copyright (C) 2002-17, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 4
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0032   100   100   ---    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   100   100   ---    Old_age   Always       -       3173
 12 Power_Cycle_Count       0x0032   100   100   ---    Old_age   Always       -       1117
170 Unknown_Attribute       0x0032   100   100   ---    Old_age   Always       -       0
171 Unknown_Attribute       0x0032   100   100   ---    Old_age   Always       -       0
172 Unknown_Attribute       0x0032   100   100   ---    Old_age   Always       -       0
173 Unknown_Attribute       0x0032   100   100   ---    Old_age   Always       -       37
174 Unknown_Attribute       0x0032   100   100   ---    Old_age   Always       -       41
178 Used_Rsvd_Blk_Cnt_Chip  0x0032   100   100   ---    Old_age   Always       -       0
180 Unused_Rsvd_Blk_Cnt_Tot 0x0033   100   100   010    Pre-fail  Always       -       100
184 End-to-End_Error        0x0033   100   100   097    Pre-fail  Always       -       0
187 Reported_Uncorrect      0x0032   100   100   ---    Old_age   Always       -       0
194 Temperature_Celsius     0x0022   056   062   ---    Old_age   Always       -       44 (Min/Max 13/62)
199 UDMA_CRC_Error_Count    0x0032   100   100   ---    Old_age   Always       -       0
233 Media_Wearout_Indicator 0x0033   093   100   001    Pre-fail  Always       -       15484248
234 Unknown_Attribute       0x0032   100   100   ---    Old_age   Always       -       11127
241 Total_LBAs_Written      0x0030   253   253   ---    Old_age   Offline      -       3192
242 Total_LBAs_Read         0x0030   253   253   ---    Old_age   Offline      -       66461
249 Unknown_Attribute       0x0032   100   100   ---    Old_age   Always       -       9346

发生了什么?

答案1

发完这个问题后,我马上就发现了自己的错误。我使用 Fedora XFCE 作为实时系统,它自动启用了恰好位于相关 SSD 上的交换分区。当然,当实时系统积极使用 SSD 上的交换分区时,它就会更改 SSD 的内容。

[root@localhost mnt]# swapon --show
NAME      TYPE      SIZE   USED PRIO
/dev/sda3 partition   8G 103.3M   -2

现在我已经发布了这个问题,这有点尴尬。但我还是把它留在那里,希望这对其他可能犯同样错误的人有用。

我所要做的就是禁用之前自动挂载的交换分区:

[root@localhost mnt]# swapoff -a

我想指出的是,当我启动实时系统时,交换分区会自动挂载。我不希望挂载该交换分区。我想知道如果该交换分区上有休眠映像会发生什么。

禁用不需要的交换分区后,一切都按预期工作。使用上面显示的命令,映像文件的校验和现在与 SSD 的校验和相匹配。换句话说,这个 SSD 还不错。

相关内容