Tips to spindown your hard disk in Debian or Ubuntu


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

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
# chmod a+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 )


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


# 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)

# Defaults

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


# 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
                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
                                log_end_msg 1
                                exit 1

                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

                log_end_msg 0
                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
                        # Stale PID file (nmbd was succesfully stopped),
                        # remove it (should be removed by nmbd itself IMHO.)
                        rm -f $NMBDPID

                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
                                # Stale PID file (nmbd was succesfully stopped),
                                # remove it (should be removed by smbd itself IMHO.)

                                rm -f $SMBDPID

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

                log_end_msg 0

                log_daemon_msg "Reloading /etc/samba/smb.conf" "smbd only"

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

                log_end_msg 0
                $0 stop
                sleep 1
                $0 start
                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=$?
                if [ "$RUN_MODE" != "inetd" ]; then
                        status_of_proc -p $SMBDPID /usr/sbin/smbd smbd || status=$?
                if [ "$NMBD_DISABLED" = "Yes" -a "$RUN_MODE" = "inetd" ]; then
                exit $status
                echo "Usage: /etc/init.d/samba {start|stop|reload|restart|force-reload|status}"
                exit 1

exit 0


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

; 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

drive state is:  standby

Zie ook:

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:


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

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  &>/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

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


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 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:

11 thoughts on “Tips to spindown your hard disk in Debian or Ubuntu”

  1. Hi,

    two month ago, I bought a Seagate Dockstar and deployed it with two 1.5TB USB drives. First I tried to spin those drives down with hdparm. As you remarked, this doesn’t work. But there is another tool, which can be used:

    Probably this can help you too?

  2. Hello,
    Thanks for the tips!
    I’ve got a Ubuntu 10.04 LTS NAS with 3x2TB HDD mounted at /storages for HD movies and share into the network via smb. I tried with hdparm but didn’t work.
    Is there any tips for me? I’m running my server with webmin, do you think webmin prevents my hard drive spinning down?

    1. Hi Promi,
      Maybe his solution is not your solution. It all depends on the services/processes which are activating the hard disk. So like I said in the beginning of the post, just deactivate all the processes which could activate the hard disk. If the hard disk spins down, you can activate all services/processes step by step. It could be that some tasks of Webmin are activating the hard disk. If you find out who is guilty, zoom in to this one and find out how to stop activating the hard disk.
      In this post you can find a lot of tricks how to solve problems.
      Success and let us know what you found!
      Greetings, Arjan

    2. Hi.
      I confirm that Webmin might prevent drives from sleeping.
      On my system (Ubuntu 12.04 i386) an unmounted drive would wake up every 5-10 minutes. When I stopped webmin service, the drive was finally able to stay in standby for a while.
      Since the disk was not mounted, probably reading some metadata (SMART, partition table) was the only thing the service could be doing.

  3. Brilliant guys, after spending few hours to find out why my external HDD is not staying at sleep mode and constantly waken up by a mysterious service, I have disabled only webmin and all is fine now.
    Also I have noticed that although hdparm is showing an error message when I do set standby timeout time, it still sets it up in the HDD:
    someone@someone-laptop:~$ sudo hdparm -S 241 /dev/sdb

    setting standby to 241 (30 minutes)
    HDIO_DRIVE_CMD(setidle) failed: Invalid argument

    Thanks all !

  4. My system doesn’t spin down drives because journaling deamon jbd2, does periodic cache write backs. Suggestion above recommends increasing cache write back intervals from 5 seconds to 1 hour, but doing so would still not allow the drives to remain in spin down state for any prolonged period of time. Any other recommendations?

  5. In Webmin/Harware/SMART Drive Status: these settings will help not waking up the disk:

    Force ATA query mode? No
    Extra command-line parameters to smartctl “-d ata -n standby”

    -d ata -> it means only use ata commands (to avoid trying scsi commands that may wake the disk)
    -s standby -> it means if the drive is in standby or suspend don’t force to wake up

  6. Hi, Thanks for your page.

    As mentioned my HDD always restart after hdparm -y
    No trace what is doing a read on the disk (that I checked with script .

    In the Bios, I changed each disk with SMART at disable.
    And the SATA put by AHCI, maybe better and newer than IDE. But the problem still going : HDD starts again.

    Finally, the problem seems to be the service ‘smartd’ (I am using Fedora). I stop the service. The disk not start for 24H ! Yeah

Comments are closed.