尝试删除/诊断 SMART 数据中的单个 Current_Pending_Sector

尝试删除/诊断 SMART 数据中的单个 Current_Pending_Sector

我正在进行全新的 Linux 安装,在安装之前,我认为这是验证 HDD 健康状况的好时机,因为如果需要,我可以安全地覆盖 HDD 上的任何数据。

首先,我尝试使用 smartmontools 检查...我的 Seagate HDD 报告一个当前待处理扇区和一个脱机无法纠正的扇区(可能是同一个)。重新分配的扇区数为零。

5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       -       0
...
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       1
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       1

然而 SMART 自我测试(短、长、离线、传送)没有发现错误。

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed without error       00%      6631         -
# 2  Conveyance offline  Completed without error       00%      6630         -
# 3  Extended offline    Completed without error       00%      6622         -
# 4  Short offline       Completed without error       00%      6600         -
# 5  Extended offline    Completed without error       00%      6632         -

我也尝试过跑步坏块-wsv(完整读写 4 模式通过测试)在驱动器上没有发现坏块。然后我按照以下指南操作(尽可能地,因为我在运行坏块后删除了我的文件系统):http://smartmontools.sourceforge.net/badblockhowto.html

上面说如果我用全零覆盖扇区,磁盘应该移动(重新分配)待处理扇区。Badblocks 的最后写入模式全为零,所以应该已经完成​​了。然而什么都没有改变,我仍然有待处理扇区数 1。
然后我尝试找出哪个扇区是有问题的,在 SMART 输出中有一个错误日志:

Error 2 occurred at disk power-on lifetime: 5344 hours (222 days + 16 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 7c 1b 1a 02 ae  Error: ABRT at LBA = 0x0e021a1b = 235018779

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  20 20 7f 18 1a 02 ae 00      00:09:05.228  READ SECTOR(S)
  20 20 01 17 1a 02 ae 00      00:09:05.228  READ SECTOR(S)
  20 20 01 01 00 00 a0 00      00:08:59.830  READ SECTOR(S)
  91 20 3f 01 00 00 af 00      00:08:59.826  INITIALIZE DEVICE PARAMETERS [OBS-6]
  10 20 01 01 00 00 a8 00      00:08:59.678  RECALIBRATE [OBS-4]

Error 1 occurred at disk power-on lifetime: 5009 hours (208 days + 17 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 b7 8c 02 e0  Error: UNC at LBA = 0x00028cb7 = 167095

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  25 20 1e 9e 8c 02 e0 00      00:02:20.691  READ DMA EXT
  25 20 1e 80 8c 02 e0 00      00:02:20.691  READ DMA EXT
  25 20 1e 62 8c 02 e0 00      00:02:20.690  READ DMA EXT
  25 20 1e 44 8c 02 e0 00      00:02:20.690  READ DMA EXT
  25 20 1e 26 8c 02 e0 00      00:02:20.690  READ DMA EXT

因此显然驱动器有两个错误。

84 51 7c 1b 1a 02 ae  Error: ABRT at LBA = 0x0e021a1b = 235018779

40 51 00 b7 8c 02 e0  Error: UNC at LBA = 0x00028cb7 = 167095

因此我假设这些是扇区号:167095 和 235018779。然后我尝试用 dd 写入零:

dd if=/dev/zero of=/dev/sda bs=512 count=1 seek=167095

现在这个扇区已经没问题了。但是当我尝试另一个扇区时:

dd if=/dev/zero of=/dev/sda bs=512 count=1 seek=235018779

我明白了dd:'/dev/sda':无法寻找:参数无效。然后我发现我的硬盘只有 234441658 个扇区。所以这超出了范围。但是为什么 SMART 会在该地址上报告错误呢?!

有人能帮我弄清楚吗?如果我做错了,还能告诉我如何正确执行此操作吗?我怀疑我可能错误地将块大小 512 与 dd 一起使用。这是 SMART 报告的扇区大小。也许那些 LBA 地址是字节而不是块我尝试设置 bs=1 并只向 HDD 上的那些地址写入一个字节。这确实有效(dd 写入过程)……但是此后待处理的扇区数仍然没有改变。我还打电话给同步smartctl -t 离线 /dev/sda尝试“强制”驱动器重新分配扇区。没有结果...

这是我的完整smartctl --all /dev/sda输出:

smartctl 5.43 2012-06-30 r3573 [i686-linux-2.6.32-358.el6.i686] (local build)
Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Model Family:     Seagate Barracuda 7200.9
Device Model:     ST3120811AS
Serial Number:    6PT1N4VZ
Firmware Version: 3.AAE
User Capacity:    120,034,123,776 bytes [120 GB]
Sector Size:      512 bytes logical/physical
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   7
ATA Standard is:  Exact ATA specification draft version not indicated
Local Time is:    Mon Nov 18 12:03:00 2013 UTC
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x82) Offline data collection activity
                    was completed without error.
                    Auto Offline Data Collection: Enabled.
Self-test execution status:      (   0) The previous self-test routine completed
                    without error or no self-test has ever 
                    been run.
Total time to complete Offline 
data collection:        (  430) seconds.
Offline data collection
capabilities:            (0x5b) SMART execute Offline immediate.
                    Auto Offline data collection on/off support.
                    Suspend Offline collection upon new
                    command.
                    Offline surface scan supported.
                    Self-test supported.
                    No Conveyance Self-test supported.
                    Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
                    power-saving mode.
                    Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                    General Purpose Logging supported.
Short self-test routine 
recommended polling time:    (   1) minutes.
Extended self-test routine
recommended polling time:    (  51) minutes.

SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   084   077   006    Pre-fail  Always       -       185600113
  3 Spin_Up_Time            0x0003   095   095   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   098   098   020    Old_age   Always       -       2185
  5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   073   055   030    Pre-fail  Always       -       25890559714
  9 Power_On_Hours          0x0032   093   093   000    Old_age   Always       -       6632
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   098   098   020    Old_age   Always       -       2229
187 Reported_Uncorrect      0x0032   099   099   000    Old_age   Always       -       1
189 High_Fly_Writes         0x003a   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   071   056   045    Old_age   Always       -       29 (Min/Max 25/29)
194 Temperature_Celsius     0x0022   029   044   000    Old_age   Always       -       29 (0 13 0 0 0)
195 Hardware_ECC_Recovered  0x001a   052   046   000    Old_age   Always       -       194244099
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       1
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       1
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0000   100   253   000    Old_age   Offline      -       0
202 Data_Address_Mark_Errs  0x0032   066   219   000    Old_age   Always       -       34

SMART Error Log Version: 1
ATA Error Count: 2
    CR = Command Register [HEX]
    FR = Features Register [HEX]
    SC = Sector Count Register [HEX]
    SN = Sector Number Register [HEX]
    CL = Cylinder Low Register [HEX]
    CH = Cylinder High Register [HEX]
    DH = Device/Head Register [HEX]
    DC = Device Command Register [HEX]
    ER = Error register [HEX]
    ST = Status register [HEX]
Powered_Up_Time is measured from power on, and printed as
DDd+hh:mm:SS.sss where DD=days, hh=hours, mm=minutes,
SS=sec, and sss=millisec. It "wraps" after 49.710 days.

Error 2 occurred at disk power-on lifetime: 5344 hours (222 days + 16 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 7c 1b 1a 02 ae  Error: ABRT at LBA = 0x0e021a1b = 235018779

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  20 20 7f 18 1a 02 ae 00      00:09:05.228  READ SECTOR(S)
  20 20 01 17 1a 02 ae 00      00:09:05.228  READ SECTOR(S)
  20 20 01 01 00 00 a0 00      00:08:59.830  READ SECTOR(S)
  91 20 3f 01 00 00 af 00      00:08:59.826  INITIALIZE DEVICE PARAMETERS [OBS-6]
  10 20 01 01 00 00 a8 00      00:08:59.678  RECALIBRATE [OBS-4]

Error 1 occurred at disk power-on lifetime: 5009 hours (208 days + 17 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 b7 8c 02 e0  Error: UNC at LBA = 0x00028cb7 = 167095

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  25 20 1e 9e 8c 02 e0 00      00:02:20.691  READ DMA EXT
  25 20 1e 80 8c 02 e0 00      00:02:20.691  READ DMA EXT
  25 20 1e 62 8c 02 e0 00      00:02:20.690  READ DMA EXT
  25 20 1e 44 8c 02 e0 00      00:02:20.690  READ DMA EXT
  25 20 1e 26 8c 02 e0 00      00:02:20.690  READ DMA EXT

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed without error       00%      6631         -
# 2  Conveyance offline  Completed without error       00%      6630         -
# 3  Extended offline    Completed without error       00%      6622         -
# 4  Short offline       Completed without error       00%      6600         -
# 5  Extended offline    Completed without error       00%      6632         -

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

更新:

正如 rob 的回答所建议的那样,我尝试用零覆盖整个硬盘。检查 SMART 值,然后开始读取整个硬盘。再次检查 SMART 值。结果是:在两种情况下,写入后和读取后,有关待处理/重新分配扇区数的 SMART 值均未改变。重新分配 0。待处理 1。

答案1

读取失败时,扇区被标记为待处理。如果后续写入失败,待处理扇区将被标记为重新分配。如果写入成功,则将其从当前待处理扇区中移除并假定为正常。(确切的行为可能略有不同,我稍后会详细介绍,但目前这是一个足够接近的近似值。)

当你运行时badblocks -w,每个模式首先被写入,然后读取。写入不稳定扇区可能会成功,但后续读取会失败,这会再次将其添加到待处理扇区列表中。我会尝试使用 将零写入整个磁盘dd if=/dev/zero of=/dev/sda,检查 SMART 状态,然后使用 读取整个磁盘dd if=/dev/sda of=/dev/null并再次检查 SMART 状态。

更新:

根据您之前的结果badblocks -w,我原本预计写入整个磁盘后待处理的扇区会被清除。但由于这并没有发生,因此可以肯定地说,该磁盘的表现不符合预期。

让我们回顾一下当前待处理部门数量

“不稳定”扇区的数量(由于不可恢复的读取错误而等待重新映射)。如果随后成功读取了不稳定扇区,则重新映射该扇区,并减少此值。扇区上的读取错误不会立即重新映射该扇区(因为无法读取正确的值,因此不知道要重新映射的值,而且该值可能稍后才可读);相反,驱动器固件会记住需要重新映射该扇区,并在下次写入时重新映射它。[29] 但是,有些驱动器在写入时不会立即重新映射此类扇区;相反,驱动器将首先尝试写入问题扇区,如果写入操作成功,则该扇区将被标记为良好(在这种情况下,“重新分配事件计数”(0xC4)不会增加)。这是一个严重的缺点,因为如果这样的驱动器包含边缘扇区,这些扇区仅在成功写入操作后经过一段时间后才持续失败,那么驱动器将永远不会重新映射这些问题扇区。

现在让我们回顾一下要点:

...驱动器固件会记住该扇区需要重新映射,并会在下次写入时重新映射它。[29] 但是有些驱动器在写入时不会立即重新映射这些扇区;相反,驱动器会首先尝试写入问题扇区,如果写入操作成功,则该扇区将被标记为良好。

换句话说,待处理的扇区应该立即被重新映射,或者驱动器应该尝试写入该扇区,并且应该发生以下两件事之一:

  1. 写入失败,在这种情况下应该重新映射待处理的扇区。
  2. 写入成功,在这种情况下待处理的扇区应该已经被清除(“标记为良好”)。

我之前暗示过这一点,但维基百科对当前待处理部门的描述表明磁盘完全写入后,当前待处理扇区数应始终为零。由于这里的情况并非如此,我们可以得出结论:(a)维基百科是错误的(或者至少对您的驱动器来说是不正确的),或者(b)驱动器的固件无法正确处理此错误状态(我认为这是一个固件错误)。

如果随后成功读取不稳定扇区,则重新映射该扇区并减少该值。

由于读取整个驱动器后,当前待处理扇区数仍未改变,因此我们可以断言 (a) 无法成功读取扇区,或者 (b) 成功读取扇区并将其标记为良好,但读取其他扇区时出错。但由于读取后重新分配的扇区数仍为 0,因此我们可以排除 (b) 的可能性,并得出结论,待处理扇区仍然无法读取。

此时,了解硬盘是否记录了任何新的 SMART 错误会很有帮助。我的下一个建议是检查 Seagate 是否有固件升级为您的驱动器,但看起来他们没有。

虽然我建议不要继续使用此驱动器,但听起来你可能愿意接受所涉及的风险(即,它可能继续出现异常和/或进一步降级或发生灾难性故障)。在这种情况下,你可以尝试安装 Linux,从救援 CD 启动,然后(在文件系统未挂载的情况下)使用e2fsck -l 文件名手动将相应块标记为坏块。(只需确保您保留良好的备份!)

e2fsck -l 文件名

将 filename 指定的文件中列出的块号添加到坏块列表中。此文件的格式与 badblocks(8) 程序生成的格式相同。请注意,块号基于文件系统的块大小。因此,必须为 badblocks(8) 提供文件系统的块大小才能获得正确的结果。因此,使用 e2fsck 的 -c 选项更简单、更安全,因为它将确保将正确的参数传递给 badblocks 程序。

(请注意,e2fsck -c是首选e2fsck -l filename,您甚至可能想尝试它,但根据您迄今为止的结果,我非常怀疑 e2fsck -c 是否会发现任何坏块。)

当然,您必须进行一些算术运算,将故障扇区的 LBA(由 SMART 提供)转换为文件系统块号。坏块解决方法提供了一个方便的公式:

  b = (int)((L-S)*512/B)
where:
b = File System block number
B = File system block size in bytes
L = LBA of bad sector
S = Starting sector of partition as shown by fdisk -lu
and (int) denotes the integer part.

本指南还包含使用此公式的完整示例。安装操作系统后,您可以使用以下命令确认文件是否占用不稳定扇区调试文件系统(请参阅 HowTo 以获得详细说明)。

另一种选择:围绕疑似坏块进行分区 安装操作系统时,您也可以尝试在错误周围进行分区。如果我的计算正确,错误大约在 81.589 MB,因此可以将 /boot 弄小一点,并在扇区 167095 之后开始下一个分区,或者完全跳过前 82 MB 左右。

ABRT 235018779 不幸的是,对于扇区 235018779 处的 ABRT 错误,我们只能推测,但 ATA8-ACS 规范为我们提供了一些线索。

来自工作草案 AT 附件 8 - ATA/ATAPI 命令集 (ATA8-ACS)

6.2.1 中止 (ABRT) 错误位 2。如果不支持该命令,则应将中止设置为 1。如果设备无法完成命令请求的操作,则可将中止设置为 1。如果 IDNF 未设置为 1,则如果请求的地址超出用户可访问地址范围,也应将中止设置为 1。

查看导致 ABRT 的命令(几个读取扇区,然后重新校准和重新初始化)...

如果不支持该命令,则应将 Abort 设置为 1。- 这似乎不太可能。

如果设备无法完成命令请求的操作,则可以将 Abort 设置为 1。- 也许重新分配扇区的 P 列表将用户可访问的地址移动得足够远,以至于用户可访问的地址转换为扇区 235018779,并且读取操作无法完成(出于什么原因,我们不知道……但没有 CRC 错误,所以我认为我们不能得出扇区 235018779 是坏的结论)。

如果 IDNF 未设置为 1,并且请求的地址超出了用户可访问地址范围,则也应将 Abort 设置为 1。- 在我看来,这种情况极有可能发生,我可能会将其解释为软件错误(可能是您的操作系统或您正在运行的某个程序)。在这种情况下,这并不是硬盘即将崩溃的征兆。

万一您还没有厌倦运行诊断程序......

您可以再试smartctl -t long /dev/sda一次,看看它是否会在 SMART 日志中产生更多错误,或者您可以将此错误保留为未解决X档案;) 并定期检查 SMART 日志以查看是否再次发生这种情况。无论如何,如果您继续使用该驱动器而不让它重新分配或清除待处理扇区,那么您已经处于危险之中。

使用校验和文件系统

为了更加安全,您可能需要考虑使用校验和文件系统(例如 ZFS 或 btrfs)来帮助防止低级数据损坏。如果您有任何无法轻易复制的内容,请不要忘记经常进行备份。

答案2

文章坏扇区重新映射给出所使用的算法。

硬盘上有两份缺陷列表:

  • P 列表是制造过程中发现的缺陷,也称为主要缺陷。它们依次跟随正常扇区。坏扇区将使用移位号(首先是 +1,然后是 +2 等)指向其替换扇区。
  • G 列表是驱动器正常使用过程中产生的缺陷,称为“增长缺陷”。它们的分配没有任何限制,也不需要按顺序跟在 P 列表缺陷之后。坏扇区将使用简单的扇区号指向其替换扇区。

因此,坏扇区超出正常的最后一个扇区 577121 个扇区并不意味着您有 577121 个坏扇区,除非它是 P 列表缺陷。G 列表缺陷可以位于任何位置,因此固件完全有可能将其分配在备用扇区空间的末尾。

来自维基百科已知 ATA SMART 属性

重新分配的扇区数

重新分配扇区数。当硬盘发现读取/写入/验证错误时,它会将该扇区标记为“重新分配”,并将数据传输到特殊的保留区域(备用区域)。此过程也称为重新映射,重新分配的扇区称为“重新映射”。原始值通常表示已发现并重新映射的坏扇区数。

当前待处理部门数量

“不稳定”扇区的数量(由于不可恢复的读取错误而等待重新映射)。如果随后成功读取了不稳定扇区,则将重新映射该扇区,并减少此值。扇区上的读取错误不会立即重新映射该扇区(因为无法读取正确的值,因此不知道要重新映射的值,而且该值可能稍后才可读);相反,驱动器固件会记住需要重新映射该扇区,并在下次写入时重新映射它。

因此,实际上,待处理错误比重新映射更糟糕,因为错误严重到足以阻止读取原始内容以进行重新映射。实际上,该扇区的内容可能永远丢失。

文件MHDD 非常低级的硬盘诊断工具错误代码解释如下:

UNC : data is uncorrectable
ABRT : command was aborted

因此,扇区 167095 无法纠正,并且对 235018779 的读取/写入被中止。

由于写入两个扇区并没有将状态从待处理更改为已重新映射,因此在我看来,替换扇区也是坏的。我的理论是扇区 167095 被重新映射到扇区 235018779,但不幸的是后者也是坏的,并且固件不知道如何重新映射坏的备用扇区。结果是一个无法纠正的坏扇区。

相关内容