Automatické uspanie USB disku na Raspberry Pi

Pevné disky majú v sebe možnosť úsporného režimu (standby mode). Disk sa pri prechode do tohto režimu akoby uspí – zastaví otáčanie kotúčikov vo vnútri disku, čo zvyčajne spoznáte podľa toho, že disk stíchne. Disk je však stále aktívne pripojený do systému, t.j. v prípade, ak je z neho potrebné dáta čítať, alebo naň dáta zapisovať, opätovne sa naštartuje. Reakcia systému je však vtedy o čosi dlhšia ako zvyčajne, lebo nabehnutie otáčok disku na prevádzkovú rýchlosť trvá cca 2 sekundy.

Je takéto nastavenie dobré pre samotný disk a komu tým vlastne prospejeme? Musíme si uvedomiť, že disk má v podstate 2 prirodzené stavy: vypnutý (kedy jeho motorček stojí) a pracujúci (kedy sa kotúčiky v jeho vnútri otáčajú).

  • Prechod z vypnutého stavu do stavu pracujúceho znamená pre motorček disku a aj samotný disk „stres“ a námahu. Mali by sme sa preto vyhnúť zbytočnému vypínaniu a opätovnému zapínaniu otáčok motorčeka disku.
  • Na druhú stranu tým, že sa disk neustále otáča, dochádza k jeho opotrebovaniu. Preto výrobcovia diskov vyrábajú pevné disky od lacných – do stolných počítačov, s prevádzkovou dobou pár hodín denne; až po drahé – do kamerových záznamových zariadení alebo serverov, s možnosťou prevádzky 24/7. (Zrozumiteľné členenie používa napríklad Western Digital – disky značí farebne od modrej až po zlatú).

Určenie vhodného spindown času

Snaha o optimalizáciu prevádzky disku by teda mala balansovať medzi šetrením disku, ak sa dlhšiu dobu nepoužíva vs. jeho častým odpájaním a zapínaním, čo by mohlo naopak disk poškodiť. Samozrejme všetko záleží od účelu použitia.

Môj Raspberry NAS používam najmä na zálohovanie dát z PC a občas z neho prehrávam filmy na smart TV. Využitie jeho pevného disku teda nie je príliš časté, no ak ho už potrebujem, používam ho vtedy súvisle. To znamená, že napríklad naň zálohujem fotografie z foťáku, čo trvá povedzme 15 minút, následne sa môže disk opäť odpojiť. Môžem si preto dovoliť nastaviť relatívne krátky čas prechodu do standby módu – 10 minút.

Ak by sa disk používal častejšie, sporadicky, viacerými používateľmi, nárazovo, respektíve často ale v krátkych časových intervaloch, je lepšie nastaviť dlhšiu dobu – povedzme 30 minút. To zaručí, že v noci keď NASko nikto nepoužíva a disk nie je potrebný tento bude spať, no naopak cez deň počas používania nebude stále „cvičiť“ hore – dole.

Čo budeme potrebovať

  • Raspberry Pi s pripojeným USB diskom. Ak neviete ako na to odporúčam postup publikovaný v jednom z predchádzajúcich návodov: Pripojenie USB disku na Raspberry Pi.
  • Linuxový program, ktorým je možné ovládať hibernovanie disku (avšak aj mnohé iné parametre) sa volá hdparm. Našťastie pre Raspberry existuje aj jeho balíčková verzia, ktorú stačí nainštalovať.

Inštalácia hdparm

Ako obyčajne, najprv aktualizujeme systém a potom v tesnom závese inštalujeme:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install hdparm

Prvé pokusy ovládať disk

Ako prvé musíme zistiť označenie, pod ktorým je náš USB disk pripojený – ak máte iba jeden, na 99% to bude „sda“. Ale tak aspoň zistíme, či náš disk vôbec žije:

pi@NASKO:~ $ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0  1.8T  0 disk
└─sda1        8:1    0  1.8T  0 part /mnt/data1
mmcblk0     179:0    0 28.9G  0 disk
├─mmcblk0p1 179:1    0 42.9M  0 part /boot
└─mmcblk0p2 179:2    0 28.9G  0 part /

V druhom kroku vyskúšame pomocou hdparm načítať informácie o našom disku. Mali by ste dostať dlhý výpis parametrov disku a podporovaných funkcií:

sudo hdparm -I /dev/sda

V treťom kroku zistíme, či utilita hdparm skutočne aj dokáže ovládať hibernáciu nášho aktuálne pripojeného disku. Príkaz hdparm -C /dev/sda by mal vrátiť jeho aktuálny stav z pohľadu power módu – active/idle (normálna prevádzka), standby (úsporný režim, zastavené otáčky), alebo sleeping (disk je kompletne vypnutý, dá sa zapnúť iba znovupripojením na USB alebo reštartom Raspberry).

Ak však uvidíte hlášku drive state is: unknown – máte problém! Váš disk nepodporuje nastavenie standby prostredníctvom hdparm. Zvyčajne odmietajú spolupracovať disky Western Digital. V tomto prípade máte tri možnosti – kúpte si iný disk, vyskúšajte utilitu hd-idle, alebo smartmontools. (Návod na ich použitie je žiaľ nad rámec tohto článku.)

pi@NASKO:~ $ sudo hdparm -C /dev/sda

/dev/sda:
SG_IO: bad/missing sense data, sb[]:  f0 00 01 00 50 40 00 0a 00 00 00 00 00 1d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 drive state is:  unknown

V mojom prípade som disk pekne krásne zabalil, odniesol späť do Alzy a hneď si tam aj vyzdvihol iný disk značky Seagate. A tu je výsledok – wau, zdá sa, že tento disk sa s nami bude kamarátiť!

pi@NASKO:~ $ sudo hdparm -C /dev/sda

/dev/sda:
 drive state is:  active/idle

Ako vidíte, disk je aktuálne v prevádzke. Skúsime ho teda teraz manuálne uviesť do úsporného režimu. Na to použijeme príkaz hdparm -y /dev/sda

pi@NASKO:~ $ sudo hdparm -y /dev/sda

/dev/sda:
 issuing standby command

Disk odpovedal, že príkaz standby vykonal. Či je tomu skutočne tak zistíme opätovne príkazom hdparm -C /dev/sda

pi@NASKO:~ $ sudo hdparm -C /dev/sda

/dev/sda:
 drive state is:  standby

Trikrát hurá! Disk nám pekne spinká. Môžete si to overiť aj tak, že k nemu priložíte ucho – disk by mal byť úplne tichý, teda nemali by ste počuť žiadne otáčky motorčeka. Na tomto mieste ešte malá poznámka – akonáhle na disk niekto/niečo opäť pristúpi, disk sa naštartuje. Takže pri pokusoch musíte zabezpečiť, aby žiadny iný používateľ disk práve nepoužíval (napr. po sieti). Avšak nebuďte prekvapení, že disk (občas) hneď po uspaní aj tak opäť zobudí nejaký proces bežiaci na pozadí alebo samotný operačný systém.

Konfigurácia hdparm

Našou snahou bude teraz nastaviť, aby disk uspal po 10 minútach nečinnosti a toto nastavenie nám ostalo aj po reštarte RPi. To docielime zápisom správnych údajov do konfiguračného súboru /etc/hdparm.conf

sudo nano /etc/hdparm.conf

Konfiguračný súbor necháme ako je, len na jeho koniec pridáme nasledovný zápis:

# ========== NASKO by Gendzo Macher ============
/dev/disk/by-id/ata-ST4000LM024-2AN17V_WCK37PMS {
    spindown_time = 120
}

Všimnite si ten dlhý reťazec začínajúci „ata-“ za /dev/disk/by-id/. Je to označenie disku, ktoré si musíte nahradiť vašim vlastným. Zistite ho jednoducho, napríklad výpisom cez príkaz ls -la /dev/disk/by-id

Druhá poznámka sa týka hodnoty spindown_time. Údaj nie sú priamo sekundy! K sekundám sa dostanete nasledovným prepočtom:

  • Hodnoty od 1 do 240 sa násobia x 5 sekúnd; spindown_time = 120 znamená 600 sekúnd = 10 minút.
  • Hodnoty od 241 do 251 sa prepočítavajú vzorcom (spindown_time – 240) x 30 minút; čiže napríklad 242 znamená 2 x 30 = 60 minút.
  • Ostatné hodnoty nie sú pre nás zaujímavé, v prípade potreby ich ale nájdete v manuáloch k hdparm pod prepínačom -S.

Aby náš konfiguračný súbor vstúpil do platnosti, je potrebné ho uložiť a reštartovať Raspberry – sudo reboot.

Teraz by sa už náš disk mal správať tak, že v prípade nečinnosti > 10 minút zaspí. To si môžete overiť jednak voľným ucho tak, že sa započúvate či sa točí motorček, alebo už známym príkazom hdparm -C /dev/sda.

Problém so Seagate diskom

Doplnené neskôr 12/2019: Myslel som si, že ak vymením disk WD, ktorý odmietal spolupracovať s príkazom hdparm za iný disk značky Seagate, mám vymaľované. Aj som teda mal, ale iba do času, kým som neprešiel z RPi3, na ktorom som mal ešte starší Raspbian Stretch na -> RPi4 Raspbian Buster. Buster má totiž nové jadro, ktoré používa na ovládanie diskov novší driver označovaný ako „UAS“. Avšak z dôvodu nie príliš dobrej kompatibility diskov Seagate v rámci tohto driveru plošne pre všetky disky Seagate (!) zakázali priamy prenos SAT ATA príkazov. A tak hibernácia disku Seagate s prechodom na Buster prestala fungovať. Milujem tento linuxový svet… 🙁 Viac o probléme sa môžete dočítať tu: SAT with UAS Linux.

Riešenie tohto problému je možné dvomi spôsobmi: 1. používať starší „BOT“ driver, alebo 2. dohovoriť kernelu aby neblbol. Ja som si pokusne zvolil možnosť číslo 2 – uvidíme, či bude disk fungovať bez problémov.

Návod (bez záruky): Najprv je potrebné zistiť ID výrobcu nášho disku a ID zariadenia. To spravíme príkazom lsusb:

pi@NASKO:~ $ lsusb
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 0bc2:ab28 Seagate RSS LLC
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Informácia, ktorú hľadáme sa sú tie dva reťazce oddelené dvojbodkou pred nápisom Seagate – v mojom prípade teda 0bc2:ab28. Otvorte si teraz súbor /boot/cmdline.txt a vložte do neho nasledovný konfiguračný príkaz. Použite svoje ID:ID. Nezabudnite na dvojbodku na konci, má tam byť!

usb_storage.quirks=0bc2:ab28:

To je všetko, reštartujte RPi a opäť vyskúšajte príkaz hdparm -C /dev/sda – mal by vrátiť odpoveď bez chybových hlášok okolo.


Tento návod bol úspešne testovaný na Raspberry Pi3 model B+ 64-bit 1GB RAM a tiež aj na Raspberry Pi4 model B 64-bit 4GB RAM. Naposledy testované na verzii Raspbian GNU/Linux 10 (buster), kernel: Linux 4.19.75-v7l+


Gendzo

Cez deň pracujem ako IT manažéris. Po nociach robím vlastné web stránky a píšem články. Rád varím, cestujem a lúštim hlavolamy. Vo voľnom čase cvičím power jogu, čítam knihy a hľadám geokešky. A som šťastný majiteľ jednej skvelej manželky a dvoch detí k tomu. www.gendzo.sk/autor/gendzo-macher

1 odpoveď

  1. 22.12.2019

    […] Úsporný režim USB disku – Automatické uspanie USB disku na Raspberry Pi. […]

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *

Táto webová stránka používa Akismet na redukciu spamu. Získajte viac informácií o tom, ako sú vaše údaje z komentárov spracovávané.