Evite que um disco rígido externo USB entre em suspensão

9

Alguém sabe se existe uma maneira elegante de dizer a um drive USB externo para não desligar depois de um período de inatividade? Eu vi soluções baseadas em cron que escrevem um arquivo a cada minuto, mas nada que cheire a elegância unixey agradável. Deve haver um comando hdparm, ou scsi, que eu possa emitir (unidades usb são acessadas através do driver sd no OpenBSD) para a unidade, para que ele não durma. Eu tenho medo que este seja provavelmente um recurso embutido no controlador no gabinete, e como tal não muito pode mudá-lo além de extrair a unidade de seu gabinete e colocá-la diretamente na máquina, mas imaginei que gostaria de perguntar, na chance.

O ideal é que eu esteja procurando uma solução OpenBSD, mas sei que existem outras por aí com o mesmo problema, então quaisquer soluções serão consideradas para a resposta.

    
por gabe. 29.12.2010 / 06:50

4 respostas

3

Sim, geralmente é incorporado ao firmware. Alguns fabricantes de inversores fornecem uma ferramenta de gerenciamento baseada no MS Windows que permite modificar vários parâmetros, incluindo a desativação do cronômetro de "suspensão" ou "desativação". Se você tiver acesso a uma caixa do Windows, talvez valha a pena perseguir esse ângulo.

    
por 29.12.2010 / 17:42
4

Esta solução (para Linux) do link ajudou em uma unidade portátil de 1TB da Seagate que continuou dormir:

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

A unidade agora responde imediatamente mesmo quando fica ociosa por uma hora. Ainda não testou se a configuração é salva nas reinicializações, etc.

    
por 30.11.2011 / 14:31
4

Apenas meus 2 centavos ...

É mais do que verdade que a desativação dos discos diminui sua vida útil. Anos de experiência mostraram que a partida e a parada do motor do disco causam muito mais fadiga do que a rotação 24 horas por dia, 7 dias por semana. Todos os meus discos com grande start / stop count têm realocados setores e todos os meus discos que giram 10 anos 24/7 são (acredite ou não) bom como novo. Afinal, os discos são feitos para girar, não para inativo, por isso, se a sua prioridade é menos fadiga do que o consumo de energia, sinta-se à vontade para fazer seus discos girar 24 horas por dia.

Eu tenho um disco externo de 2TB que desacelera após 30 minutos de inatividade. O disco deve ser ligado 24 horas por dia, 7 dias por semana, para fins de backup e atuando como um pequeno NAS conectado a um PI laranja.

Eu usei a seguinte regra do udev em

/etc/udev/rules.d

(Nunca funcionou como o spin down está no firmware dos discos)

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

Embora o disco suporte o

hdparm -B

Eu escrevi um pequeno processo daemon que pode ser executado no momento da inicialização

/etc/rc.local

que grava 10 vezes nos ciclos a data e hora atuais em um arquivo de log para que o disco esteja sempre ligado. Sinta-se à vontade para modificar como quiser.

As opções de linha de comando são: o diretório de destino para gravar awake.log e (opcionalmente) o atraso de tempo (padrão 300)

por exemplo,

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

o código: (você pode compilar com o 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);
}
    
por 10.07.2016 / 13:39
2

O manual para o linux hdparm fornece as seguintes informações:

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

Dito isto, ainda não é garantido que o gabinete da unidade suportará a transmissão dessas instruções para a unidade. A mesma referência menciona que ser capaz de usar o hdparm com um gabinete é possível apenas com certos modelos "mais novos (2008 e posteriores)" que suportam o sistema de tradução de comandos SCSI-ATA, conhecido como "SAT". Eu ainda tenho que tentar fazer isso em qualquer coisa que não seja uma unidade de backup barata recente, um modelo HP SimpleSave. Parece fornecer algumas funcionalidades limitadas de gerenciamento de energia.

E, claro, isso também pressupõe que o hdparm do OpenBSD funciona da mesma maneira. Eu não sou de todo conhecedor das formas do OpenBSD, então eu não posso te ajudar lá.

    
por 04.01.2011 / 08:37