
Mi pregunta es bastante simple, quiero ejecutar el comando smartctl -i -A
en 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 smartctl
todos 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 smartctl
comando apropiado para el caso.
Algo así como un menú con algunas opciones que me permiten elegir si quiero ejecutar un smartctl
comando 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 smartd
descubre 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