
smartctl -i -A
私の質問は非常に単純です。サーバーにあるすべてのディスクでコマンドを実行したいのです。ディスクと RAID コントローラーの数が異なるサーバーが多すぎると思うので、診断のためにすべてのドライバーをスキャンする必要があります。 を実行しようと思っているsmartctl --scan | awk '{print $1}' >> test.log
ので、test.log を開くとすべてのドライブ情報が表示されます。
その後、すべてのドライバーをスキャンするために、いくつかの if または do 構文を実行する必要がありますsmartctl
。RAID コントローラーも識別する必要があるため、これが最善の方法かどうかはわかりません。正しい方向に向かっていますか?
編集:
私はトラブルシューティングに以下のコマンドを使用します:
RAIDコントローラなし
for i in {c..d}; do
echo "Disk sd$i" $SN $MD
smartctl -i -A /dev/sd$i |grep -E "^ "5"|^"197"|^"198"|"FAILING_NOW"|"SERIAL""
done
PERC コントローラー
for i in {0..12}; do
echo "$i" $SN $MD
smartctl -i -A -T permissive /dev/sda -d megaraid,$i |grep -E "^ "5"|^"197"|^"198"|"FAILING_NOW"|"SERIAL""
done
/usr/sbin/megastatus –physical
/usr/sbin/megastatus --logical
3ware コントローラー
for i in {0..10}; do
echo "Disk $i" $SN $MD
smartctl -i -A /dev/twa0 -d 3ware,$i |grep -E "^ "5"|^"197"|^"198"|"FAILING_NOW"|"SERIAL""
done
SmartArray & Megaraid コントローラー:
smartctl –a –d cciss,0 /dev/cciss/c0d0
/opt/3ware/9500/tw_cli show
cd /tmp
DD (ディスク ブロックの書き換え (DESTROY DATA)):
dd if=/dev/zero of=/dev/HD* bs=4M
HD*: sda, sdb…
燃焼(ストレステスト(データ破壊)):
/opt/systems/bin/vs-burnin --destructive --time=<hours> /tmp/burninlog.txt
Dmesg&kernerrors:
tail /var/log/kernerrors
dmesg |grep –i –E “”ata”|”fault”|”error”
私がやろうとしているのは、これらのコマンドを自動化することです。
スクリプトでホストにあるすべてのディスクを検証し、smartctl
ケースに適したコマンドを実行するようにします。破壊的なコマンドを
実行するかどうかを選択できるオプションのあるメニューのようなもので、実行を選択した場合は 、スクリプトがすべてのディスクをスキャンし、ホスト構成 (RAID コントローラーの有無) に従ってコマンドを実行します。 破壊的なコマンドを実行することを選択した場合は、スクリプトで、これを実行するディスク番号を入力するように求められます。smartctl
smartctl
編集2:
次のスクリプトで問題を解決しました。
#!/bin/bash
# Troubleshoot.sh
# A more elaborate version of Troubleshoot.sh.
SUCCESS=0
E_DB=99 # Error code for missing entry.
declare -A address
# -A option declares associative array.
if [ -f Troubleshoot.log ]
then
rm Troubleshoot.log
fi
if [ -f HDs.log ]
then
rm HDs.log
fi
smartctl --scan | awk '{print $1}' >> HDs.log
lspci | grep -i raid >> HDs.log
getArray ()
{
i=0
while read line # Read a line
do
array[i]=$line # Put it into the array
i=$(($i + 1))
done < $1
}
getArray "HDs.log"
for e in "${array[@]}"
do
if [[ $e =~ /dev/sd* || $e =~ /dev/hd* ]]
then
echo "smartctl -i -A $e" >> Troubleshoot.log
smartctl -i -A $e >> Troubleshoot.log # Run smartctl into all disks that the host have
fi
done
exit $? # In this case, exit code = 99, since that is function return.
この解決策が正しいか、最善かはわかりませんが、私にとってはうまくいきました。
ご協力に感謝します。
答え1
私がやろうとしているのは、これらのコマンドを自動化することです。
これはすでに存在しており、 に現れますsmartd
。
通常、希望する動作を設定するには、
/etc/smartd.conf
例:
# DEVICESCAN: tells smartd to scan for all ATA and SCSI devices
# Alternative setting to report more useful raw temperature in syslog.
DEVICESCAN -I 194 -I 231 -I 9
代わりに、ディスクを明示的に次のように配置することもできます。
/dev/sdc -d 3ware,0 -a -s L/../../7/01
smartd
エラーを発見した場合は、メールが届きます:
/dev/hdc -a -I 194 -W 4,45,55 -R 5 -m [email protected]
他にも多くのオプションとスイッチがありますので、 のマニュアルページを読む必要がありますsmartd.conf
。
答え2
@xeruf。私も自分の仕事で時々この質問に遭遇し、何度もやり直さなければならなくなりました。私や他の人が基本的なスマート出力コマンドを見つけられるように、これを実行します。
for i in $(ls /dev/sd?); do
echo "$i"
sudo smartctl -a $i
done