Force spin-down of external hard-drive on linux (raspberry pi)

37,704

Solution 1

I didn't have luck with hd-idle; it ran but didn't function. I ended up writing the script below:

#!/bin/bash
# This script looks for recent disk access, and if nothing has changed, puts /dev/"drive" into spindown mode.
# This should be used only is the hdparm power management function is not working.
# Call this script with cron or manually as desired
#
#
#
# Change which drive this script looks at by changing the drive variable below:
drive="sda"
#
#
current=`date`
caller=$(ps ax | grep "^ *$PPID" | awk '{print $NF}')
filename="/tmp/diskaccess.txt"
if [ -f "$filename" ]; then
    stat_old=`cat "$filename" | tr -dc "[:digit:]"`
    stat_new=`cat /sys/block/"$drive"/stat | tr -dc "[:digit:]"`
    if [ "$stat_old" == "$stat_new" ]; then
        stat="0"
        echo "The disk hasn't been used; spinning down /dev/$drive"
        echo $stat_old
        hdparm -y /dev/$drive > /dev/null
    else
        stat="1"
        echo $stat_old
        echo $stat_new
        echo "The drive has been used..."
        echo $stat_new > $filename
    fi
else
    echo "/tmp/diskaccess.txt file does not exist; creating it now."
    echo $stat_new > $filename
fi
echo $stat " - " $drive " - " $current " - by: " $caller >> /tmp/diskaccesslog.txt

Solution 2

Yes, it is possible but will require some custom development work and not trivial and the code is going to be specific to the USB->SATA bridge chip INSIDE of your enclosure.

The deal is that the USB bridge serves as more than an electrical convertor. A USB-attached HDD emulates a SCSI drive which has a different command set. While the standard read/write/seek commands translate all the time the more exotic spin up/down do not. Most chips won't do that. Furthermore there is NOT a universal chip level API. So If I wrote the code I would have to have a programming manual for the USB bridge chip.

Bottom line, unless you have programming specifics on the chip and are familiar with the ATA and SCSI instruction set and encapsulating pass-through commands, then you're just going to have to do without. Too much work and no standard.

Solution 3

It is entirely possible that the signals you are sending are neglected. You did not provide the output of

sudo hdparm -I /dev/sdX

which would have told us the disk capabilities, but many disks simply do not respond to these commands.

Luckily, there is a very convenient utility, hd-idle, which you can download from here, allowing you to force a disk spin down after some specified lapse of time. The program has been developed especially for Debian, (but it works on Linux in general), so that its installation should be very easy to you. I just hope it also works on an ARM architecture, something which I cannot test.

Edit: it compiles and installs correctly on raspbian.

Share:
37,704

Related videos on Youtube

user258346
Author by

user258346

Updated on September 18, 2022

Comments

  • user258346
    user258346 almost 2 years

    I'm currently setting up a home-server using a Raspberry Pi with an external hard-disk connected via usb. However, my hard-drive will never spin down when being idle.

    I tried already the hints provided at raspberrypi.org ... without any success.

    1.)

    sudo hdparm -S5 /dev/sda
    

    returns

    /dev/sda:
     setting standby to 5 (25 seconds)
    SG_IO: bad/missing sense data, sb[]:  70 00 04 00 00 00 00 0a 00 00 00 00 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    

    2.)

    sudo hdparm -y /dev/sda
    

    returns

    /dev/sda:
     issuing standby command
    SG_IO: bad/missing sense data, sb[]:  70 00 04 00 00 00 00 0a 00 00 00 00 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    

    ...and 3.)

    sudo sdparm --flexible --command=stop /dev/sda
    

    returns

    /dev/sda: HDD         1234
    

    ... without spin-down of the drive.

    I use the following hardware:

    • Inateck FDU3C-2 dual Ports USB 3.0 HDD docking station
    • Western Digital WD10EZRX Green 1TB

    Is it possible, that the sent spin-down-signals are somewhere overwritten/lost/ignored?

    • user258346
      user258346 over 10 years
      Update: The menioned Inateck docking station has a functionality to clone hard drives, providing a master/source and a slave/sink port for HDDs. When plugging the HDD to the slave port the commands, mentioned above, workout. This limits the problem of missing spin-down to the master port.
    • MariusMatutiae
      MariusMatutiae over 10 years
      If you think this is solution, you should accept your own solution. Corny though it may seem, it is useful for future readers with the same problem.
    • MariusMatutiae
      MariusMatutiae about 10 years
      You do realize, of course, that the command you use in your script is the very same you stated was not working, right? hdparm -y /dev/sda...
  • Cristian Ciupitu
    Cristian Ciupitu almost 10 years
    I thought hdparm -y didn't work.
  • Tarator
    Tarator over 5 years
    Thanks, works perfectly. My WD blue harddisk spins down now, when not used. What is a reasonable intervall for cron to call the script, in your opinion? I call it every 15min for now.