Nin*_*ino 10 linux bad-blocks hdparm smartctl
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 SC SN CL CH DH DC Powered_Up_Time Command/Feature_Name
-- -- -- -- -- -- -- -- ---------------- --------------------
c8 00 08 d6 55 dd e2 00 18d+05:13:42.421 READ DMA
27 00 00 00 00 00 e0 00 18d+05:13:42.392 READ NATIVE MAX ADDRESS EXT
ec 00 00 00 00 00 a0 02 18d+05:13:42.378 IDENTIFY DEVICE
ef 03 46 00 00 00 a0 02 18d+05:13:42.355 SET FEATURES [Set transfer mode]
27 00 00 00 00 00 e0 00 18d+05:13:42.327 READ NATIVE MAX ADDRESS EXT
SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Extended offline Completed: read failure 90% 20194 48059863
# 2 Short offline Completed without error 00% 15161 -
Run Code Online (Sandbox Code Playgroud)
有了那个“坏 LBA”(48059863),我该如何使用 hdparm?参数“--read-sector”和“--write-sector”应该有什么类型的地址?
如果我发出命令hdparm --read-sector 48095863 /dev/sda它会读取并转储数据。如果这个命令是正确的,我应该会出现 I/O 错误,对吗?
相反,它转储数据:
$ ./hdparm --read-sector 48059863 /dev/sda
/dev/sda:
reading sector 48059863: succeeded
4b50 5d1b 7563 a932 618d 1f81 4514 2343
8a16 3342 5e36 2591 3b4e 762a 4dd7 037f
6a32 6996 816f 573f eee1 bc24 eed4 206e
(...)
Run Code Online (Sandbox Code Playgroud)
小智 10
如果出于某种原因您更喜欢尝试清除这些坏扇区,并且您不关心驱动器的现有内容,那么下面的 shell 代码段可能会有所帮助。我在旧的 Seagate Barracuda 硬盘上对此进行了测试,该硬盘已经过了保修期。它可能不适用于其他驱动器型号或制造商,但如果您必须编写脚本,它应该会让您走上正确的道路。它会破坏您在驱动器上的任何内容。
您可能更喜欢只运行坏块、hdparm 安全擦除 (SE) ( https://wiki.archlinux.org/index.php/Securely_wipe_disk ) 或其他一些实际为此设计的工具。或者甚至制造商提供了像 SeaTools 这样的工具(有一个 32 位的 linux '企业' 版本,谷歌它)。
在执行此操作之前,请确保有问题的驱动器完全未使用/卸载。另外,我知道,while 循环,没有任何借口。这是一个黑客,你可以让它变得更好......
baddrive=/dev/sdb
badsect=1
while true; do
echo Testing from LBA $badsect
smartctl -t select,${badsect}-max ${baddrive} 2>&1 >> /dev/null
echo "Waiting for test to stop (each dot is 5 sec)"
while [ "$(smartctl -l selective ${baddrive} | awk '/^ *1/{print substr($4,1,9)}')" != "Completed" ]; do
echo -n .
sleep 5
done
echo
badsect=$(smartctl -l selective ${baddrive} | awk '/# 1 Selective offline Completed: read failure/ {print $10}')
[ $badsect = "-" ] && exit 0
echo Attempting to fix sector $badsect on $baddrive
hdparm --repair-sector ${badsect} --yes-i-know-what-i-am-doing $baddrive
echo Continuning test
done
Run Code Online (Sandbox Code Playgroud)
使用“自测”方法的一个优点是负载由驱动器固件处理,因此它所连接的 PC 不会像使用 dd 或坏块那样加载。
注意:对不起,我犯了一个错误,正确的 while 条件是这样的:
while [ "$(smartctl -l selective ${baddrive} | awk '/^ *1/{print $4}')" = "Self_test_in_progess" ]; do
Run Code Online (Sandbox Code Playgroud)
脚本的退出条件变为:
[ $badsect = "-" ] || [ "$badsect" = "" ] && exit 0
Run Code Online (Sandbox Code Playgroud)
我认为它可能没有错误地读取,因为该扇区还不错,但是由于其他一些行为,其他工具无法读取该扇区。(提前阅读到达实际上不可读的扇区?)
我发现了一些坏扇区,如果我用“hdparm --read-sector”修复唯一一个无法读取的扇区,其他“坏”扇区突然不再无法用 dd 之类的东西读取。有趣的是,在查看“dmesg”输出时,只报告了 hdparm 不可读的那些。
例如。我有扇区 36589320 到 36589327 和 36589344 到 36589351 无法用 dd 读取,但只有 36589326 和 36589345 无法用 hdparm --read-sector 读取。然后我在这两个扇区上使用了 hdparm --write-sector,然后所有 16 个扇区都再次可读。
这是 dmesg 输出的一小部分:
[30152036.527940] end_request: I/O error, dev sda, sector 36589326
[30152077.363710] end_request: I/O error, dev sda, sector 36589345
Run Code Online (Sandbox Code Playgroud)
和磁盘信息:
# smartctl -i /dev/sda
...
=== START OF INFORMATION SECTION ===
Device Model: TOSHIBA MK2002TSKB
...
Firmware Version: MT2A
User Capacity: 2,000,398,934,016 bytes [2.00 TB]
Sector Size: 512 bytes logical/physical
...
Run Code Online (Sandbox Code Playgroud)
显然这个磁盘的固件要么没有正确记录重新分配的扇区,要么它们没有真正重新分配,而只是损坏了(就像一个不可恢复的 ECC 错误,但表面仍然有效,就像它是由位腐烂而不是电子设备故障引起的,或者不良媒体):
# smartctl -A /dev/sda | egrep "Reallocated|Pending|Uncorrectable"
5 Reallocated_Sector_Ct 0x0033 100 100 050 Pre-fail Always - 0
196 Reallocated_Event_Count 0x0032 100 100 000 Old_age Always - 0
197 Current_Pending_Sector 0x0032 100 100 000 Old_age Always - 0
198 Offline_Uncorrectable 0x0030 100 100 000 Old_age Offline - 0
# smartctl -l error /dev/sda
...
SMART Error Log Version: 1
No Errors Logged
Run Code Online (Sandbox Code Playgroud)
请注意,我运行了一个 --read-sector 和一个 --write-sector。可能需要读取才能正确重新分配扇区,而不仅仅是写入。如果您不先阅读,它可能不知道该扇区是坏的。
归档时间: |
|
查看次数: |
30164 次 |
最近记录: |