Introduction

hd-idle is a utility program for spinning-down external disks after a period of idle time. Since most external IDE disk enclosures don't support setting the IDE idle timer, a program like hd-idle is required to spin down idle disks automatically.

A word of caution: hard disks don't like spinning up too often. Laptop disks are more robust in this respect than desktop disks but if you set your disks to spin down after a few seconds you may damage the disk over time due to the stress the spin-up causes on the spindle motor and bearings. It seems that manufacturers recommend a minimum idle time of 3-5 minutes, the default in hd-idle is 10 minutes.

One more word of caution: hd-idle will spin down any disk accessible via the SCSI layer (USB, IEEE1394, ...) but it will not work with real SCSI disks because they don't spin up automatically. Thus it's not called scsi-idle and I don't recommend using it on a real SCSI system unless you have a kernel patch that automatically starts the SCSI disks after receiving a sense buffer indicating the disk has been stopped. Without such a patch, real SCSI disks won't start again and you can as well pull the plug.

You have been warned...

Rationale

I run Debian Etch on a small NAS device, the Linksys NSLU2, which uses external USB harddisks for storage. Everything works right out of the box thanks to the efforts of the NSLU2 Linux Project and Martin Michlmayr -- except spinning down the external USB harddisk. Since the box is on 24/7, effectively replacing my former PC server, and the harddisk is a 2.5" laptop IDE disk, spinning-down the disk after a few minutes of idle time would actually increase the overall lifetime of the disk.

Please note that desktop disks, let alone server disks, don't like to spin down frequently, thus the lifetime of those disks could actually be decreased with an idle timeout of a few minutes

The most obvious solution would be to use a little shell script and some tool which can spin down a SCSI disk when called. However, there are a few drawbacks on such a solution:

Running the tool to spin down the disk might cause additional I/O, causing the disk to spin up right after being spun down.

Since the NSLU2 has only 32MB of RAM, it would be good if there was little C program instead of a complete shell taking care of this job. On my NSLU2, hd-idle consumes only 1.4MB of virtual memory and 384KB of real memory, most of which is shared (i.e. runtime libs, ...)

License

hd-idle is not public domain software. It's copyrighted by myself, Christian Mueller, according to the terms of the GNU General Public License (GPL). Please see the file LICENSE for additional information.

Copyright (c) Christian Mueller 2007-2009

Project Location

The latest version of hd-idle can be found here.

This project is hosted on SourceForge:





Installation

There's no release tar file at this point. Please download the source code with CVS using the following commands:

cvs -d:pserver:anonymous@hd-idle.cvs.sourceforge.net:/cvsroot/hd-idle login

Just hit Return when it asks for a password

cvs -z3 -d:pserver:anonymous@hd-idle.cvs.sourceforge.net:/cvsroot/hd-idle co -P hd-idle

The compile process is rather simple, thus there's no automake or configure script at this point, just a makefile for Linux. Since hd-idle is using the Linux generic SCSI layer, it requires the include files scsi/sg.h and scsi/scsi.h which should come with libc6-dev (at least on Debian they do).

Non-Debian Systems

In order to compile the program, type "make".

In order to install the program into /usr/local/sbin, type "make install"

Debian Systems

Run "dpkg-buildpackage -rfakeroot"

Run "dpkg -i ../hd-idle_*.deb" to install the package

Running hd-idle

In order to run hd-idle, type "hd-idle". This will start hd-idle with the default options, causing all SCSI (read: USB, Firewire, SCSI, ...) hard disks to spin down after 10 minutes of inactivity.

On a Debian system, after editing /etc/default/hd-idle and enabling it, use "/etc/init.d/hd-idle start" to run hd-idle.

Please note that hd-idle uses /proc/diskstats to read disk statistics. If this file is not present, hd-idle won't work.

Command line options

-a <name> Set (partial) device name of disks for subsequent idle-time parameters (-i). This parameter is optional in the sense that there's a default entry for all [SCSI] disks which are not named otherwise by using this parameter. -i <idle_time> Idle time in seconds for the currently named disk(s) (-a <name>) or for all disks. -l <logfile> Name of logfile (written only after a disk has spun up). Please note that this option might cause the disk which holds the logfile to spin up just because another disk had some activity. This option should not be used on systems with more than one disk except for tuning purposes. On single-disk systems, this option should not cause any additional spinups. -t <disk> Spin-down the specified disk immediately and exit. Use only the disk name (e.g. sda) without /dev/ prefix -d Debug mode. This will prevent hd-idle from becoming a daemon and print debugging info to stdout/stderr -h Print brief usage information

Regarding the parameter "-a":

A "-i" option before the first "-a" option will set the default idle time; hence, compatibility with previous releases of hd-idle is maintained. In order to disable spin-down of disks per default, and then re-enable spin-down on selected disks, set the default idle time to 0.

hd-idle -i 0 -a sda -i 300 -a sdb -i 1200

Stopping hd-idle

Use "killall hd-idle" to stop hd-idle. On a Debian system, use "/etc/init.d/hd-idle stop".