Skript-SMART: Porovnání verzí
(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 – 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ý). | + | 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 – 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 <CODE>/etc/cron.daily/</CODE>, aby byl spuštěn jednou denně. | + | 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