我正在进行全新的 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] 但是有些驱动器在写入时不会立即重新映射这些扇区;相反,驱动器会首先尝试写入问题扇区,如果写入操作成功,则该扇区将被标记为良好。
换句话说,待处理的扇区应该立即被重新映射,或者驱动器应该尝试写入该扇区,并且应该发生以下两件事之一:
- 写入失败,在这种情况下应该重新映射待处理的扇区。
- 写入成功,在这种情况下待处理的扇区应该已经被清除(“标记为良好”)。
我之前暗示过这一点,但维基百科对当前待处理部门的描述表明磁盘完全写入后,当前待处理扇区数应始终为零。由于这里的情况并非如此,我们可以得出结论:(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,但不幸的是后者也是坏的,并且固件不知道如何重新映射坏的备用扇区。结果是一个无法纠正的坏扇区。