Ejecute smartctl en todos los discos de un servidor

Ejecute smartctl en todos los discos de un servidor

Mi pregunta es bastante simple, quiero ejecutar el comando smartctl -i -Aen todos los discos que tiene el servidor. Creo que tengo demasiado servidor con diferente número de discos y controladores RAID, entonces necesito escanear todos los controladores para obtener un diagnóstico. Estoy pensando en ejecutar smartctl --scan | awk '{print $1}' >> test.log, así que si abro test.log tendré toda la información de las unidades.
Después de esto, necesito ejecutar algunas construcciones if o hacer para escanear con smartctltodos los controladores. No sé si esta es la mejor manera de hacerlo, ya que también necesito identificar el controlador RAID. ¿Voy en la dirección correcta?

Editar:

Estoy acostumbrado a usar estos comandos para solucionar problemas:

Sin controlador 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

Controlador 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

Controlador 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

Controlador SmartArray y Megaraid:

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

DD (Reescribir bloque de disco (DESTRUIR DATOS)):

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

Ardor (Prueba de estrés (DESTRUIR DATOS)):

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

Dmesg&kernerrors:

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

Entonces, lo que intento hacer es automatizar estos comandos.
Quiero que el script verifique todos los discos que tiene el host y ejecute el smartctlcomando apropiado para el caso.
Algo así como un menú con algunas opciones que me permiten elegir si quiero ejecutar un smartctlcomando o algún comando destructivo, si elijo ejecutar smartctl
el script escaneará todos los discos y ejecutará el comando de acuerdo con la configuración del host (con/sin controlador RAID),
y si elijo ejecutar un comando destructivo, el script me pedirá que ponga el número de disco en el que quiero hacer esto.


Edición 2:

Resolví mi problema con el siguiente script:

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

No sé si esta solución es la correcta o la mejor, ¡pero a mí me funciona!
¡¡Agradezco toda la ayuda!!

Respuesta1

Entonces, lo que intento hacer es automatizar estos comandos.

Esto ya existe y se manifiesta en smartd.

Normalmente necesita configurar el comportamiento deseado en /etc/smartd.conf

Ejemplo:

# 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

Alternativamente, puedes poner tus discos explícitamente como

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

Si smartddescubre un error, recibirá un correo electrónico:

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

También hay otras opciones y modificadores; deberá leer la página de manual de smartd.conf.

Respuesta2

@xeruf. Me encuentro con esta pregunta en mi propio trabajo de vez en cuando y sigo teniendo que rehacer mi trabajo jajaja. Para que otras personas y yo podamos encontrar un comando de salida inteligente básico, ejecuto esto:

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

información relacionada