Führen Sie smartctl auf allen Festplatten eines Servers aus

Führen Sie smartctl auf allen Festplatten eines Servers aus

Meine Frage ist ganz einfach: Ich möchte den Befehl smartctl -i -Aauf allen Festplatten des Servers ausführen. Ich glaube, ich habe zu viele Server mit unterschiedlichen Festplattenzahlen und RAID-Controllern, deshalb muss ich alle Treiber für eine Diagnose scannen. Ich denke daran, auszuführen smartctl --scan | awk '{print $1}' >> test.log, damit ich alle Laufwerksinformationen darin habe, wenn ich test.log öffne.
Danach muss ich einige if- oder do-Konstruktionen ausführen, um mit smartctlallen Treibern zu scannen. Ich weiß nicht, ob das der beste Weg ist, da ich auch den RAID-Controller identifizieren muss. Gehe ich in die richtige Richtung?

Bearbeiten:

Ich verwende zur Fehlerbehebung normalerweise diese Befehle:

Ohne RAID-Controller

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-Controller

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 Controller

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- und Megaraid-Controller:

smartctl –a –d cciss,0 /dev/cciss/c0d0
/opt/3ware/9500/tw_cli show
cd /tmp

DD (Datenträgerblock neu schreiben (DATEN ZERSTÖREN)):

dd if=/dev/zero of=/dev/HD* bs=4M
HD*: sda, sdb…

Brennen (Stresstest (DESTROY DATA)):

/opt/systems/bin/vs-burnin --destructive --time=<hours> /tmp/burninlog.txt

Dmesg- und Kernelfehler:

tail /var/log/kernerrors
dmesg |grep –i –E “”ata”|”fault”|”error”

Ich versuche also, diese Befehle zu automatisieren.
Ich möchte, dass das Skript alle Festplatten des Hosts überprüft und den entsprechenden smartctlBefehl für den jeweiligen Fall ausführt.
So etwas wie ein Menü mit einigen Optionen, in denen ich wählen kann, ob ich einen smartctloder einen destruktiven Befehl ausführen möchte. Wenn ich die Ausführung wähle, smartctl
scannt das Skript alle Festplatten und führt den Befehl entsprechend der Hostkonfiguration (mit/ohne RAID-Controller) aus.
Wenn ich die Ausführung eines destruktiven Befehls wähle, fragt mich das Skript nach der Festplattennummer, mit der ich dies tun möchte.


Bearbeitung 2:

Ich habe mein Problem mit dem folgenden Skript gelöst:

#!/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.

Ich weiß nicht, ob diese Lösung die richtige oder beste ist, aber für mich funktioniert sie!
Ich bin für jede Hilfe dankbar!!

Antwort1

Ich versuche also, diese Befehle zu automatisieren.

Dies existiert bereits und manifestiert sich in smartd.

Normalerweise müssen Sie das gewünschte Verhalten konfigurieren in /etc/smartd.conf

Beispiel:

# 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

Alternativ können Sie Ihre Datenträger auch explizit angeben wie

/dev/sdc -d 3ware,0 -a -s L/../../7/01

Sollten smartdSie einen Fehler entdecken, erhalten Sie eine E-Mail:

/dev/hdc -a -I 194 -W 4,45,55 -R 5 -m [email protected]

Es gibt auch eine Reihe anderer Optionen und Schalter. Lesen Sie dazu die Manpage smartd.conf.

Antwort2

@xeruf. Ich stoße bei meiner eigenen Arbeit von Zeit zu Zeit auf diese Frage und muss meine Arbeit immer wieder neu machen, lol. Damit ich und andere Leute einen grundlegenden Smart-Output-Befehl finden können, führe ich Folgendes aus:

for i in $(ls /dev/sd?); do
    echo "$i"
    sudo smartctl -a $i
done

verwandte Informationen