Execute smartctl em todos os discos de um servidor

Execute smartctl em todos os discos de um servidor

Minha dúvida é bem simples, quero rodar o comando smartctl -i -Aem todos os discos que o servidor possui. Acho que tenho muitos servidores com números diferentes de discos e controladores RAID, então preciso verificar todos os drivers para um diagnóstico. Estou pensando em rodar smartctl --scan | awk '{print $1}' >> test.log, então se eu abrir o test.log terei todas as informações das unidades nele.
Depois disso preciso rodar algumas construções if ou fazer para escanear com smartctltodos os drivers. Não sei se essa é a melhor forma de fazer isso, pois preciso identificar também o Controlador RAID. Estou indo na direção certa?

Editar:

Estou acostumado a usar estes comandos para solucionar problemas:

Sem 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 e Megaraid:

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

DD (Reescrever bloco de disco (DESTROY DATA)):

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

Queima (teste de estresse (DESTROY DATA)):

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

Dmesg&kernerrrors:

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

Então, o que estou tentando fazer é automatizar esses comandos.
Quero que o script verifique todos os discos que o host possui e execute o smartctlcomando apropriado para o caso.
Algo como um menu com algumas opções que me permitem escolher se quero executar um smartctlou algum comando destrutivo, se eu optar por executar smartctl
o script irá verificar todos os discos e executar o comando de acordo com a configuração do host (com/sem controlador RAID),
e se eu optar por executar um comando destrutivo, o script me pedirá para colocar o número do disco que desejo fazer isso.


Editar 2:

Resolvi meu problema com o seguinte 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.

Não sei se esta solução é a certa ou a melhor, mas funciona para mim!
Agradeço toda ajuda!!

Responder1

Então, o que estou tentando fazer é automatizar esses comandos.

Isso já existe e se manifesta em smartd.

Normalmente você precisa configurar o comportamento desejado em /etc/smartd.conf

Exemplo:

# 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, você pode colocar seus discos explicitamente como

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

Se smartddescobrir um erro, você receberá um e-mail:

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

Há também uma série de outras opções e opções, você precisará ler a página de manual do smartd.conf.

Responder2

@xeruf. De vez em quando me deparo com essa dúvida em meu próprio trabalho e continuo tendo que refazer meu trabalho haha. Só para que eu e outras pessoas possamos encontrar um comando básico de saída inteligente, executo isto:

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

informação relacionada