Skript-SMART: Porovnání verzí

Z Milan Kerslager
Přejít na: navigace, hledání
(Založení článku)
 
(Používat /proc/partitions)
Řádka 1: Řádka 1:
Skript řeší '''automatické spouštění''' [http://en.wikipedia.org/wiki/Self-Monitoring%2C_Analysis%2C_and_Reporting_Technology S.M.A.R.T.] testů. Pokud je spuštěn s parametrem <CODE>short</CODE>, je spuštěna zkrácená verze selftestu (cca 2 minuty &ndash; na disku se zkontrolují čtením náhodné sektory). Bez parametru jsou na všech nalezených discích spuštěny dlouhé testy (desítky minut až několik hodin podle velikosti &ndash; disk se zkontroluje čtením úplně celý).
+
Skript řeší '''automatické spouštění''' [http://en.wikipedia.org/wiki/Self-Monitoring%2C_Analysis%2C_and_Reporting_Technology S.M.A.R.T.] testů na RHEL3 a RHEL4, kde nástroj <CODE>smartctl</CODE> ani démon <CODE>smard</CODE> neumí autodetekovat SATA disky. Pokud je spuštěn s parametrem <CODE>short</CODE>, je spuštěna zkrácená verze selftestu (cca 2 minuty &ndash; na disku se zkontrolují čtením náhodné sektory). Bez parametru jsou na všech nalezených discích spuštěny dlouhé testy (desítky minut až několik hodin podle velikosti &ndash; disk se zkontroluje čtením úplně celý).
  
      1 #!/bin/bash
+
#!/bin/bash
      2
+
      3 PATH=/sbin:/usr/sbin:/bin:/usr/bin
+
PATH=/sbin:/usr/sbin:/bin:/usr/bin
      4 TEMP=$(/bin/mktemp /tmp/disktest-smart.XXXXXX)
+
TEMP=$(/bin/mktemp /tmp/disktest-smart.XXXXXX)
      5 case $1 in
+
export LC_ALL=C
      6        short)
+
case $1 in
      7            TEST=short
+
        short)
      8            ;;
+
            TEST=short
      9        *) TEST=long
+
            ;;
    10            ;;
+
        *) TEST=long
    11 esac
+
            ;;
    12 for DRIVE in /dev/hd[a-z] /dev/sd[a-z]; do
+
esac
    13  BASEDRIVE=$(basename $DRIVE)
+
    14  # if it is IDE disk and does not honor SMART, don't ask via smartctl
+
function smartcheck() {
    15  if ! [ -d /proc/ide/$BASEDRIVE -a ! -f /proc/ide/$BASEDRIVE/smart_values ]; then
+
  # is the disk SMART capable?
    16    # does the disk SMART capable?
+
  smartctl $2 -q silent $1
    17    smartctl -q silent $DRIVE
+
  RET=$?
    18    RET=$?
+
  if [ $(($RET & 2)) -eq 0 -a $(($RET & 4)) -eq 0 ]; then
    19    if [ $(($RET & 2)) -eq 0 -a $(($RET & 4)) -eq 0 ]; then
+
     # do we have to enable S.M.A.R.T?
     20      # do we have to enable S.M.A.R.T?
+
     if smartctl $2 -c $1 | grep -q '^SMART Disabled'; then
     21      if smartctl -c $DRIVE | grep -q 'SMART Disabled'; then
+
      smartctl $2 -s on $1
    22        smartctl -s on $DRIVE
+
     fi
     23      fi
+
     # does disk have 'No Self-test supported'
     24      # does disk have 'No Self-test supported'
+
     if ! smartctl $2 -c $1 | grep -q 'No Self-test supported'; then
     25      if ! smartctl -c $DRIVE | grep -q 'No Self-test supported'; then
+
      if smartctl $2 -c $1 | grep -q 'Self-test routine in progress'; then
    26        if smartctl -c $DRIVE | grep -q 'Self-test routine in progress'; then
+
        # send to /dev/null to keep it quiet or send to $TEMP to be informed by email
    27          echo "Self-test routine already in progress for disc $DRIVE, skipping..." > /dev/null
+
        echo "Self-test routine already in progress for disc $1, skipping..." > /dev/null
    28        else
+
      else
    29          echo "smartctl -t $TEST $DRIVE" > $TEMP
+
        echo "smartctl $2 -t $TEST $1" > $TEMP
    30          if ! smartctl -t $TEST $DRIVE >> $TEMP 2>&1; then
+
        if ! smartctl $2 -t $TEST $1 >> $TEMP 2>&1; then
    31            mail -s "S.M.A.R.T. failed on $DRIVE" root < $TEMP > /dev/null
+
          mail -s "S.M.A.R.T. failed on $1" root < $TEMP > /dev/null
    32          fi
+
        fi
    33        fi
+
      fi
     34      fi
+
     fi
     35      sleep 5
+
     sleep 5
     36    fi
+
  fi
     37  fi
+
}
    38 done
+
    39 rm -f $TEMP
+
for DEVICE in $(awk '/hd[a-z]$/ {print $4}' /proc/partitions); do
 +
  # if it is IDE disk and does not honor SMART, don't ask via smartctl
 +
  if ! [ -d /proc/ide/$DEVICE -a ! -f /proc/ide/$DEVICE/smart_values ]; then
 +
     smartcheck /dev/$DEVICE
 +
  fi
 +
done
 +
for DEVICE in $(awk '/sd[a-z]$/ {print $4}' /proc/partitions); do
 +
  if smartctl -a /dev/$DEVICE | grep -q 'SATA devices are not supported via the SCSI device type';  then
 +
    PARAM="-d ata"
 +
  else
 +
     PARAM=""
 +
  fi
 +
  smartcheck /dev/$DEVICE "$PARAM"
 +
done
 +
rm -f $TEMP
  
Skript je vhodné umístit do adresáře <CODE>/etc/cron.daily/</CODE>, aby byl spuštěn jednou denně. DO souboru <CODE>/etc/cron.d/disktest-smart-short</CODE> pak umístíme jeden řádek. který zajistí spouštění krátkých testů každých 6 hodin:
+
Skript je vhodné umístit do adresáře <CODE>/etc/cron.daily/</CODE>, aby byl spuštěn jednou denně. Do souboru <CODE>/etc/cron.d/disktest-smart-short</CODE> pak umístíme jeden řádek. který zajistí spouštění krátkých testů každých 6 hodin:
  
 
  0 */6 * * * root exec /etc/cron.daily/disktest-smart short
 
  0 */6 * * * root exec /etc/cron.daily/disktest-smart short
  
V systému by měl běžet démon <CODE>smatrd</CODE> v monitorovacím režimu, aby v případě selhání selftestu byl automaticky poslán mail správci počítače.
+
V systému by měl běžet démon <CODE>smatrd</CODE> v monitorovacím režimu, aby v případě selhání selftestu byl automaticky poslán mail správci počítače. V souboru /etc/smartd.conf by tedy bylo:
 +
 
 +
# IDE disk
 +
/dev/hda -a -m root -M daily
 +
# SATA disk
 +
/dev/sda -a -m root -M daily -d ata
 +
# SCSI disk
 +
/dev/sdb -a -m root -M daily
 +
 
 +
Povolíme spouštění démona <CODE>smatrd</CODE> při startu a spustíme ho ručně:
 +
 
 +
chkconfig smartd on
 +
/etc/init.d/smartd start
 +
 
 +
V souboru <CODE>/var/log/messages</CODE> zkontrolujeme, jestli démon skutečně všechny disky monitoruje. Zkusíme ručně spustit skript s parametrem ''short'' a ujistíme se, že S.M.A.R.T. test byl spuštěn na všech discích:
 +
 
 +
  bash -x /etc/cron.daily/disktest-smart short
 +
 
 +
Po asi 1 až 5 minutách si ověříme ve výpisu stavu disku, že test proběhl bez závad:
 +
 
 +
  smartctl -l selftest /dev/hda

Verze z 12. 10. 2007, 20:08

Skript řeší automatické spouštění S.M.A.R.T. testů na RHEL3 a RHEL4, kde nástroj smartctl ani démon smard neumí autodetekovat SATA disky. Pokud je spuštěn s parametrem short, je spuštěna zkrácená verze selftestu (cca 2 minuty – na disku se zkontrolují čtením náhodné sektory). Bez parametru jsou na všech nalezených discích spuštěny dlouhé testy (desítky minut až několik hodin podle velikosti – disk se zkontroluje čtením úplně celý).

#!/bin/bash

PATH=/sbin:/usr/sbin:/bin:/usr/bin
TEMP=$(/bin/mktemp /tmp/disktest-smart.XXXXXX)
export LC_ALL=C
case $1 in
        short)
           TEST=short
           ;;
        *) TEST=long
           ;;
esac

function smartcheck() {
  # is the disk SMART capable?
  smartctl $2 -q silent $1
  RET=$?
  if [ $(($RET & 2)) -eq 0 -a $(($RET & 4)) -eq 0 ]; then
    # do we have to enable S.M.A.R.T?
    if smartctl $2 -c $1 | grep -q '^SMART Disabled'; then
      smartctl $2 -s on $1
    fi
    # does disk have 'No Self-test supported'
    if ! smartctl $2 -c $1 | grep -q 'No Self-test supported'; then
      if smartctl $2 -c $1 | grep -q 'Self-test routine in progress'; then
        # send to /dev/null to keep it quiet or send to $TEMP to be informed by email
        echo "Self-test routine already in progress for disc $1, skipping..." > /dev/null
      else
        echo "smartctl $2 -t $TEST $1" > $TEMP
        if ! smartctl $2 -t $TEST $1 >> $TEMP 2>&1; then
          mail -s "S.M.A.R.T. failed on $1" root < $TEMP > /dev/null
        fi
      fi
    fi
    sleep 5
  fi
}

for DEVICE in $(awk '/hd[a-z]$/ {print $4}' /proc/partitions); do
  # if it is IDE disk and does not honor SMART, don't ask via smartctl
  if ! [ -d /proc/ide/$DEVICE -a ! -f /proc/ide/$DEVICE/smart_values ]; then
    smartcheck /dev/$DEVICE
  fi
done
for DEVICE in $(awk '/sd[a-z]$/ {print $4}' /proc/partitions); do
  if smartctl -a /dev/$DEVICE | grep -q 'SATA devices are not supported via the SCSI device type';  then
    PARAM="-d ata"
  else
    PARAM=""
  fi
  smartcheck /dev/$DEVICE "$PARAM"
done
rm -f $TEMP

Skript je vhodné umístit do adresáře /etc/cron.daily/, aby byl spuštěn jednou denně. Do souboru /etc/cron.d/disktest-smart-short pak umístíme jeden řádek. který zajistí spouštění krátkých testů každých 6 hodin:

0 */6 * * * root exec /etc/cron.daily/disktest-smart short

V systému by měl běžet démon smatrd v monitorovacím režimu, aby v případě selhání selftestu byl automaticky poslán mail správci počítače. V souboru /etc/smartd.conf by tedy bylo:

# IDE disk
/dev/hda -a -m root -M daily
# SATA disk
/dev/sda -a -m root -M daily -d ata
# SCSI disk
/dev/sdb -a -m root -M daily

Povolíme spouštění démona smatrd při startu a spustíme ho ručně:

chkconfig smartd on
/etc/init.d/smartd start

V souboru /var/log/messages zkontrolujeme, jestli démon skutečně všechny disky monitoruje. Zkusíme ručně spustit skript s parametrem short a ujistíme se, že S.M.A.R.T. test byl spuštěn na všech discích:

 bash -x /etc/cron.daily/disktest-smart short

Po asi 1 až 5 minutách si ověříme ve výpisu stavu disku, že test proběhl bez závad:

 smartctl -l selftest /dev/hda