Temat: Nie działa usypianie dysku sdparm ani hd-idle

Mojego dysku nie usypia hd-idle ani sdparm. Działa tylko hdparm, ale po restarcie dysk zapomina ustawienia.

To może najpierw się przywitam.  Dzień dobry. To jest mój pierwszy post tutaj. Rewelacyjny serwis. Naprawdę. Szczególne podziękowania dla Cezarego.
O sprzęcie/sofcie
router TP-LINK TL-WR1043ND, dysk  TOSHIBA MK3252GSX, OpenWrt Backfire 10.03.1-RC6 / LuCI 0.10 Branch (0.10+svn7852) [kernel 2.6.32.27], binaria i pakiety pobrane z OpenWrt.org
CopyRight Wszystko, co poniżej, jest objęte licencją GNU GPL v3.
Disclaimer Wszystko, co poniżej, używasz na własną odpowiedzialność. Autor nie ponosi żadnej, także domyślnej odpowiedzialności za poniesione szkody.
Przepraszam Ja dopiero od tygodnia zaprzyjaźniam się z Linuxem. Jeśli coś jest źle albo nieoptymalnie, to proszę - zwróć mi uwagę i ewentualnie zaproponuj korektę.

Wracając do tematu
Mam router [jw] i dysk USB [jw].
Nie działa hd-idle. Nie działa swparm. Tylko częściowo działa hdparm.
Tylko częściowo, bo polecenie "hdparm -S 1 /dev/sdb" działa, dysk usypia (w przykładzie: po pięciu sekundach). Ale po odłączeniu dysku (albo wyłączeniu routera) zapomina o ustawieniu.

  Wyczytałem, że czas usypiania zapisuje się trwale gdzieś w dysku. Wystarczy raz zdefiniować i już. Albo mam oporny dysk, albo OpenWrt nie przypadkiem kasuje takie zapisy. Dość, że mój dysk zapomina.

  Na początek - kilka poleceń [zakładam, że dysk jest zamontowany jako /dev/sdb]
  hdparm -I /dev/sdb
     Informuje - co dysk umie. W szczególności ważne dla mnie - "Power Management feature set"
  hdparm -C /dev/sdb
    pokazuje albo standby, albo active. Czyli czy śpi, czy nie.
  hdparm -K 1 /dev/sdb
    sugeruje dyskowi, że powinien zapamiętać ustawienia po wyłączeniu. Mój dysk nie zapamiętuje :( Ale polecenie "hdparm -K 1 /dev/sdb" potwierdza, że zrozumiał (setting drive keep features to 1 (on)
  hdparm -S n /dev/sdb
    zdefiniowanie czasu do przejścia w stan idle przy braku aktywności. Logika kierująca zależnością parametru od czasu jest pokrętna.

  Dwa kawałki kodu i plik konfiguracyjny umożliwiają wywołanie "hdparm -S Liczba /dev/sdb" każdorazowo po podłączeniu dysku i restarcie systemu.
  Cały parametr '-S Liczba' można zdefiniować, konfigurację można zdefiniować dla każdego dysku oddzielnie, poleceniem może być hdparm albo sdparm.

  Uprzednio należy zainstalować pakiety: block-hotplug oraz hdparm albo/i sdparm (ten/te, który będzie używany)

  Plik /etc/hotplug.d/block/75-hdd-sleep:

#!/bin/sh
#
# Set drive parameters using hotplug.d and hdparm/sdparm command

[ -f /etc/config/hdd-sleep ] || exit
[ "$ACTION" != "add" ] && exit

. /etc/functions.sh

find_device() {
    local cfg="$1"
    local cmd="$2"
    local DevName="$3"
    local LogFile="$4"
    local device
    local uuid
    local label
    local pattern=""
    local enabled=1
    local parm

    config_get_bool enabled "$cfg" enabled 1
    enabled=1
    [ $enabled != 1 ] && return

    config_get device "$cfg" device
    if [ "$device" == "" ]; then
        config_get label "$cfg" label
        if [ "$label" != "" ]; then
            pattern="LABEL=\"${label}\""
        else
             config_get uuid "$cfg" uuid
            [ "$uuid" == "" ] && return
            pattern="UUID=\"${uuid}\""
        fi
        device=`blkid|grep "${pattern}"|cut -d : -f 1`
    fi
    [ "$device" = "" ] && return
    echo "${device}"|grep -q "${DevName}[0-9]*"
    [ $? != 0 ] && return

    config_get parm "$cfg" parm
    [ "$parm" == "" ] && return

    echo hdd-sleep: $cmd $parm $DevName [ $pattern ]>>$LogFile
    $cmd $parm $DevName>>$LogFile
}

config_load hdd-sleep

local LogFile=""
local LogEnabled
config_get_bool LogEnabled log enabled 0
[ $LogEnabled -eq 1 ] && config_get LogFile log file
[ "$LogFile" == "" ] && LogFile=/dev/null

for cmd in hdparm sdparm ; do
    [ -r /dev/$DEVNAME ] && DEVNAME=/dev/$DEVNAME
    config_foreach find_device $cmd $cmd "$DEVNAME" "$LogFile"
done

Do pliku /etc/hotplug.d/block/75-hdd-sleep nie potrzeba żadnych specjalnych uprawnień ani atrybutów (nie potrzeba  chmod). Jest uruchamiany przez hotplug.d po włożeniu dysku (nie po zamontowaniu partycji - po włożeniu dysku), i jeśli nazwa partycji, albo uuid partycji albo etykieta partycji pasują do uprzednio zdefiniowanej konfiguracji - odpalany jest "hdparm parametry nazwadysku"

Kolejny plik - /etc/init.d/hdd-sleep

#!/bin/sh /etc/rc.common

START=75
STOP=75

start() {
    local ACTION=add
    local devices=""
    local OIFS=$IFS
    IFS=$'\n'
    for DEVNAME in `blkid|cut -d : -f 1`; do
        devices="$devices $DEVNAME"
    done
    IFS=$OIFS
    for DEVNAME in $devices; do
        . /etc/hotplug.d/block/75-hdd-sleep
    done
}

Temu plikowi trzeba zmienić atrybuty: chmod +x /etc/init.d/hdd-sleep
A potem zarejestrować: /etc/init.d/hdd-sleep enable
Ten skrypt (uruchamiany w czasie restartu systemu) przegląda wszystkie zmontowane partycje i dla każdej z nich usiłuje uruchomić /etc/hotplug.d/block/75-hdd-sleep. W ten sposób żaden dysk nie będzie pominięty - będzie obsłużony albo przy restarcie systemu, albo po podłączeniu.

No i jeszcze jakaś konfiguracja. Oczywiście w pliku /etc/config/hdd-sleep
Ja mam tak:

config 'system' 'log'
        option 'enabled' '0'
        option 'file' '/tmp/hdd-sleep.log'

config 'hdparm'
        option 'label' 'Data1'
        option 'enabled' '1'
        option 'parm' '-S 60'

Sekcja config 'system' 'log'. Dwa parametry:
option 'enabled' (default jest 0) - czy ma logować aktywność do pliku, czy nie. W fazie testowania ustawić na "1", skonfigurować usługę, ustawić na "0", zapomnieć o wszystkim
option 'file' - plik z logiem

Dla ustalenia uwagi pokażę, co u mnie generuje polecenie blkid

/dev/sdb1: LABEL="Data1" UUID="e2a3d34e-8082-4643-a2f2-64c6bae821ef"
/dev/sda3: UUID="4b82425b-56de-44b8-a962-4204d4f42000"
/dev/sda2: LABEL="ConfigDoc" UUID="a14f29d9-2b1a-4824-8502-c18a039f1b0f"
/dev/sda1: LABEL="ExtRoot" UUID="6d9b4980-e846-4c86-aa07-289f1141ba32"

Sekcja config 'hdparm', a może być ich kilka, może być też jedna albo kilka sekcji config 'sdparm'. Po jednej sekcji dla każdego dysku do uśpienia.
option 'label' 'Data1' - w tym przykładzie - będziemy usypiać dysk, na którym leży partycja o etykiecie (label) Data1, czyli /dev/sdb
Zamiast option 'label' 'blabla' można użyć option 'uuid' 'e2a3d34e-8082-4643-a2f2-64c6bae821ef' będziemy usypiać dysk, na którym leży partycja o identyfikatorze (uuid) e2a3d34e-8082-4643-a2f2-64c6bae821ef, czyli /dev/sdb
Zamiast option 'label' 'blabla' i option 'uuid' 'blabla' można użyć:
option 'device' 'sdb1' - w tym przykładzie - będziemy usypiać dysk, na którym leży partycja /dev/sdb1, czyli dysk /dev/sdb.
Wszystkie trzy pokazane opcje służą do tego samego - wskazania dysku do usypiania. Pierwszeństwo ma device, potem label i na końcu uuid.
option 'enabled' (defaultowo 1) - czy dana sekcja w ogóle jest aktywna
option 'parm' 'CosTam': na rzecz dysku zidentyfikowanego przez device, label albo uuid, (o ile enabled nie jest 0) zostanie wykonane polecenie "hdparm CosTam dysk". W tym przykładzie to będzie "hdparm -S 60 /dev/sdb". A jeśli konfiguracja (z takimi samymi opcjami) byłaby w sekcji sdparm, to wykonane by było polecenie sdparm

Uruchomienie całości:
Wgrać pliki we wskazane miejsca, wykonać opisane chmod i /etc/init.d/hdd-sleep.
W konfiguracji w sekcji "log" wpisać "enabled 1", odpalić "tail -f /tmp/hdd-sleep.log" i obserwować.
W drugiej sesji skonfigurować dysk (opcja device albo label albo ssid), wstawić na próbę czas 5 sekund czyli '-S 1' i uruchomić "/etc/init.d/hdd-sleep start"
W logu powinno coś się pojawić. Po pięciu sekundach zbadać stan dysku: "hdparm -C /dev/sdb". Jeśli poszedł spać (czyli odpowiedział  "drive state is: standby"), to jesteśmy w domu. Ustawiamy parametr -S na pasującą nam wartość, ponownie "/etc/init.d/hdd-sleep start", zaglądamy do logu, czy wszystko jest ok, zmieniamy opcję "enabled 0" w sekcji "log" (nie w sekcji hdparm) i zajmujemy się czymś innym. Koniec.

2

Odp: Nie działa usypianie dysku sdparm ani hd-idle

Cezary, odkopałem ten temat, bo mam taki sam dysk. Hdparm bardzo ładnie działa, ale faktycznie u mnie też nie zapamiętuje dysk ustawień czasu standby.
Skorzystałem z wpisu do pliku /etc/rc.local z opisu:
http://eko.one.pl/?p=openwrt-standby#sdparm
Na razie jest OK, bo mam tylko jeden dysk i zawsze montuje się jako sda, ale będę montował pendriva na extroota i wówczas, co się pierwsze zamontuje to dysk będzie albo /dev/sda albo /dev/sdb
Można w tym pliku /etc/rc.local jakoś to dopisać do UUID partycji?

3

Odp: Nie działa usypianie dysku sdparm ani hd-idle

A nie prościej skorzystać z /etc/hotplug.d/block i uruchomić to po wykryciu nośnika? To przekazuje oznaczenie dysku w parametrach, więc nie ma problemy czy to będzie sdb czy sda.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

4

Odp: Nie działa usypianie dysku sdparm ani hd-idle

To mam prośbę o przerobienie tego wpisu do pliku 99-mount, tak, aby robił polecenie hdparm -S 60 na HDD

#!/bin/sh

    case $ACTION in
        add)
            grep -q /dev/$DEVICENAME /proc/mounts || exit 0

            DIR=$(awk '/^\/dev\/'$DEVICENAME'/ {print $2}' /proc/mounts)
            logger "/dev/$DEVICENAME zmontowano w $DIR"
            ###############################################
                tu wpisz polecenie które ma się uruchomić
            ###############################################
            ;;
        remove)
            logger "Odlaczono /dev/$DEVICENAME"
            ;;
    esac

po odmontowaniu HDD może nic nie robić

uuid dysku (partycji) /dev/sdb1: UUID="0af63730-3ba4-413f-9f2b-2a67e3e502f2" TYPE="ext4"

5

Odp: Nie działa usypianie dysku sdparm ani hd-idle

#!/bin/sh
case $ACTION in
        add)
        hdparm -S 60 /dev/$DEVICENAME
        ;;
esac

Z tym że $DEVICENAME będzie sda,sdb,sdb1,sda1 więc co najwyżej będzie błąd dla /dev/sda1 ale to możesz zignorować po prostu.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

6

Odp: Nie działa usypianie dysku sdparm ani hd-idle

dzięki,
w międzyczasie zrobiłem taki eksperyment, że w pliku rc.local wpisałem dwie linie
(sleep 60; hdparm -S 60 /dev/sda) &

(sleep 60; hdparm -S 60 /dev/sdb) &

i też działa, w sumie pendriva uśpić się nie da, wcześniej sprawdziłem to w putty ręcznie. W logach nie ma błędu.

7

Odp: Nie działa usypianie dysku sdparm ani hd-idle

Tak, jest ignorowane.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.