I have built for myself a simple Media Center, based on Zotac ZBOX ID41 Plus, XBMC-Live, Transmission, Flirc and other useful stuff. The idea is having a low-energy consumption machine that I control with a remote. And it has to be always on.
One thing I was concerned about is how to deal with my external HD connected to it: I’m of course expecting those to eventually fail if they are always spinning.
Well, a bit of scripting and cron can go a long way. Here is my solution.
Step 1: dependencies
Step 2: scripting
Put a script like this somewhere in your system. I have it in my
# !/bin/sh # Only ROOT can run this if [ "$(id -u)" != "0" ]; then echo “This script must be run as root” 1>&2 exit 1 fi STATE_FILENAME=state_$1.spindown PREV_STATE_FILENAME=prev_state_$1.spindown # Get new state from diskstats NEWstate=$(cat /proc/diskstats | grep $1) echo $NEWstate > "$STATE_FILENAME" # compare md5 sums md5new=$(md5sum $STATE_FILENAME | sed 's/ .*//') md5old=$(md5sum $PREV_STATE_FILENAME | sed 's/ .*//') # if no changes, power down if [ "$md5new" = "$md5old" ]; then sdparm --flexible --command=stop /dev/$1 &>/dev/null fi # Write current state to file echo $NEWstate > "$PREV_STATE_FILENAME"
A very basic and simple one, isn’t it?
What it does is just probe
/proc/diskstats virtual file to get info about the recent activity of a disk. If it has not changed in the last 30 minutes, than it’s time to use
sdparm to send a stop command
--command=stop. That’s it.
Step 3: Cron-it-up!
Add the following lines to your
*/30 * * * * root sh /home/xbmc/bin/spindown/spindown.sh sda */30 * * * * root sh /home/xbmc/bin/spindown/spindown.sh sdb */30 * * * * root sh /home/xbmc/bin/spindown/spindown.sh sdc */30 * * * * root sh /home/xbmc/bin/spindown/spindown.sh sdd */30 * * * * root sh /home/xbmc/bin/spindown/spindown.sh sde
The above lines execute the script against
That’s it. I have been using this method for almost 2 years not, and thought it might be helpful to others.