Evitar que un disco duro externo USB duerma

12

¿Alguien sabe si hay una manera elegante de decirle a una unidad USB externa que no se dañe después de un período de inactividad? He visto soluciones basadas en cron que escriben un archivo cada minuto, pero nada que huele a agradable elegancia unixey. Debe haber un comando hdparm o scsi que pueda emitir (se accede a las unidades usb a través del controlador sd en OpenBSD) a la unidad para decirle que no duerma. Me temo que esta es probablemente una característica integrada en el controlador en el gabinete, y como tal, no puede cambiarlo, aparte de extraer el disco de su gabinete y colocarlo directamente en la máquina, pero pensé que preguntaría, en la casualidad.

Idealmente, estoy buscando una solución de OpenBSD, pero sé que hay otros por ahí con el mismo problema, por lo que cualquier solución será considerada para la respuesta.

gabe
fuente
1
Tengo curiosidad por saber por qué no quieres que el disco gire hacia abajo.
tshepang
1
Bueno, por el momento, es porque tengo esa unidad montada a través de NFS en otra máquina, y si arranco la máquina # 2 mientras la unidad está rota, se agota el tiempo y la partición NFS no se monta.
Gabe.
1
No dejar que la unidad gire hacia abajo puede reducir su vida útil. Consideraría abordar el problema del tiempo de espera en su lugar. Tuve un problema similar antes con un NAS de respaldo y el uso de un montador automático (como autofs) me aseguró de que el sistema no agotaría el tiempo de espera y solo haría girar los discos si se accede al punto de montaje (y se monta automáticamente).
Unode

Respuestas:

4

Sí, generalmente está integrado en el firmware. Algunos fabricantes de unidades proporcionan una herramienta de administración basada en MS Windows que le permitirá modificar varios parámetros, incluida la desactivación del temporizador de "suspensión" o desactivación. Si tiene acceso a un cuadro de Windows, puede valer la pena seguir ese ángulo.

mazianni
fuente
7

Solo mis 2 centavos ...

Es más que cierto que girar los discos disminuye su vida útil. Años de experiencia han demostrado que arrancar y detener el motor del disco causa mucha más fatiga que el giro 24/7. Todos mis discos con gran número de inicio / parada tienen sectores reasignados y todos mis discos que giran 10 años 24/7 están (lo creas o no) como nuevos. Después de todo, los discos están hechos para girar, no para ralentí, por lo que si su prioridad es menos fatiga que el consumo de energía, siéntase libre de hacer girar sus discos 24/7.

Tengo un disco externo de 2TB que gira después de 30 minutos de inactividad. El disco debe estar encendido las 24 horas, los 7 días de la semana para realizar copias de seguridad y actuar como un pequeño NAS conectado a un Orange PI.

Usé la siguiente regla de udev en

/etc/udev/rules.d

(Nunca funcionó ya que el spin-down está en el firmware de los discos)

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

Aunque el disco es compatible con

hdparm -B

Escribí un pequeño proceso de demonio que puede ejecutarse en el momento del arranque en

/etc/rc.local

que escribe 10 veces en ciclos la fecha y hora actuales en un archivo de registro para que el disco siempre esté encendido. Siéntase libre de modificar a su gusto.

Las opciones de línea de comando son: el directorio de destino para escribir awake.log y (opcionalmente) el retraso de tiempo (predeterminado 300)

p.ej

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

el código: (puedes compilar 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);
}
Tinieblas Eternas
fuente
55
¿Por qué la necesidad de un programa especial (C)? ¿Por qué no solo un trabajo cron ... `* / 15 * * * * date> / mnt / disk / .date`
Stephen Blott el
Estoy ejecutando un Lenovo T470p, unidad USB externa con una carcasa USB orico. Estoy arrancando desde el USB, tan pronto como se inicia el modo de espera, el dispositivo pasa a leer solo al despertar. La configuración de udev.d me solucionó el problema.
thst
6

Esta solución (para Linux) de http://www.arrfab.net/blog/?p=107 ha ayudado a una unidad portátil Seagate de 1TB que siguió durmiendo:

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

La unidad ahora responde inmediatamente incluso cuando se deja inactiva durante una hora. Sin embargo, aún no probé si la configuración se guarda en reinicios, etc.

Oliver
fuente
¿Algún consejo para hacer esto sin sudo?
Acuario Power
Creo que el enlace ha cambiado a: arrfab.net/posts/2009/Jan/30/...
ESM
4

He encontrado que el siguiente cronjob funciona para mí.

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

Obviamente actualícelo con el nombre del dispositivo de su disco.

También puede variar el tiempo según el tiempo que su unidad esté inactiva antes de que se apague.

Steven
fuente
2

El manual para Linuxhdparm proporciona la siguiente información:

-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).

Dicho esto, todavía no se garantiza que la carcasa de la unidad admitirá la transmisión de estas instrucciones a la unidad. La misma referencia menciona que poder usar hdparm con un gabinete solo es posible con ciertos modelos "más nuevos (2008 y posteriores)" que admiten el sistema de traducción de comandos SCSI-ATA, también conocido como "SAT". Todavía tengo que intentar hacer esto en otra cosa que no sea una unidad de copia de seguridad barata y reciente, un modelo HP SimpleSave. Parece proporcionar una funcionalidad limitada de administración de energía.

Y, por supuesto, esto también supone que OpenBSD hdparmfunciona de la misma manera. No conozco en absoluto las formas de OpenBSD, por lo que no puedo ayudarlo allí.

intuido
fuente
1
El equivalente de OpenBSD de hdparm es atactl. Pero no sé si funciona en dispositivos USB; atactl(8)está referenciada por wd(4)(la página del manual del controlador de disco IDE) pero no por umass(4)(la página del manual del controlador de almacenamiento USB).
Gilles 'SO- deja de ser malvado'
Voy a jugar con esto, aunque dado que las unidades usb se montan usando los dispositivos / dev / sd *, no estoy seguro de que se apliquen wd y atactl. Es hora de leer un poco / jugar.
Gabe.
¿crees que hdparmpodría usarse de alguna manera en un bucle sin sudo para evitar dormir?
Acuario Power
¿Conoces hdparamel valor predeterminado para -B [apm_setting]?
jyz