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"
doneDo 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.