web-dev-qa-db-ja.com

サーバーのすべてのディスクでsmartctlを実行します

私の質問は非常に単純です。サーバーにあるすべてのディスクでコマンドsmartctl -i -Aを実行したいと思います。ディスクとRAIDコントローラーの数が異なるサーバーが多すぎると考えて、診断のためにすべてのドライバーをスキャンする必要があります。 smartctl --scan | awk '{print $1}' >> test.logを実行することを考えているので、test.logを開くと、すべてのドライブ情報が含まれています。
この後、smartctlすべてのドライバーでスキャンするためにいくつかのifまたは構築を実行する必要があります。 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コマンドを実行します。
smartctlを実行するかどうかを選択できるオプションのあるメニューや、smartctlを実行するかどうかを指定する破壊的なコマンドのようなもの
スクリプトはすべてのディスクをスキャンし、ホスト構成(RAIDコントローラーあり/なし)に従ってコマンドを実行します。
そして、破壊的なコマンドを実行することを選択した場合、スクリプトは、これを実行したいディスク番号を入力するように要求します。


編集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.

この解決策が正しいか最良かはわかりませんが、私には役立ちます!
感謝します!!

3
ZeroNegative

だから私がやろうとしているのは、これらのコマンドを自動化することです。

これはすでに存在し、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のマンページを読む必要があります。

1
user55518