Middels de SMART techniek is het mogelijk de gezondheid van je schijf/schijven in je Syno te checken. Hiertoe dien je middels IPKG smartmontools te installeren. Als dat geïnstalleerd is kun je via smartctl -a /dev/sda gegevens over je schijf bekijken. Als dat niet wil kun je het nog eens proberen via smartctl -d marvell -a /dev/sda. Als dit ook geen resultaat geeft kun je via smartctl -h hulp opvragen... Bij mij werkte uiteindelijk smartctl -a /dev/hda...
Bij dit alles ga ik er van uit dat je schijf wél SMART-capabel is (maar dat zijn de meeste tegenwoordig).
Toen de Syno's nog geen eigen ingebouwde temperatuur-uitlezing kende hebben handige jongens ooit het shell-script TPS uitgedacht voor de bewaking van de temperatuur. Het mooie daarbij is dat de temperatuur ook in een grafiek getoond wordt. Omdat alles altijd mooier kan heeft men in op duitse forum e.e.a. een tikje aangepast. Zo worden de grafieken middels Google-Charts getoond en wordt er niet langer gebruik gemaakt van rrdtools.
Hoe krijg je dit als 3rd party app aan de praat?
De werking berust op een aantal bestanden op een aantal plaatsen, te weten:
1) een data-verzamelingsscript
/usr/sbin/diskstatsd dat middels de CronTab wordt aangeroepen
[ "$1" == "" ] || exit 1
NOW=$(/opt/sbin/smartctl -a /dev/hda | awk '/^194/{t1=$10}/^ 9/{t2=$10}/^ 4/{t3=$10}/^ 12/{t4=$10}/^ 5/{t5=$10}END{printf("%d %d %d %d %dn",t1,t2,t3,t4,t5)}')
date "+%m %d %H %M $NOW" >>/var/log/hdastats
NOW=$(/opt/sbin/smartctl -a /dev/hdb | awk '/^194/{t1=$10}/^ 9/{t2=$10}/^ 4/{t3=$10}/^ 12/{t4=$10}/^ 5/{t5=$10}END{printf("%d %d %d %d %dn",t1,t2,t3,t4,t5)}')
date "+%m %d %H %M $NOW" >>/var/log/hdbstats
NOW=$(/opt/sbin/smartctl -a /dev/hdc | awk '/^194/{t1=$10}/^ 9/{t2=$10}/^ 4/{t3=$10}/^ 12/{t4=$10}/^ 5/{t5=$10}END{printf("%d %d %d %d %dn",t1,t2,t3,t4,t5)}')
date "+%m %d %H %M $NOW" >>/var/log/hdcstats
NOW=$(/opt/sbin/smartctl -a /dev/hdd | awk '/^194/{t1=$10}/^ 9/{t2=$10}/^ 4/{t3=$10}/^ 12/{t4=$10}/^ 5/{t5=$10}END{printf("%d %d %d %d %dn",t1,t2,t3,t4,t5)}')
date "+%m %d %H %M $NOW" >>/var/log/hddstats
Zoals je ziet wordt hier vier keer het programma smartctl aangeroepen (ik heb een CubeStation met vier schijven er in). Als je minder (of meer) schijven hebt dien je dit script aan te passen naar het voor jouw Syno geldende aantal schijven...
Wat dit script doet is per schijf de gegevens die smartctl oplepelt zo bewerken dat de datum, de gemiddelde temperatuur, de minimale en maximale temperatuur, de lifetime (aantal draaiuren), de hibernation, de power on/off's en de reallocations gelogd worden.
De entry in de CronTab ziet er zo uit:
0,15,30,45,59 * * * * root /bin/sh /usr/sbin/diskstatsd
Deze via diskstatsd uitgelezen gegevens worden per schijf gelogd in
/var/log/hd?stats (? staat voor a, b enz.)
2) een uitlees-script
/usr/sbin/diskstats dat de in /var/log/hd?stats opgeslagen gegevens uit kan lezen:
f=${1:-hda}
</var/log/${f}stats awk "/^$GET/{v1+=$5;c++;v2=$6;v5=$9;
if(v1min==0) v1min=$5; else if(v1min>$5) v1min=$5;
if(v1max==0) v1max=$5; else if(v1max<$5) v1max=$5;
if(v3==0||$7<v3)v3=$7;else v3delta+=$7-v3;
if(v4==0||$8<v4)v4=$8;else v4delta+=$8-v4;
}
{v3=$7;v4=$8;}
END{if(v1>0)printf("%03.1f°C %03.1f°C %03.1f°C %5d h %5d cycles %5d cycles %4d sectorsn",
v1/c,v1min,v1max,v2,v3delta-v4delta,v4delta,v5);else printf("n")}"
3) een .cgi bestand
/usr/syno/synoman/phpsrc/diskhealth/diskhealth.cgi NB. Bijgewerkt met de beveiliging van Merty. Zie
http://synology.nl/forum/viewtopic.php?f=83&t=2274.
#!/bin/ash
# if not admin or no user at all...no authentication...so, bye-bye
user=$(/usr/syno/synoman/webman/modules/authenticate.cgi);
if [ "$user" != "admin" ] ;
then
echo "Content-type: text/html"
echo ""
echo "<HTML><HEAD><TITLE>Login Required</TITLE></HEAD><BODY>Please login as admin first, before using this webpage</BODY></HTML>"
exit
fi
export GET
cat <<EOT
Content-type: text/html
<html><head><title>System-Info</title></head><body style="width:750px">
<style>body{font:11px Arial;background-color:#ddf;}</style>
$(/usr/sbin/diskstatsd)
<div style="font:11px monospace;position:absolute;top:11px;left:27px;z-index:5">
<span style="color:#333333">▆
</span>/dev/hda actual Temperature $(</var/log/hdastats tail -1|awk '{print $5}')°C
<span style="color:#666666">▆</span>
/dev/hdb actual Temperature $(</var/log/hdbstats tail -1|awk '{print $5}')°C</br>
<span style="color:#666666">▆</span>
/dev/hdc actual Temperature $(</var/log/hdcstats tail -1|awk '{print $5}')°C
<span style="color:#666666">▆</span>
/dev/hdd actual Temperature $(</var/log/hddstats tail -1|awk '{print $5}')°C</div>
<div style="padding-top:142px;padding-left:1px;line-height:10px"><pre>
Aver. Mini Maxi Lifetime Hibernate Power on/off Reallocated
hda $(/usr/sbin/diskstats hda|awk '{printf("%s",$1)}';/opt/sbin/smartctl --all /dev/hda | awk '/^194/{t1=$10}/^190/{t6=substr($13,1,2),t7=substr($13,4,2)}
/^ 9/{t2=$10}/^ 4/{t3=$10}/^ 12/{t4=$10}/^ 5/{t5=$10}
END{printf(" %2d.0°C %2d.0°C %7d h %5d cycles %6d cycles %4d sectorsn",t6,t7,t2,t3-t4,t4,t5)}')
hdb $(/usr/sbin/diskstats hdb|awk '{printf("%s",$1)}';/opt/sbin/smartctl --all /dev/hdb | awk '/^194/{t1=$10}/^190/{t6=substr($13,1,2),t7=substr($13,4,2)}
/^ 9/{t2=$10}/^ 4/{t3=$10}/^ 12/{t4=$10}/^ 5/{t5=$10}
END{printf(" %2d.0°C %2d.0°C %7d h %5d cycles %6d cycles %4d sectorsn",t6,t7,t2,t3-t4,t4,t5)}')
hdc $(/usr/sbin/diskstats hdc|awk '{printf("%s",$1)}';/opt/sbin/smartctl --all /dev/hdc | awk '/^194/{t1=$10}/^190/{t6=substr($13,1,2),t7=substr($13,4,2)}
/^ 9/{t2=$10}/^ 4/{t3=$10}/^ 12/{t4=$10}/^ 5/{t5=$10}
END{printf(" %2d.0°C %2d.0°C %7d h %5d cycles %6d cycles %4d sectorsn",t6,t7,t2,t3-t4,t4,t5)}')
hdd $(/usr/sbin/diskstats hdd|awk '{printf("%s",$1)}';/opt/sbin/smartctl --all /dev/hdd | awk '/^194/{t1=$10}/^190/{t6=substr($13,1,2),t7=substr($13,4,2)}
/^ 9/{t2=$10}/^ 4/{t3=$10}/^ 12/{t4=$10}/^ 5/{t5=$10}
END{printf(" %2d.0°C %2d.0°C %7d h %5d cycles %6d cycles %4d sectorsn",t6,t7,t2,t3-t4,t4,t5)}')
EOT
T1="";
T2="";
T3="";
T4="";
L="";
G=`date "+%m %d "`;
for t in $(/opt/bin/seq 00 23);do
t=$(printf %02d $t);
GET=$G$t;
if [ "$L" == "" ] ;
then L=$t;
else L=$L'|'$t;
fi
T=$(/usr/sbin/diskstats hda);
if [ "$T" == "" ] ;
then S=0;
else S=`echo $T|sed 's/(..).(.).*/1.2/'`;
fi
if [ "$T1" == "" ] ;
then T1=$S;
else T1=$T1,$S;
fi
if [ "$T" != "" ] ;
then echo "$t: $T";
fi
T=$(/usr/sbin/diskstats hdb);
if [ "$T" == "" ] ;
then S=0;
else S=`echo $T|sed 's/(..).(.).*/1.2/'`;
fi
if [ "$T2" == "" ] ;
then T2=$S;
else T2=$T2,$S;
fi
if [ "$T" != "" ] ;
then echo " $T";
fi
T=$(/usr/sbin/diskstats hdc);
if [ "$T" == "" ] ;
then S=0;
else S=`echo $T|sed 's/(..).(.).*/1.2/'`;
fi
if [ "$T3" == "" ] ;
then T3=$S;
else T3=$T3,$S;
fi
if [ "$T" != "" ] ;
then echo " $T";
fi
T=$(/usr/sbin/diskstats hdd);
if [ "$T" == "" ] ;
then S=0;
else S=`echo $T|sed 's/(..).(.).*/1.2/'`;
fi
if [ "$T4" == "" ] ;
then T4=$S;
else T4=$T4,$S;
fi
if [ "$T" != "" ] ;
then echo " $T";
fi
done
cat <<EOT
</pre>
</div>
<img style="position:absolute;top:2px;margin-left:-2px" src="http://chart.apis.google.com/chart?cht=bvg&chds=20,60&&chbh=5,1,1&chf=c,lg,90,dd0000,1,ffff77,0|bg,s,efefef00&chg=4.16,25&chco=0000ff,4d89f9,c6d9fd,ffffff&chs=600x150&chxt=x,r&chxl=0:|$L|1:|20|30|40|50|60&chd=t:$T1|$T2|$T3|$T4">
EOT
for d in $(ls /dev/hd?); do
cat <<EOT
<hr><h3>$d</h3>
<pre>$(/opt/sbin/smartctl --all -iAH $d|sed '1,3d')</pre>
EOT
done
cat <<EOT
</body></html>
EOT
Ook hier zie je vier verschillende aanroepen naar in dit geval /usr/sbin/diskstats voor de vier schijven in mijn systeem (aanpassen dus als je meer of minder schijven hebt)
4) als laatste dien je een
/usr/syno/synoman/3rdparty/diskhealth/application.cfg te maken met als inhoud:
text = Disk Health
description = Monitor disk health and temperature
type = embedded
path = /phpsrc/diskhealth/diskhealth.cgi
En zoals gebruikelijk een plaatje er bij:
Opmerkingen:
De hibernate-cycles zijn de start/stop counts minus de power-on/off-counts, hetgeen zo ongeveer met het aantal hibernates overeenkomt.
In ieder geval zijn de start/stop cycli een belangrijke graadmeter voor de kwaliteit/houdbaarheid van je schijven (< 50.000). Daarnaast is de Reallocate teller een goede indicator voor de gezondheid van je schijf: Als deze waarde stijgt dan verliest de schijf aan 'zelfhelingskracht'; de reserve sectoren raken dan op.
De balken in de grafiek geven de gemiddelde uurwaarde van de temperatuur per schijf; de tekst in de grafiek toont de actuele waarde. De x-as van de grafiek geeft de uren; de y-as de temperatuur. Met kleuren, afmetingen e.d. valt te spelen zie daatoe
Google-ChartsOja, zoals ik al schreef is het script van duitse origine. Bij mij wilde het script niet foutloos lopen, dus heb ik het zodanig aangepast dat het voor mij wel werkt.
Ik heb overbodige code verwijderd die naar mijn idee niet nodig was, maar ben met dit script de werking over langere termijn (dagen) nog op correctheid in de berekeningen aan het testen.
Mochten er foutjes in zitten dan zal ik aanpassingen posten. Maar wellicht dat anderen ook hun bevindingen willen delen.
Wie het origineel na wil lezen, dat staat
hier.
Succes!
Wizjos