105

I have 2 HDDs in my PC. Ubuntu is turning off the secondary HDD very quickly after about 15 minutes, which is short for me. I need to control this time. How can I do it?

I tried GNOME power management but did not find it useful.

Braiam
  • 67,791
  • 32
  • 179
  • 269
user16295
  • 1,051
  • 1
    FWIW, on newer Ubuntu versions, udisks2 controls the spin-down-time,cf. e.g. https://askubuntu.com/a/1339340/1627 – maxschlepzig May 19 '21 at 13:48

14 Answers14

89

Have a look at hdparm.

From the manual (man hdparm on the command line):

-S     Put the drive into idle (low-power) mode,  and  also  set  the  standby  (spindown)
       timeout  for  the  drive.  This timeout value is used by the drive to determine how
       long to wait (with no disk activity) before turning off the spindle motor  to  save
       power.   Under  such  circumstances,  the  drive  may take as long as 30 seconds to
       respond to a subsequent disk access, though most  drives  are  much  quicker.   The
       encoding  of  the  timeout  value  is  somewhat  peculiar.   A  value of zero means
       "timeouts are disabled": the device will  not  automatically  enter  standby  mode.
       Values  from  1  to  240  specify  multiples of 5 seconds, yielding timeouts from 5
       seconds to 20 minutes.  Values from 241 to 251 specify from 1 to  11  units  of  30
       minutes,  yielding timeouts from 30 minutes to 5.5 hours.  A value of 252 signifies
       a timeout of 21 minutes. A value  of  253  sets  a  vendor-defined  timeout  period
       between  8  and  12 hours, and the value 254 is reserved.  255 is interpreted as 21
       minutes plus 15 seconds.  Note that some  older  drives  may  have  very  different
       interpretations of these values.

So:

sudo hdparm -I /dev/sdb | grep level

will show the current spindown value, for example:

Advanced power management level: 254

From the manual, 254 is reserved, so I expect it to be Ubuntu's default (can anyone confirm/expand on this please?).

Example:

  • sudo hdparm -S 25 /dev/sdb = spindown after 25*5 seconds.

  • sudo hdparm -S 245 /dev/sdb = spindown after (245-240)*30 minutes.

Rinzwind
  • 299,756
  • thanks Rinzwind for the tips , that helped me alot but i wish i see gui for this in the next release of ubuntu or it could be integrated in gnome power manager – user16295 May 04 '11 at 14:14
  • 6
    Regarding lzap's answer you seem to grep for APM (-B parm) but talk about -S the spindown. Do you also know something about APM? – turbo Mar 13 '12 at 18:09
  • 5
    The current -B setting is shown as indicated above. How can I see the current -S setting? – SabreWolfy Jun 22 '12 at 22:57
  • 14
    sudo hdparm -y /dev/sdb kills the beast immediately – siamii Mar 03 '13 at 23:20
  • 1
    @SabreWolfy I've asked that as a separate question: How can I find out the current drive spin-down time? – ændrük Apr 13 '13 at 04:12
  • 254 is the default for ac power (apm = 254) but is set to 128 by default on battery power (apm_battery = 128). To change this, edit /etc/hdparm.conf and place both parameters near the end of the file using the format given. Remember to replace /dev/hdd with the appropriate /dev/sdX! – mchid Nov 15 '14 at 04:28
  • 1
    When I use "-S" to set a spindown time, it tells me it's going to step standby to the time I specify, but when I immediately read it back with "-I" it tells me the level is 254. – Michael Aug 28 '18 at 04:46
  • @Michael Same problem here, did you find a solution? Mine is a Toshiba 1tb drive. – oarfish Apr 29 '19 at 19:29
  • @oarfish yeah, i got an SSD... ;-( – Michael Apr 29 '19 at 19:30
  • @Michael This answer was useful to discover these parameters. But ... this answer is technically wrong! The -I gives Advanced power management level: 254 but this is relative to hdparm -M 128 hda Set acoustic management to 'quiet' hdparm -M 254 hda Set acoustic management to 'fast', and not to spin down time. – Basj Nov 27 '20 at 22:37
  • Unfortunately, this suggestion doesn't work for me. Xubuntu 18.04. Western Digital 4TB – Oleg Poltoratskii Jul 01 '22 at 19:40
  • 1
    @OlegPoltoratskii no idea about that besides that udisk2 at some point came into play too but that was well passed 2018 (2020, or 2021) See https://askubuntu.com/questions/1152913/hdd-aggressively-spinning-down/1339340#1339340 – Rinzwind Jul 01 '22 at 19:44
66

Disk Utility -> select HDD drive -> click on the "More actions..." icon on the top right corner -> Drive settings...

Mine is looks like this: screenshot

guntbert
  • 13,134
Ray
  • 886
  • 11
    Easiest by far, thanks! (BTW the package you need to install if you don't have this is gnome-disk-utility. – Gerhard Burger Feb 10 '14 at 21:14
  • way to go linux! +1 – neu-rah Jul 22 '15 at 07:29
  • Yes, extremely easy - glad this is here. – AlwaysTalkingAboutMyDog May 15 '16 at 02:16
  • @Ray You, sir, are awesome! I had basically no hope that it would work for an external HDD but it did! – UTF-8 Oct 12 '16 at 11:15
  • 2
    Why most of tips involve error prone file editing or console operations, while user friendly tools like this already exits! – WooYek Jul 08 '17 at 13:37
  • Is it possible to use stand by on boot? – embe Oct 29 '17 at 09:58
  • The APM feature also has to be enabled for most HDDs and the level should not be more than 127. Otherwise they won't spin down. – HattinGokbori87 Apr 30 '18 at 18:43
  • 1
    @WooYek It's nice to have more options, for those who don't want to have to install gnome, for instance. – Michael Aug 28 '18 at 00:02
  • @Michael sure have more options. But do not provide the most difficult and error prone solution as a default one if there exists a nice and easily understandable wizard like this one. – WooYek Sep 19 '18 at 09:32
  • 2
    @wooyek this is how Linux works though. The UI doesn’t do anything other than what people offered as a solution. This isn’t a forum that states to support non technical users first. It’s a forum that finds concise answers to problems. hdparm is the core Tool to achieve this. It’s like complaining that someone explains to you what algebra to use to solve a mathematical problem you have and someone else says „just use a calculator“. – pascalwhoop May 27 '20 at 08:24
  • Everything works this way. GUI is just a layer on top of some storage. In Windows almost everything is in registry, yet by default UI is preferable cause you cant shoot yourself in the foot by using a slider, and editing a file without any validation can cause you harm. – WooYek Jun 04 '20 at 19:03
  • 2
    @WooYek The simple fact of the matter is that on Linux we have many choices of desktop environment available, so trying to hand-hold someone through a GUI solution can often be much more hassle than just telling them how to edit the exact same config file that the GUI tools modify, because some people use KDE, others use Gnome, still others use some other random desktop environment that came with their distro. Sure, this answer was simple (for a Gnome user) but would very likely totally fail for someone on another desktop. – Spam Hater Oct 11 '20 at 18:33
44

If you're interested on do the hdparm's setting persistent between reboots, instead of adding it to the crontab, you can use the /etc/hdparm.conf. I have the following, note the use of capital S, not lowercase:

command_line {
    hdparm -S 25 /dev/disk/by-uuid/f6c52265-d89f-43a4-b03b-302c3dadb215 
}

Add that line replacing the UUID by yours, or also you may specify the device using /dev/sdX format. You can find out your disk's UUID with the command sudo blkid.

Eliah Kagan
  • 117,780
29
  1. Find your disk's UUID.

    sudo lsblk --output NAME,FSTYPE,LABEL,UUID,MODE
    
  2. Edit /etc/hdparm.conf

    sudo -H gedit /etc/hdparm.conf  # Be careful from now on
    
  3. Look for spindown-time or your disk settings section.

    /dev/disk/by-label/4TB {
        spindown_time = 1200
    }
    
  4. I prefer to refer to the disk by UUID which remains the same across different installations (unless you change it in the HW itself).

    /dev/disk/by-uuid/91e32677-0656-45b8-bcf5-14acce39d9c2 {
        spindown_time = 1200
    }
    
  5. If the init script causes boot problems, you can pass nohdparm on the kernel command line, and the script will not be run.

  • 1
    What are the units for that parameter? – detly Aug 06 '16 at 08:55
  • 1
    IIRC, it's seconds. Or maybe this is the parameter which had wild rules like "if it's under 10, then its tens of seconds, if under 100, then it's minutes", and such. I'd need to find. – Ondra Žižka Aug 09 '16 at 13:01
  • 2
    It's not units, check this: https://wiki.archlinux.org/index.php/Hdparm – Ondra Žižka Aug 09 '16 at 13:07
  • Cheers, for some reason I couldn't find it in man hdparm.conf. – detly Aug 09 '16 at 13:09
  • man hdparm.conf indirectly reads that the value is passed to -S hence for values < 255 should be compatible with rule in the top answer. Any further information is welcomed. – dma_k Jan 18 '18 at 17:23
  • 1
    Do I need to repeat the disk setting for each partition on the drive? Just for partitions which are mounted? Just the primary partition? – Michael Aug 28 '18 at 04:11
  • How do I reload the hdparm.conf without rebooting the system? I would expect something like, service hdparm restart or sysctl.... – J'e Apr 06 '23 at 15:29
  • lsblk command only returns UUIDs for partitions, not the whole drive. So if a drive has two partitions, how does this work? (Same as Michael's question) – jocull Jan 24 '24 at 14:59
13

After spending hours and hours, I discovered that my Western Digital drive do not support hdparm -S command, no matter idle3 attribute value (google: idle3ctl). It is common problem with WD drives.

But I'm pleased to announce that hd-idle (http://hd-idle.sourceforge.net/) works flawlessly.

If installed from dpkg-built package (see the Installation notes), it creates daemon on both Ubuntu and Debian (config is in /etc/default/hd-idle). Works well after resuming from hibernation as well.

mc default # ps aux | grep hd-idle | grep -v grep | cut -c 66- ; for f in [a-d] ; do hdparm -C /dev/sd$f | grep -v "^$" ; done
/usr/sbin/hd-idle -i 1800 -a sdc -i 600 -a sdd -i 60 -l /var/log/hd-idle.log
/dev/sda:
 drive state is:  active/idle
/dev/sdb:
 drive state is:  standby
/dev/sdc:
 drive state is:  standby
/dev/sdd:
 drive state is:  standby

8

I add something like:

@reboot sudo hdparm -S244 /dev/disk/by-uuid/71492809-e463-41fa-99e2-c09e9ca90c8e  > /dev/null 2> /dev/null

to root's crontab. Using uuid is better I think because sda/sdb etc. seems to change with every reboot

muru
  • 197,895
  • 55
  • 485
  • 740
6

I discovered that the spindown behavior of Samsung HD204UI depends on the APM level (hdparm -B). If the APM level is 127, the spindown timeout is 10 s. If the APM level is 150, the spindown timeout is defined by the -S option.

beroal
  • 159
4

An important note: unlike the main answer, it seems that

sudo hdparm -I /dev/sdb | grep level 
# Advanced power management level: 254

does not show the current spindown value (that we can set with hdparm -S, as desired by OP), but rather displays the value set with hdparm -M:

hdparm -M 128   # Set acoustic management to 'quiet'
hdparm -M 254   # Set acoustic management to 'fast'
Basj
  • 133
4

In Ubuntu 14.04

Disks > highlight drive > click the gear in the upper right hand corner > Drive Settings > now you have Standby, APM, AAM and Write Cache settings in an easy to use GUI!

user245219
  • 41
  • 2
  • How do you make this work? I have set this, and after reboot if i go back in it has remembered that the drive should power down, but it never does. hdparm -C always shows it is active and only running hdparm -S xxx from the commandline makes it work. – dan carter Jul 20 '14 at 11:10
  • 1
    Where do you find "Disks"? – nealmcb Jan 14 '15 at 01:14
2

on ubuntu 18.04 to 20.04, you can change drive setting standby timeout at:
search Disks in the launcher > select your disk > click on ⋮ at menu bar next to minimize the window button > Drive Settings > use slider to set timeout

Screenshot on ubuntu 20.04

2

I had no luck with hdparm on an external HDD mounted in a USB enclosure, which I use to serve media with minidlna.

I came across an idea from here: https://serverfault.com/questions/562738/keeping-usb-backup-drive-from-sleeping-while-mounted

Best results come from using the disk's uuid, which you can find with:

sudo blkid

The following method does require root access, but so does hdparm. This uses crontab to read a random block from the drive every 5 minutes and ignores all messages. To make sure you have the right UUID, test it on the command line like this (make sure you use your desired UUID, not this one):

sudo dd if=/dev/disk/by-uuid/f01df4b5-6865-476a-8d3b-597cbd886d41 of=/dev/null count=1 skip=$RANDOM

You should see output like this:

1+0 records in
1+0 records out
512 bytes copied, 0.000738308 s, 693 kB/s`

To suppress this message, which could end up getting written somewhere, potentially the / filesystem (which is on an SSD in my case), below is what I'm using in the root crontab. You get there with

sudo crontab -e

Then, under the comments:

*/5 * * * * bash -c 'dd if=/dev/disk/by-uuid/f01df4b5-6865-476a-8d3b-597cbd886d41 of=/dev/null count=1 skip=$RANDOM' >/dev/null 2>&1

Hope this helps someone else with similar issues. Unfortunately, this still gets written to the syslog, but there are potentially ways to suppress that; see this ServerFault post.

[edit] 2017-01-07 09:02:

I was able to suppress these messages by editing /etc/rsyslog.d/50-default.conf to change this line:

*.*;auth,authpriv.none -/var/log/syslog

to this:

*.*;cron,auth,authpriv.none -/var/log/syslog

Unfortunately, this suppresses all cron messages; I could not get cron to redirect logging off the root filesystem (which is on an aging SSD in my case, so I want to limit writes), but as this is just a home server, I am probably not missing out on much. Would definitely not recommend this strategy for a production machine.

1

I have discovered that

sudo hdparam -S 0 /dev/sda1

on my disk gives this output:

setting standby to 0 (off)
Greenonline
  • 2,081
Vedran M.
  • 11
  • 1
1

On Debian, with WD drives, I find that setting any level with hdparm -S results in the drive returning a level 254 on subsequent hdparm -I. So I'm really not sure if they're spinning down or not. I think they are still spinning down.

These drives are on a server array, and I really don't want them to ever spin down. In the past I've kludged this by setting a cron job to update a file every few minutes.

dwasifar
  • 11
  • 1
0

Use SMART Monitoring Tools smartctl to Change Standby Time

If you have SMART Monitoring Tools installed, your drive supports SMART (which it usually does), and your drive is SATA or ATA, you can use the smartctl program with the -s option flag to change a setting on a drive. Here is an excerpt from the smartctl manual page describing the behavior of the standby timer drive setting:

A value of 0 or 'off' disables the standby timer.  Values
from 1 to 240 specify timeouts from 5 seconds to 20 minutes
in 5 second increments.  Values from 241 to 251 specify
timeouts from 30 minutes to 330 minutes in 30 minute
increments.  Value 252 specifies 21 minutes.  Value 253
specifies a vendor specific time between 8 and 12 hours.
Value 255 specifies 21 minutes and 15 seconds.  Some drives
may use a vendor specific interpretation for the values.

Usage Examples

For example, this sets the standby timer to 20 minutes:

smartctl /dev/sdx -s standby,240

...and this command disables the standby timer to immediately spin the disk down, which is useful for preventing damage to the drive if you need to physically move it:

smartctl /dev/sdx -s standby,0


Notes

  • Remember that the target device should be the device itself and not a partition on that device, i.e. /dev/sda instead of /dev/sda1.
  • Keep in mind that some drives might have vendor specific behavior in relation to the standby setting.
  • To consistently change the settings of a specific disk, such as in a script that runs at boot, you can use the mapped UUID link of the disk within /dev/disk/by-uuid.