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 写入过程)……但是在那之后,待处理的扇区数仍然没有改变。我还调用了sync和smartctl -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] 然而,一些驱动器在写入时不会立即重新映射这些扇区;相反,驱动器将首先尝试写入问题扇区,如果写入操作成功,则该扇区将被标记为良好。
换句话说,挂起的扇区应该立即重新映射,或者驱动器应该尝试写入该扇区并且应该发生以下两种情况之一:
我之前暗示过这一点,但维基百科对 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)来帮助防止低级别数据损坏。如果您有任何无法轻松复制的内容,请不要忘记执行频繁的备份。
文章坏扇区重新映射给所使用的算法。
硬盘上有两个缺陷列表:
因此,您的坏扇区比正常的最后一个扇区多 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,但不幸的是后者也是坏的,并且固件不知道如何重新映射坏的备用扇区。结果是无法纠正的坏扇区。
归档时间: |
|
查看次数: |
14476 次 |
最近记录: |