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

Iva*_*vic 19 linux hard-drive smart bad-sectors bad-blocks

我正在执行全新的 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
Run Code Online (Sandbox Code Playgroud)

然而,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         -
Run Code Online (Sandbox Code Playgroud)

我还尝试在驱动器上运行badblocks -wsv(完全读写 4 模式通过测试),但没有发现坏块。然后我按照指南(尽可能地,因为我在运行坏块后删除了我的文件系统)在这里找到:http : //smartmontools.sourceforge.net/badblockhowto.html

它说如果我用全零覆盖扇区,磁盘应该移动(重新分配)挂起的扇区。坏块上次写入模式全为零,所以应该这样做。但是什么都没有改变我仍然有那个待处理的扇区数 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
Run Code Online (Sandbox Code Playgroud)

所以显然驱动器有两个错误。

84 51 7c 1b 1a 02 ae  Error: ABRT at LBA = 0x0e021a1b = 235018779
Run Code Online (Sandbox Code Playgroud)

40 51 00 b7 8c 02 e0  Error: UNC at LBA = 0x00028cb7 = 167095
Run Code Online (Sandbox Code Playgroud)

所以我假设这些是扇区号:167095 和 235018779。我尝试用 dd 写零:

dd if=/dev/zero of=/dev/sda bs=512 count=1 seek=167095
Run Code Online (Sandbox Code Playgroud)

现在那一个没问题。但是,当我尝试与其他部门合作时:

dd if=/dev/zero of=/dev/sda bs=512 count=1 seek=235018779
Run Code Online (Sandbox Code Playgroud)

我得到dd: '/dev/sda': cannot seek: Invalid argument。然后我发现我的硬盘只有 234441658 个扇区。所以这超出了范围。但是为什么SMART会在该地址上报告错误?!

任何人都可以帮我解决这个问题,如果我做错了,还可以告诉我如何正确地做到这一点?我怀疑在 dd 中使用块大小 512 可能是错误的。这是 SMART 报告的扇区大小。也许那些 LBA 地址是字节而不是块,我尝试设置 bs=1 并且只向 HDD 上的这些地址写入一个字节。那确实有效(dd 写入过程)……但是在那之后,待处理的扇区数仍然没有改变。我还调用了syncsmartctl -t offline /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.
Run Code Online (Sandbox Code Playgroud)

更新:

正如 rob 的回答中所建议的,我尝试用零覆盖整个 HDD。检查 SMART 值,然后开始读取整个 HDD。再次检查 SMART 值。结果是:在这两种情况下,关于挂起/重新分配扇区计数的 SMART 值在写入后和读取后都不会立即更改。重新分配 0。待定 1。

rob*_*rob 15

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

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

更新:

根据您之前使用 的结果badblocks -w,我预计在写入整个磁盘后会清除待处理的扇区。但由于这并没有发生,可以肯定地说这个磁盘没有按预期运行。

让我们回顾一下Current Pending Sector Count的描述:

“不稳定”扇区的计数(由于不可恢复的读取错误,正在等待重新映射)。如果随后成功读取不稳定扇区,则重新映射该扇区并减小该值。扇区上的读取错误不会立即重新映射该扇区(因为无法读取正确的值,因此无法知道要重新映射的值,并且稍后可能会变得可读);相反,驱动器固件会记住该扇区需要重新映射,并会在下次写入时重新映射。 [29] 然而,一些驱动器在写入时不会立即重新映射这些扇区;相反,驱动器将首先尝试写入问题扇区,如果写入操作成功,则该扇区将被标记为良好(在这种情况下,“重新分配事件计数”(0xC4)不会增加)。

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

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

换句话说,挂起的扇区应该立即重新映射,或者驱动器应该尝试写入该扇区并且应该发生以下两种情况之一:

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

我之前暗示过这一点,但维基百科对 Current Pending Sector 的描述表明当前挂起的扇区数在 full disk write 后应该始终为零。由于这里不是这种情况,我们可以得出结论,要么 (a) Wikipedia 是错误的(或至少对您的驱动器不正确),要么 (b) 驱动器的固件无法正确处理此错误状态(我认为这是固件错误) )。

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

由于当前挂起的扇区数在读取整个驱动器后仍保持不变,我们可以断言 (a) 扇区无法成功读取或 (b) 扇区已成功读取并标记为良好,但读取 a 时出错不同的部门。但是由于读取后重新分配的扇区计数仍然为 0,我们可以排除 (b) 作为可能性,并可以得出未决扇区仍然不可读的结论。

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

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

e2fsck -l 文件名

将文件名指定的文件中列出的块编号添加到坏块列表中。该文件的格式与 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.
Run Code Online (Sandbox Code Playgroud)

HowTo 还包含使用此公式的完整示例。安装操作系统后,您可以使用debugfs确认文件是否占用片状扇区(详细说明请参阅 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。如果设备无法完成命令请求的操作,则 Abort 可以设置为 1。如果 IDNF 未设置为 1,则如果请求用户可访问地址范围之外的地址,则中止也应设置为 1。

查看导致 ABRT 的命令(几个 READ SECTOR(S),然后是重新校准和重新初始化)...

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

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

如果 IDNF 未设置为 1,则如果请求用户可访问地址范围之外的地址,则中止也应设置为 1。- 对我来说这似乎是最有可能的,我可能会将其解释为软件错误(您的操作系统或您正在运行的某些程序)的结果。在这种情况下,这并不是硬盘即将灭亡的迹象。

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

您可以smartctl -t long /dev/sda再次尝试查看它是否会在 SMART 日志中产生更多错误,或者您可以将此作为未解决的X 文件;) 并定期检查 SMART 日志以查看它是否再次发生。在任何情况下,如果您继续使用驱动器而没有重新分配或清除挂起的扇区,那么您已经在冒险了。

使用校验和文件系统

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


har*_*ymc 5

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

硬盘上有两个缺陷列表:

  • P-list 是在制造过程中发现的缺陷,也称为主要缺陷。它们依次跟随正常扇区。坏扇区将使用移位编号(首先是 +1,然后是 +2 等)来指向它的替换。
  • G-List 是在驱动器正常使用中产生的缺陷,称为生长缺陷。它们的分配没有限制,它们不需要顺序地遵循 P-list 缺陷。坏扇区将使用简单的扇区号指向它的替换。

因此,您的坏扇区比正常的最后一个扇区多 577121 个扇区并不意味着您有 577121 个坏扇区,除非它是 P 表缺陷。G-list 缺陷可以放在任何地方,因此固件完全有可能将其分配在备用扇区空间的末尾。

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

重新分配的扇区数

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

当前未决扇区数

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

所以实际上,挂起的错误比重映射要糟糕得多,因为错误已经足够严重,以至于无法读取原始内容以进行重映射。实际上,该扇区的内容可能永远丢失了。

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

UNC : data is uncorrectable
ABRT : command was aborted
Run Code Online (Sandbox Code Playgroud)

所以扇区 167095 是不可纠正的,对 235018779 的读/写被中止。

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