找到问题硬盘的『笨』方法

之前总结了一篇关于热插拔的文档,并没有找到问题的真正原因,找到损坏的硬盘也不是件『容易』的事,
后来想了种办法,通过看硬盘灯的闪亮情况看硬盘的健康状况,最简单的通过 dd 来不断的往磁盘里面写数据:

#!/bin/bash
dev=$1
while true; do dd if=/dev/zero of=/data/data${dev}/tmp bs=10k count=1000;sleep 1;done

执行上面的脚本候,比如 ./check.sh 1 就可以看到 /data/data1/tmp 对应的硬盘的灯是否闪亮,如果不闪,在 dmesg 中看到对应的错误,基本可以确定这块硬盘是有问题的。热插拔之后,可以看到新硬盘 Id 变成了 13,并且可以看到硬盘的 vendor 变成了 seagate:
$ cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: WD       Model: WD2000FYYG       Rev: D1B3
  Type:   Direct-Access                    ANSI  SCSI revision: 06

Host: scsi0 Channel: 00 Id: 10 Lun: 00
  Vendor: WD       Model: WD2000FYYG       Rev: D1B3
  Type:   Direct-Access                    ANSI  SCSI revision: 06
Host: scsi0 Channel: 00 Id: 11 Lun: 00
  Vendor: WD       Model: WD2000FYYG       Rev: D1B3
  Type:   Direct-Access                    ANSI  SCSI revision: 06
Host: scsi0 Channel: 00 Id: 13 Lun: 00
  Vendor: SEAGATE  Model: ST2000NM0001     Rev: PS06
  Type:   Direct-Access                    ANSI  SCSI revision: 06

上面这个方法确实比较笨,但是能抓到老鼠,下面这个 gist(1, 2) 记录了 messages 里面的一些错误信息,供参考,这个是热插拔之后的信息。

最后把上面这个来 auto 一下,就不要人肉一个硬盘一个硬盘的看了:
# cat check.sh
#!/bin/bash
dev=$1
while true; do dd if=/dev/zero of=/data/data${dev}/tmp bs=10k count=1000;sleep 1;done

# cat exec.sh
for i in {1..11}
do
    ./check.sh $i &
done

直接执行 ./exec.sh,然后到服务器面板前看灯的闪亮情况就可以了。