smartctl 工具允许启动长时间的自检 ( smartctl -t long /dev/sda)。但是badblocks,我也可以在驱动器上运行。两者有什么关系?如果 badblocks 检测到坏块,驱动器是否会自动更新其 SMART 值(例如,通过更新其重新定位的扇区数)?坏块可以代替smartctl -t long,反之亦然?
我有一个使用了一个多月的 NAS 设备。它被配置为通过电子邮件发送从硬盘驱动器的 SMART 数据生成的警报。一天后,其中一个硬盘驱动器报告一个扇区损坏并被重新分配。在第一周,这个数字攀升到有问题的硬盘驱动器的六个扇区。一个月后,这个数字达到了 9 个重新分配的扇区。这个速度似乎肯定在减速。
NAS 在 RAID-5 配置中配置了六个 1.5 TB 驱动器。使用如此大容量的驱动器,我预计某个扇区会不时出现故障,因此我并不担心最初的几个扇区何时被重新定位。尽管其他磁盘都没有报告任何问题,但让我感到困扰。
我应该开始担心驱动器的健康状况吗?这可能会因驱动器的容量而异吗?
当对磁盘的 SMART 检查报告坏扇区时,重要的是能够识别具有坏扇区的文件 - 并从备份中恢复它。下面,我展示了我是如何为我的 Linux/ext3 VMWARE 服务器做到这一点的——但有没有人知道这是否可以为 Windows/NTFS 做到这一点?
以下是我为 Linux/ext3 所做的:我首先要求驱动器进行硬件表面扫描(低于操作系统级别,使用驱动器上的 SMART 电路):
vserver:~# smartctl -t long /dev/sdc
Run Code Online (Sandbox Code Playgroud)
我看了结果:
vserver:~# smartctl -a /dev/sdc
...
196 Reallocated_Event_Count 0x0032 100 100 000 Old_age Always - 1
197 Current_Pending_Sector 0x0012 100 100 000 Old_age Always - 9
...
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Extended offline Completed: read failure 90% 27679 591363172
Run Code Online (Sandbox Code Playgroud)
因此,一个扇区已经被标记为坏,9 个被标记为从“暂存”扇区空间替换。更重要的是,第一个不可读的逻辑块地址 (LBA) 是 591363172。
我找到了这个数字“转换”为的分区(以及其中的偏移量):
vserver:~# fdisk -lu /dev/sdc
Device Boot Start End Blocks Id System …Run Code Online (Sandbox Code Playgroud) SMART 指出我服务器硬盘上的一个待处理扇区。我已经阅读了很多推荐使用 hdparm 来“轻松”强制磁盘重新定位坏扇区的文章,但我找不到正确的使用方法。
我的“smartctl”中的一些信息:
Error 95 occurred at disk power-on lifetime: 20184 hours (841 days + 0 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 d7 55 dd 02 Error: UNC at LBA = 0x02dd55d7 = 48059863
Commands leading to the command that caused the error were:
CR FR …Run Code Online (Sandbox Code Playgroud) 假设 MLC SSD 已经使用了很长时间,第一个单元已达到其最后一个擦除周期并拒绝擦除。
之后会发生什么?控制器是否将其检测为坏块并移动到下一个并尝试擦除它?驱动器的总容量是否会随着时间的推移而缓慢减少?
编辑
当然,我们可以忘记磨损均衡。是的,它延长了驱动器的使用寿命,但我不是在谈论那个。最终一个单元将达到它的最后一个擦除周期。
我想用随机字节覆盖一个非常大的硬盘驱动器(18TB),然后检查智能数据是否有重新分配的扇区或其他错误。
由于 badblocks 对单次运行中使用的块数量有一些限制,我尝试了 archlinux wiki 上描述的“cryptsetup 方法”:
https://wiki.archlinux.org/title/Badblocks#Finding_bad_sectors
我在整个驱动器上设置了一个加密的逻辑设备字段,然后使用命令“shred”将零写入打开的字段设备:
cryptsetup open /dev/device eld --type plain --cipher aes-xts-plain64
shred -v -n 0 -z /dev/mapper/eld
Run Code Online (Sandbox Code Playgroud)
它继续打印诸如
shred: /dev/mapper/eld: pass 1/1 (000000)...870MiB/17TiB 0%
shred: /dev/mapper/eld: pass 1/1 (000000)...1.7GiB/17TiB 0%
...
shred: /dev/mapper/eld: pass 1/1 (000000)...4.1TiB/17TiB 24%
Run Code Online (Sandbox Code Playgroud)
但随后它停止在 4.1TiB/17TiB 写入。我已经用 hexdump 验证了这一点,零没有写入到字节地址 0x428249b0000 (4570459340800 ~ 4.156 TiB) 之外:
hexdump -C --skip 0x428249a0000 /dev/mapper/eld | head
428249a0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| …Run Code Online (Sandbox Code Playgroud) 经过 3 年的 24x7 服务,1TB 希捷 Barracuda ES.2 企业级硬盘出现故障迹象。SMART 重新分配的扇区数很高。
维基百科文章表明,如果重新映射的扇区未使用,该驱动器仍可用于不太敏感的用途,例如阵列外的暂存存储。
A workaround which will preserve drive speed at the expense of capacity
is to create a disk partition over the region which contains remaps and
instruct the operating system to not use that partition.
Run Code Online (Sandbox Code Playgroud)
为了创建这样的分区,有必要获取重新映射的扇区列表。但是,操作系统看不到坏块。即badblocks返回一个空列表。
有没有办法恢复重新分配的扇区列表?
编辑:此驱动器来自阵列。我们每年都会有一些失败,把它们扔掉似乎是一种浪费。我正在考虑给盘子中更好的部分第二次机会。
这是 SMART 报告现在的样子。
=== START OF INFORMATION SECTION ===
Model Family: Seagate Barracuda ES.2
Device Model: ST31000340NS
Serial Number: **********
Firmware Version: SN05
...
ID# ATTRIBUTE_NAME FLAG …Run Code Online (Sandbox Code Playgroud) smartd 在我的硬盘上检测到一个坏块,我想知道该块属于哪个文件。我在逻辑卷上有 ext3 文件系统。谷歌给了我很多教程(比如这个:http : //www.vanderzee.org/bad_blocks_howto),当文件系统直接在硬盘块设备上创建时,如何按块号查找文件。他们都没有提到 LVM。在我的情况下,有没有办法按块号查找文件?
我有一个 Western Digital RE4 1.5TB,它刚刚重新分配了 56 个扇区。
Reallocated Sectors Count,140,193,193,OK,56,0,Enabled
Run Code Online (Sandbox Code Playgroud)
我想知道是否有可能找出哪些文件受这些重新分配的扇区影响,以及它们是否因重新分配而损坏位。
假设以下情况:管理员在维护使用 RAID5 的 NAS 服务器(QNAP QTS 4.3.3)时不够小心,已经出现了其中两个(四分之二)驱动器包含坏块的情况,但没有驱动器完全失效。没有外部备份。
假设两个驱动器上的坏块不重叠,100% 数据恢复应该是有道理的,但真的是这样吗?应该如何处理这个问题?
谢谢大家!