Tips to spindown your hard disk in Debian or Ubuntu

First

Before we are going into depth, first check if the (external) hard disk is able to go in spindown. Disable all services which has disk access periodically, for example:

$ /etc/init.d/asterisk stop
$ /etc/init.d/rsyslog stop
$ /etc/init.d/apache2 stop
$ /etc/init.d/mysql stop
$ /etc/init.d/samba stop
$ /etc/init.d/cron stop
$ /etc/init.d/ntp stop
$ /etc/init.d/rsync stop

And all other daemons which are suspicious…

–MARK– in /var/log/messages

In /var/log/messages every 30 minutes a —- MARK —- row will be written. This can be switched off by configuring the rsyslogd. Open the rsyslog.conf file and comment out the “$ModLoad imark” by putting a ‘#’ before this:

$ vi /etc/rsyslog.conf
#$ModLoad immark # provides --MARK-- message capability

Adding the noatime mount option in /etc/fstab

By default the access times of directories and files are stored with this file or directory. This will keep the hard disk spinning, even when a file is read from the cache. With the noatime mount option in fstab, this access times will not be kept anymore. To add noatime, open fstab and add the (bold) noatime option to the hard disk partitions. Do not do this with the swap space(s).

$ vi /etc/fstab
$ /dev/sda1
UUID=2e0e754e-7dc2-4c21-9101-b539b8a501a8  /       ext4   errors=remount-ro,noatime 0   1
$ /dev/sda3
UUID=a4a2e073-1315-4051-9811-6a1831d25327  /home   ext4   noatime,noatime           0   2

Searching for the changed file

To search to files which are continuously changing on the hard disk, I made a script for which files are changed in the past XX minutes. Knowing which files are changing, you can find a solution for this. For example moving the file on a ram disk (tmpfs). To create the script, do the following:

$ vi /usr/local/sbin/ff_changed

#!/bin/sh
echo Search whole filesystem for changed files in the last $1 minutes
find /bin /dev /etc /home /lib /media /mnt /opt /root /sbin /srv /tmp /usr /var -cmin -$1

And make the ff_changed script executable:

$ chmod +x /usr/local/sbin/ff_changed

Disable all cronjobs

We need the cronjobs, but maybe not all. You can make it maybe a little bit more specific to your task. But first we are going to disable them all to look if the hard disk will spin down or not. Put a ‘#’ before every cron job. Like in this example:

$ vi /etc/crontab

# 17 *  * * *   root    cd / && run-parts --report /etc/cron.hourly
# 25 6  * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
# 47 6  * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
# 52 6  1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Samba

In case you using Samba, probably your hard disk will not spindown, because browse.dat in the /var/cache/samba directory is very often updated. This will keep the hard disk spinning. Mounting this directory as a tmpfs (ram disk) will fix this problem. The total size of the files in this directory is 75k. To create the tmpfs, open the samba startup file and add the bold mount and umount rows to /etc/init.d/samba:

$ vi /etc/init.d/samba

#!/bin/sh

### BEGIN INIT INFO
# Provides:          samba
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Should-Start:      slapd
# Should-Stop:       slapd
# Short-Description: start Samba daemons (nmbd and smbd)
### END INIT INFO

# Defaults
RUN_MODE="daemons"

# Reads config file (will override defaults above)
[ -r /etc/default/samba ] && . /etc/default/samba

PIDDIR=/var/run/samba
NMBDPID=$PIDDIR/nmbd.pid
SMBDPID=$PIDDIR/smbd.pid

# clear conflicting settings from the environment
unset TMPDIR

# See if the daemons are there
test -x /usr/sbin/nmbd -a -x /usr/sbin/smbd || exit 0

. /lib/lsb/init-functions

case "$1" in
        start)
                log_daemon_msg "Starting Samba daemons"
                mount -t tmpfs tmpfs /var/run/samba
                mount -t tmpfs tmpfs /var/cache/samba

                # Make sure we have our PIDDIR, even if it's on a tmpfs
                install -o root -g root -m 755 -d $PIDDIR

                NMBD_DISABLED=`testparm -s --parameter-name='disable netbios' 2>/dev/null`
                if [ "$NMBD_DISABLED" != 'Yes' ]; then
                        log_progress_msg "nmbd"
                        if ! start-stop-daemon --start --quiet --oknodo --exec /usr/sbin/nmbd -- -D
                        then
                                log_end_msg 1
                                exit 1
                        fi
                fi

                if [ "$RUN_MODE" != "inetd" ]; then
                        log_progress_msg "smbd"
                        if ! start-stop-daemon --start --quiet --oknodo --exec /usr/sbin/smbd -- -D; then
                                log_end_msg 1
                                exit 1
                        fi
                fi

                log_end_msg 0
                ;;
        stop)
                log_daemon_msg "Stopping Samba daemons"
                log_progress_msg "nmbd"

                start-stop-daemon --stop --quiet --pidfile $NMBDPID
                # Wait a little and remove stale PID file
                sleep 1

                if [ -f $NMBDPID ] && ! ps h `cat $NMBDPID` > /dev/null
                then
                        # Stale PID file (nmbd was succesfully stopped),
                        # remove it (should be removed by nmbd itself IMHO.)
                        rm -f $NMBDPID
                fi

                if [ "$RUN_MODE" != "inetd" ]; then
                        log_progress_msg "smbd"
                        start-stop-daemon --stop --quiet --pidfile $SMBDPID
                        # Wait a little and remove stale PID file
                        sleep 1

                        if [ -f $SMBDPID ] && ! ps h `cat $SMBDPID` > /dev/null
                        then
                                # Stale PID file (nmbd was succesfully stopped),
                                # remove it (should be removed by smbd itself IMHO.)

                                rm -f $SMBDPID
                        fi
                fi

                umount /var/run/samba
                umount /var/cache/samba

                log_end_msg 0

                ;;
        reload)
                log_daemon_msg "Reloading /etc/samba/smb.conf" "smbd only"

                start-stop-daemon --stop --signal HUP --pidfile $SMBDPID

                log_end_msg 0
                ;;
        restart|force-reload)
                $0 stop
                sleep 1
                $0 start
                ;;
        status)
                status="0"
                NMBD_DISABLED=`testparm -s --parameter-name='disable netbios' 2>/dev/null`
                if [ "$NMBD_DISABLED" != "Yes" ]; then
                        status_of_proc -p $NMBDPID /usr/sbin/nmbd nmbd || status=$?
                fi
                if [ "$RUN_MODE" != "inetd" ]; then
                        status_of_proc -p $SMBDPID /usr/sbin/smbd smbd || status=$?
                fi
                if [ "$NMBD_DISABLED" = "Yes" -a "$RUN_MODE" = "inetd" ]; then
                        status="4"
                fi
                exit $status
                ;;
        *)
                echo "Usage: /etc/init.d/samba {start|stop|reload|restart|force-reload|status}"
                exit 1
                ;;
esac

exit 0

Asterisk

This depends on how you configure Asterisk on what the hard disk will spin up. What I found out with debug tools, is that the file astdb accessed and changed a lot. Also when you do not use the Asterisk DB. If you do not use the logging, you can also comment this out. Change this in the file asterisk.conf:

$ vi /etc/asterisk/asterisk.conf

[directories]
; astvarlibdir => /opt/var/lib/asterisk      ; Commented out to spinning down harrdisk
; astlogdir => /opt/var/log/asterisk         ; Commented out to spinning down harddisk

Installing and configuring hdparm

I tested tools/modules like laptop-mode-tools, pm-utils en noflushd. But these did not work well. I had more success with hdparm. This command will not work on external USB hard disks, via SATA it works perfect. Open the /etc/hdparm.conf file and set the desired spindown time:

$ vi /etc/hdparm.conf

/dev/sda {
    #spindown_time = 60  # 5 min
    #spindown_time = 240 # 20 min
    #spindown_time = 250 # 30 min
    #spindown_time = 280 # 1 hour
    spindown_time = 340 # 2 hours
}

To check if the hard disk is standby, you can use the following command:

$ hdparm -C /dev/sda

/dev/sda:
drive state is:  standby

See also: manpages.ubuntu.com/manpages/hardy/en/man8/hdparm.8.html

The lifetime of the hard disk

Remark! Switching off the hard disk too often is not good for the lifetime of the hard disk. It is also not very handy to wait every time for spinning up the disk. At home I’ve set the spindown time to 30 min. For business environment I am using 2 hours spindown time or let it active for the whole working day. Otherwise the disk will be switched off to often.

Manufacturers specifying that the hard disk can be switched on and off for 200.000 times in it’s life. With a lifetime of 5 years, that is 40.000 times a year and 109 times a day. Keep in mind that in the weekends and holidays the server shall not be used. If you set a spindown_time of 10 min. Multiplying with 109, this is 18 hours a day. This is not bad, but 10 min is the limit in this case. It is beter to switch off less ofthen.

Story about this: ubuntudemon.wordpress.com/2007/10/28/laptop-hardrive-killer-bug-how-to-discover-whether-you-are-affected

NTP

The NTP synchronizes the time continuously. This is not always necessary. Sometimes it is also OK to synchronizes the time at once. To disable NTP, you stop NTP and put the following in the top of the NTP startup script:

$ /etc/init.d/ntp stop
$ vi /etc/init.d/ntp

exit 0 # disable NTP

Or just remove the NTP package with

$ apt-get remove ntp

Now we need to install ntpdate with

$ apt-get install ntpdate

Try the ntpdate command with:

$ ntpdate pool.ntp.org

Add this to the crontab and synchronize the time every day on 5:15 in the night or just a minute before another periodically job:

$ vi /etc/crontab
15  5   *   *   *  /usr/sbin/ntpdate pool.ntp.org  &>/dev/null

Activating the harddisk

Tip: Keep the hard disk spinning during the day

It is not always handy when the hard disk spins down. For example with Asterisk (VOIP), it takes some time before the hard disk is up. Also for a file server it is good that it remains active during working hours.

What I use is a simple cron job, which is executing a ‘ls’ command somewhere in a nearly empty directory on that hard disk. In case the hard disk is going in sleep after 10 min, it is good to execute the command every 9 minutes. With the following cron job, the disk remains active from 8:00 till 18:00 from monday (1) till friday (5). ‘ls’ will be executed every 9 minutes:

$ vi /etc/crontab
*/9  8-18  *   *   1-5  /bin/ls /home  &>/dev/null

Activate the hard disk when somebody calls (in case of Asterisk)

The following solution will activate the hard disk, before the voice respond menu will be active. In the time the telephone rings, the hard disk has time to spin up and is ready for the voice respond menu. This can be done like this:

$ vi /etc/asterisk/extensions.conf
[external]
exten => s,1,System(ls /opt) ; Execute a command on a non-cached disk, to spinup the hard disk
exten => s,n,Dial(SIP/501&SIP/502,30) ; The telephones are ringing for 30 seconds

In more difficult cases

In some case it is not enough to find the changed files with the ff_changed script. In that case ‘strace’ is very handy. ‘strace’ shows all system calls and signals. It generates a lot of logging, but you can find the one who wakes up your hard disk. First you need to install strace:

$ apt-get install strace

Check in the /etc/init.d directory for the service you want to trace. Look in the script file which parameters are used to start the service. Now we are ready to start strace, for example for asterisk:

$ strace -ff -o asterisk.log asterisk -c

Used options for strace:

  • -ff => follow child processes + add pid to logfilename
  • -o  => output logging to debug.log

Another example for tracing the samba daemons is:

$ cd
$ mkdir samba_log
$ cd samba_log
$ strace -ff -o nmbd.log nmbd -D &
$ strace -ff -o smbd.log smbd -D &
$ tail -f smbd.log*

Cache write back time

Until now all tricks were trying to prevent that a process writes to the hard disk. If a process wants to write to the hard disk, it will be immediately stored. But the write action can also be delayed for a while. This is by default 5 seconds. You can check this by entering the following command:

$ cat /proc/sys/vm/dirty_writeback_centisecs
500

This value is in centiseconds. And can also be set to a higher value, for example 1 hour.

$ echo 360000 > /proc/sys/vm/dirty_writeback_centisecs

Warning: if you have a power failure in this hour, you will loose this data. To prevent this, you need to use an UPS.

Laptop mode

In newer Linux kernels (>= 2.6.6 and >= 2.4.23) there is a laptop mode available. The laptop mode groups the disk write activity into “chunks” that are spaced at larger intervals than they normally would be. This works good with the cache write back time. If the disk is active, the laptop mode will arrange that all disk activities will be done at that time. To check in which mode it is right now, enter the following command:

$ cat /proc/sys/vm/laptop_mode   
0

0 means that that the laptop mode is disabled. To enable the laptop mode, enter the following command:

$ echo 5 > /proc/sys/vm/laptop_mode

Information about the laptop mode: