Impedire la sospensione di un disco rigido esterno USB


12

Qualcuno sa se esiste un modo elegante per dire a un'unità USB esterna di non rallentare dopo un periodo di inattività? Ho visto soluzioni basate su cron che scrivono un file ogni minuto, ma nulla che profuma di bella eleganza unixey. Ci deve essere un comando hdparm o scsi che posso inviare (alle unità USB si accede tramite il driver sd in OpenBSD) all'unità per dirgli di non dormire. Temo che questa sia probabilmente una funzionalità integrata nel controller nell'involucro e come tale non molto può cambiarlo a parte strappare l'unità dal suo involucro e lanciarlo direttamente nella macchina, ma ho pensato che avrei chiesto, nella remota ipotesi.

Idealmente, sto cercando una soluzione OpenBSD, ma so che ce ne sono altri là fuori con lo stesso problema, quindi qualsiasi soluzione sarà considerata per la risposta.


1
Sono solo curioso di sapere perché non vuoi che l'unità si spenga.
Tshepang,

1
Bene, per il momento, è perché ho quell'unità montata tramite NFS su un'altra macchina, e se avvio la macchina # 2 mentre l'unità è spenta, si verifica il timeout e la partizione NFS non si monta.
gabe.

1
Non far girare l'unità può ridurne la durata. Considererei invece di risolvere il problema del timeout. Ho avuto un problema simile in precedenza con un NAS di backup e l'utilizzo di un automounter (come autofs) mi ha assicurato che il sistema non si sarebbe verificato il timeout e avrebbe fatto girare i dischi solo se si accedeva al mountpoint (e si montava automaticamente).
unode

Risposte:


4

Sì, è generalmente integrato nel firmware. Alcuni produttori di unità forniscono uno strumento di gestione basato su MS Windows che consente di modificare vari parametri, tra cui la disattivazione del "sleep" o il timer di spegnimento. Se hai accesso a una finestra di Windows, potrebbe valerne la pena perseguire questo punto di vista.


8

Solo i miei 2 centesimi ...

È più che vero che la rotazione dei dischi ne riduce la durata. Anni di esperienza hanno dimostrato che l'avvio e l'arresto del motore del disco causano molta più fatica rispetto alla rotazione 24/7. Tutti i miei dischi con un elevato numero di start / stop hanno settori riallocati e tutti i miei dischi che girano 10 anni 24/7 sono (che ci crediate o no) come nuovi. Dopotutto, i dischi sono fatti per girare non per il minimo, quindi se la tua priorità è meno fatica del consumo energetico, sentiti libero di far girare i dischi 24/7.

Ho un disco esterno da 2 TB che si gira dopo 30 minuti di inattività. Il disco deve essere alimentato 24 ore su 24, 7 giorni su 7, per eseguire il backup e agire come un piccolo NAS collegato a un Orange PI.

Ho usato la seguente regola udev in

/etc/udev/rules.d

(Non ha mai funzionato poiché lo spin-down è nel firmware dei dischi)

SUBSYSTEM=="usb", TEST=="power/autosuspend" ATTR{power/autosuspend}="-1"

Sebbene il disco supporti il

hdparm -B

Ho scritto un piccolo processo daemon che può essere eseguito all'avvio in

/etc/rc.local

che scrive 10 volte in cicli la data e l'ora correnti in un file di registro in modo che il disco sia sempre acceso. Sentiti libero di modificare come preferisci.

Le opzioni della riga di comando sono: la directory di destinazione per scrivere awake.log e (facoltativamente) il ritardo (valore predefinito 300)

per esempio

/usr/sbin/disk_awake /mnt/some_disk/keep_alive 30

il codice: (puoi compilare con gcc)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <time.h>

int main(int argc, char* argv[])
{
FILE *fp=NULL;
pid_t process_id=0;
pid_t sid=0;
int secs=300;
char log_file[512];
time_t raw_time;
struct tm *time_info;
int ticks=0;
unsigned long step=1;

if (argc<2||argc>3)
{
 printf("Usage: %s target_directory [seconds]\n",argv[0]);
 exit(1);
}
if (strlen(argv[1])>500)
{
 printf("String length of target_directory is HUGE!\n");
 exit(1);
}
if (chdir(argv[1])<0)
{
 printf("Directory %s does not exist\n",argv[1]);
 exit(1);
}
strcpy(log_file,argv[1]);
strcat(log_file,"/awake.log");
if (!(fp=fopen(log_file,"w+")))
{
 printf("Could not open log file %s\n",log_file);
 exit(1);
}
if (!(argv[2]))
{
 printf("Delay argument not specified. Defaulting to 300 seconds\n");
 secs=300;
}
if (argv[2]&&(secs=atoi(argv[2]))<=0)
{
 printf("Could not parse delay option. Defaulting to 300 seconds\n");
 secs=300;
}
printf("Delay interval %d seconds\n",secs);
process_id=fork();
if (process_id<0)
{
printf("Could not fork()\n");
exit(1);
}
if (process_id>0)
{
printf("Started with pid %d\n", process_id);
exit(0);
}
umask(0);
sid=setsid();
if(sid<0)
{
printf("Could not setsid()\n");
exit(1);
}
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
while (1)
{
if (ticks==10)
{
 fclose(fp);
 if (!(fp=fopen(log_file,"w+"))) exit(1);
 ticks=0;step++;
}
time(&raw_time);
time_info=localtime(&raw_time);
fprintf(fp,"%s %lu : %s","Step",step,asctime(time_info));
fflush(fp);
ticks++;
sleep(secs);
}
fclose(fp);
return(0);
}

6
Perché la necessità di un programma speciale (C)? Perché non solo un lavoro cron ... `* / 15 * * * * date> / mnt / disk / .date`
Stephen Blott,

Sto eseguendo un Lenovo T470p, un'unità USB esterna con un alloggiamento USB orico. Sto eseguendo l'avvio da USB, non appena si avvia lo standby, il dispositivo va letto solo al risveglio. La configurazione di udev.d ha risolto il problema per me.
thst

6

Questa soluzione (per Linux) di http://www.arrfab.net/blog/?p=107 ha contribuito a un'unità Seagate Portable da 1 TB che ha continuato a dormire:

# sdparm --clear=STANDBY /dev/sdc -S

L'unità ora risponde immediatamente anche se lasciata inattiva per un'ora. Tuttavia, non ho ancora verificato se l'impostazione è stata salvata al riavvio, ecc.


qualche consiglio su come farlo senza sudo?
Aquarius Power il

Credo che il link sia cambiato in: arrfab.net/posts/2009/Jan/30/…
esm,

4

Ho scoperto che il seguente cronjob funziona per me.

* / 5 * * * * / bin / touch / dev / sdb &> / dev / null

Ovviamente aggiornalo con il nome del dispositivo del tuo disco.

Puoi anche variare il tempo in base al tempo di inattività dell'unità prima che si spenga.


2

Il manuale per Linuxhdparm fornisce le seguenti informazioni:

-B  Query/set Advanced Power Management feature,
    if the drive supports it.
    A low value means aggressive  power  management
    and a high value means better performance.

    Possible settings range
    from values 1 through  127  (which  permit spin-down),
    and values 128 through 254 (which do not permit spin-down).

    The highest degree of  power  management
    is attained with a setting of 1,
    and the highest I/O performance with a setting of 254.

    A  value  of  255  tells hdparm to
    disable Advanced Power Management altogether on the drive
    (not all drives support disabling it, but  most do).

Detto questo, non è ancora garantito che il contenitore dell'unità supporti l'inoltro di queste istruzioni all'unità. Lo stesso riferimento menziona il fatto che poter usare hdparm con un enclosure è possibile solo con alcuni modelli "più recenti (2008 e successivi)" che supportano il sistema di traduzione dei comandi SCSI-ATA, noto anche come "SAT". Devo ancora provare a farlo su qualsiasi cosa tranne una recente unità di backup economica, un modello HP SimpleSave. Sembra fornire alcune funzionalità limitate di gestione dell'alimentazione.

E ovviamente questo presuppone anche che OpenBSD funzioni hdparmallo stesso modo. Non sono affatto informato sui modi di OpenBSD, quindi non posso aiutarti.


1
L'equivalente OpenBSD di hdparm è atactl. Ma non so se funziona su dispositivi USB; atactl(8)fa riferimento a wd(4)(la pagina man del driver del disco IDE) ma non a umass(4)(la pagina man del driver della memoria USB).
Gilles 'SO- smetti di essere malvagio' il

Giocherò con questo, anche se poiché le unità USB si montano usando i dispositivi / dev / sd *, non sono sicuro che si applichino wd e atactl. Tempo di leggere / giocare.
gabe.

pensi che hdparmpotrebbe essere usato in un ciclo in qualche modo senza sudo per evitare di dormire?
Aquarius Power il

Conosci hdparamil valore predefinito per -B [apm_setting]?
jyz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.