Monitor Synology disk temperature from SNMP
595 words, 3 minutes
I’m always looking at how to get informations from my I.T. systems ; although it often ends they do nothing…
Here’s a trick to monitor the disks temperature of a Synology NAS (DS409slim in my case).
Enable monitoring on the Synology
First of all, we’ll need the smartmontools
. If you don’t already have it,
install it using ipkg
:
# ipkg install smartmontools
# which smartctl
/usr/syno/bin/smartctl
Once done, let’s try to find the devices:
# smartctl --scan
/dev/hda -d ata # /dev/hda, ATA device
/dev/hdb -d ata # /dev/hdb, ATA device
/dev/hdc -d ata # /dev/hdc, ATA device
/dev/hdd -d ata # /dev/hdd, ATA device
(...)
/dev/sda -d scsi # /dev/sda, SCSI device
/dev/sdb -d scsi # /dev/sdb, SCSI device
/dev/sdc -d scsi # /dev/sdc, SCSI device
/dev/sdd -d scsi # /dev/sdd, SCSI device
(...)
I don’t know why it lists both ATA and SCSI disks… Maybe because I have SATA disks… Anyway, let’s see if the disk answers to information requests:
# smartctl -a /dev/hda -d ata | egrep "Model|Temp"
Model Family: Toshiba 2.5" HDD MK..59GSM (Adv. Format)
Device Model: TOSHIBA MK1059GSM
194 Temperature_Celsius 0x0022 100 100 000 Old_age Always - 32 (Min/Max 20/46)
So we can get the information from every of the disks installed.
Now, let’s extend the SNMP daemon so that it prints disks temperature when polled:
# vi /usr/syno/etc/snmpd.conf
(...)
#extend disktemp /opt/bin/bash -c "/opt/bin/find /dev/sd[a-z] -exec /usr/syno/bin/smartctl -iA -data {} \\; | /opt/bin/awk ' /Serial Number:/ { printf \"%s: \", \$NF }; /Temperature_Celsius/ { print \$10 }; ' | /opt/bin/sed -e \"s/[-_]//g\""
# /usr/syno/etc/rc.d/S08snmpd.sh restart
From a remote machine, we can now get the results:
# snmpget -v 2c -c public syno 'NET-SNMP-EXTEND-MIB::nsExtendResult."disktemp"'
NET-SNMP-EXTEND-MIB::nsExtendResult."disktemp" = INTEGER: 0
# snmpwalk -v 2c -c public syno 'NET-SNMP-EXTEND-MIB::nsExtendOutLine."disktemp"'
NET-SNMP-EXTEND-MIB::nsExtendOutLine."disktemp".1 = STRING: Y0DHF8LPS: 31
NET-SNMP-EXTEND-MIB::nsExtendOutLine."disktemp".2 = STRING: Y0DHF8KTS: 30
NET-SNMP-EXTEND-MIB::nsExtendOutLine."disktemp".3 = STRING: 90L3P2GFT: 31
NET-SNMP-EXTEND-MIB::nsExtendOutLine."disktemp".4 = STRING: WDWXN209NC0986: 35
That’s it! The information can now be grabbed, stored and graphed from you preferred monitoring tools.
What you see is what you get
Here’re two examples of what I achieved using both “Munin” and “Xymon”. It only requires writing the scripts that will poll the snmp daemon and put the values into the correct format.
You can probably do the same with Nagios, Cacti, … but I don’t use those.
Improving response time
If you’ve had a detailed look at the graphs, you may have noticed that there are holes in the graphs. This is (AFAIK) because the snmpd of the syno answers in between 1.7 and 3 seconds. When it takes too long to answer, Munin and Xymon seem to not write the data in their RRDs.
Therefor, I have modified the way the data are published. From the synology:
# touch /tmp/disktemp.log
# cat /usr/syno/etc/snmpd.conf
(...)
extend disktemp /opt/bin/cat /tmp/disktemp.log
# /usr/syno/etc/rc.d/S08snmpd.sh restart
# cat /etc/crontab
(...)
*/5 * * * * root ( /opt/bin/find /dev/sd[a-d] -exec /usr/syno/bin/smartctl -iA -d ata {} \; | /opt/bin/awk ' /Serial Number:/ { printf "%s: ", $NF }; /Temperature_Celsius/ { print $10 }; ' | /opt/bin/sed -e "s/[-_]//g" ) > /tmp/disktemp.log
# /usr/syno/etc/rc.d/S04crond.sh stop
stop crond
# /usr/syno/etc/rc.d/S04crond.sh start
Starting crond...
Here’s the time response comparison:
snmpd only snmpd and crontab
real 0m2.387s 0m0.012s
user 0m0.008s 0m0.008s
sys 0m0.004s 0m0.004s
So far, I get no holes anymore. If the poll was to be done faster, one may change the crontab to generate the file oftener.
Source
Initial idea was stolen from there: Monitoring de la température des “disk” de Nexenta en SNMP
Unfortunately, my virtual Nexenta with Raw Device Mapping can get the SMART informations :-/