坏扇区是否表明磁盘出现故障?

坏扇区是否表明磁盘出现故障?

我的 Ubuntu 13.10 系统在过去一天左右的表现非常糟糕。查看内核日志,发现不到 1 年的 3TB SATA 磁盘的特定扇区存在问题:

Nov  4 20:54:04 mediaserver kernel: [10893.039180] ata4.01: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
Nov  4 20:54:04 mediaserver kernel: [10893.039187] ata4.01: BMDMA stat 0x65
Nov  4 20:54:04 mediaserver kernel: [10893.039193] ata4.01: failed command: READ DMA EXT
Nov  4 20:54:04 mediaserver kernel: [10893.039202] ata4.01: cmd 25/00:08:f8:3f:83/00:00:af:00:00/f0 tag 0 dma 4096 in
Nov  4 20:54:04 mediaserver kernel: [10893.039202]          res 51/40:00:f8:3f:83/40:00:af:00:00/10 Emask 0x9 (media error)
Nov  4 20:54:04 mediaserver kernel: [10893.039207] ata4.01: status: { DRDY ERR }
Nov  4 20:54:04 mediaserver kernel: [10893.039211] ata4.01: error: { UNC }
Nov  4 20:54:04 mediaserver kernel: [10893.148527] ata4.00: configured for UDMA/133
Nov  4 20:54:04 mediaserver kernel: [10893.180322] ata4.01: configured for UDMA/133
Nov  4 20:54:04 mediaserver kernel: [10893.180345] sd 3:0:1:0: [sdc] Unhandled sense code
Nov  4 20:54:04 mediaserver kernel: [10893.180349] sd 3:0:1:0: [sdc]
Nov  4 20:54:04 mediaserver kernel: [10893.180353] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
Nov  4 20:54:04 mediaserver kernel: [10893.180356] sd 3:0:1:0: [sdc]
Nov  4 20:54:04 mediaserver kernel: [10893.180359] Sense Key : Medium Error [current] [descriptor]
Nov  4 20:54:04 mediaserver kernel: [10893.180371] Descriptor sense data with sense descriptors (in hex):
Nov  4 20:54:04 mediaserver kernel: [10893.180373]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00
Nov  4 20:54:04 mediaserver kernel: [10893.180384]         af 83 3f f8
Nov  4 20:54:04 mediaserver kernel: [10893.180389] sd 3:0:1:0: [sdc]
Nov  4 20:54:04 mediaserver kernel: [10893.180393] Add. Sense: Unrecovered read error - auto reallocate failed
Nov  4 20:54:04 mediaserver kernel: [10893.180396] sd 3:0:1:0: [sdc] CDB:
Nov  4 20:54:04 mediaserver kernel: [10893.180398] Read(16): 88 00 00 00 00 00 af 83 3f f8 00 00 00 08 00 00
Nov  4 20:54:04 mediaserver kernel: [10893.180412] end_request: I/O error, dev sdc, sector 2944614392
Nov  4 20:54:04 mediaserver kernel: [10893.180431] ata4: EH complete

kern.log文件大约 33MB,大部分都充满了上述重复的错误,并且该扇区在重复的消息中似乎没有任何不同。

我目前正在卸载的磁盘上运行以下命令来测试并尝试解决磁盘可能存在的任何问题。我大约花了 12 个小时,预计还需要 24/48 小时,因为磁盘太大了:

e2fsck -c -c -p -v /dev/sdc1

我的问题是:此驱动器是否出现故障,或者我正在考虑这里的常见问题?我想知道修复或忽略坏扇区是否有任何意义,以及我是否应该在保修期内更换仍在保修期内的磁盘。我对上述命令的了解有些缺乏,所以我怀疑它是否有帮助。

快更新吧!

e2fsck 最终在 2 天后完成,并出现大量“inode 中多重声明的块”。尝试挂载文件系统导致错误,迫使其恢复为只读:

Nov 11 08:29:05 mediaserver kernel: [211822.287758] EXT4-fs (sdc1): warning: mounting fs with errors, running e2fsck is recommended
Nov 11 08:29:05 mediaserver kernel: [211822.301699] EXT4-fs (sdc1): mounted filesystem with ordered data mode. Opts: errors=remount-ro

尝试手动读取扇区:

sudo dd count=1 if=/dev/sdc of=/dev/null skip=2944614392
dd: reading ‘/dev/sdc’: Input/output error
0+0 records in
0+0 records out
0 bytes (0 B) copied, 5.73077 s, 0.0 kB/s

尝试写入它:

sudo dd count=1 if=/dev/zero of=/dev/sdc seek=2944614392
dd: writing to ‘/dev/sdc’: Input/output error
1+0 records in
0+0 records out
0 bytes (0 B) copied, 2.87869 s, 0.0 kB/s

在这两个方面,Reallocated_Sector_Ct仍然是 0。

驱动器确实经常进入睡眠状态。我现在认为这可能是文件系统问题?我不是100%。

答案1

坏扇区始终表明 HDD 出现故障,事实上,当您看到此类 I/O 错误时,您可能已经丢失/损坏了一些数据。如果您还没有备份,请进行备份,运行自检smartctl -t long /dev/disk并检查 SMART 数据smartctl -a /dev/disk。如果可以的话,换一个。

坏扇区无法修复,只能用保留扇区替换,这会损害 HDD 性能,因为每次访问它们时都需要对保留扇区进行额外的查找。在文件系统层将这些扇区标记为坏扇区会有所帮助,因为那时它们将永远不会被访问;然而,很难确定磁盘已经重新分配了哪些扇区,因此文件系统很可能不知道要避开受影响的区域。

答案2

要使驱动器重新分配扇区,通常需要向其中写入一些内容。然而,ddD伊斯克Destroyer)并不总是有效,而且非常不安全:如果您混淆了skipseek选项,你很容易搬起石头砸自己的脚skipN一个块/dev/zero并从该“偏移量”写入一个块在硬盘的 0 扇区上

如果您确实知道要强制用零覆盖该扇区,则应该使用hdparm

% sudo hdparm --read-sector 833192656 /dev/sda
/dev/sda:
reading sector 833192656: FAILED: Input/output error

是的,833192656 号扇区在智能测试中也未通过。要向其写入零,请使用--write-sector

% sudo hdparm --write-sector 833192656 /dev/sda
/dev/sda:
Use of --write-sector is VERY DANGEROUS.
You are trying to deliberately overwrite a low-level sector on the media.
This is a BAD idea, and can easily result in total data loss.
Please supply the --yes-i-know-what-i-am-doing flag if you really want this.
Program aborted.

作为一种保护措施,除非您将开关hdparm传递给以下内容,否则不会真正编写任何内容:--yes-i-know-what-i-am-doinghdparm

% sudo hdparm --yes-i-know-what-i-am-doing --write-sector 833192656 /dev/sda
/dev/sda:
re-writing sector 833192656: succeeded
% sudo hdparm --read-sector 833192656 /dev/sda                              

/dev/sda:
reading sector 833192656: succeeded
0000 0000 0000 0000 0000 0000 0000 0000
[      ... more zeroes here...        ]
0000 0000 0000 0000 0000 0000 0000 0000

%

答案3

不,坏扇区不是总是驱动器出现故障的指示。有时,如果在断电时正在进行写入,则扇区中的数据将被损坏,从而导致您尝试读取时出错。尝试将新数据写入该扇区可能会正常工作,因为它没有任何物理问题。

您可以badblocks -n在驱动器上运行来读取和重写每个扇区,或者在您的情况下,因为您已经知道相关扇区的编号,所以您可以dd向其写入零。您可以使用 查看 SMART 统计数据smartctl -a。您应该看到挂起的重新分配计数指示有多少扇区读取失败,并且在尝试写入扇区后,该计数将会下降。重新分配的扇区数可能会增加,在这种情况下,它的物理损坏已被重新映射到备用池,这可能是驱动器即将退出的迹象。如果没有,那么它只是乱码,现在应该没问题了。

首先尝试读取扇区:

dd count=1 if=/dev/sda of=/dev/null skip=nnnn

如果失败,那么您的数字是正确的,那么您可以使用以下方法将其归零:

dd count=1 if=/dev/zero of=/dev/sda seek=nnnn

在按 Enter 键之前,请仔细检查您是否准确地键入了命令。

相关内容