Impedir que um disco rígido externo USB durma

12

Alguém sabe se existe uma maneira elegante de dizer a um drive USB externo para não girar após um período de inatividade? Eu vi soluções baseadas em cron que escrevem um arquivo a cada minuto, mas nada que cheira a elegância unixey agradável. Deve haver um comando hdparm ou scsi que eu possa emitir (as unidades USB são acessadas através do driver sd no OpenBSD) na unidade para dizer para não dormir. Receio que esse seja provavelmente um recurso embutido no controlador no gabinete e, como tal, pouco pode mudá-lo, além de arrancar a unidade do gabinete e colocá-lo diretamente na máquina, mas imaginei que perguntaria: na chance.

Idealmente, estou procurando uma solução OpenBSD, mas sei que existem outras por aí com o mesmo problema, portanto, qualquer solução será considerada como resposta.

Gabe.
fonte
1
Só estou curioso por que você não quer que a unidade diminua.
tshepang
1
Bem, no momento, é porque eu tenho essa unidade montada via NFS em outra máquina, e se eu inicializar a máquina # 2 enquanto a unidade estiver desativada, o tempo limite será excedido e a partição NFS não será montada.
Gabe.
1
Não deixar a unidade girar para baixo pode reduzir sua vida útil. Eu consideraria abordar a questão do tempo limite. Eu tive um problema semelhante antes com um NAS de backup e o uso de um montador automático (como autofs) garantiu que o sistema não atingisse o tempo limite e apenas girasse os discos se o ponto de montagem fosse acessado (e montado automaticamente).
unode 16/02/12

Respostas:

4

Sim, geralmente está embutido no firmware. Alguns fabricantes de unidades fornecem uma ferramenta de gerenciamento baseada no MS Windows que permite modificar vários parâmetros, incluindo a desativação do timer "inativo" ou "down". Se você tiver acesso a uma caixa do Windows, pode valer a pena seguir esse ângulo.

mazianni
fonte
7

Apenas meus 2 centavos ...

É mais do que verdade que girar os discos diminui sua vida útil. Anos de experiência mostraram que iniciar e parar o motor do disco causa muito mais fadiga do que girar 24 horas por dia, 7 dias por semana. Todos os meus discos com grande número de start / stop realocam setores e todos os meus discos que rodam 10 anos 24/7 são (acredite ou não) bons como novos. Afinal, os discos são feitos para girar e não para marcha lenta, portanto, se sua prioridade é menos fadiga do que o consumo de energia, sinta-se à vontade para que seus discos girem 24/7.

Eu tenho um disco externo de 2 TB que gira após 30 minutos de inatividade. O disco deve ser ligado 24 horas por dia, sete 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

(Ele nunca funcionou, pois 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 no

/etc/rc.local

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

As opções da linha de comando são: o diretório de destino para gravar awake.log e (opcionalmente) o atraso (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);
}
Erebus
fonte
5
Por que a necessidade de um programa especial (C)? Por que não apenas um trabalho Cron ... `* / 15 * * * * date> / mnt / disk / .date` #
Stephen Blott
Estou executando uma unidade USB externa Lenovo T470p com uma caixa USB orico. Estou inicializando a partir do USB, assim que o modo de espera é iniciado, o dispositivo é lido somente na ativação. A configuração do udev.d corrigiu o problema para mim.
thst
6

Esta solução (para Linux) de http://www.arrfab.net/blog/?p=107 ajudou a uma unidade Seagate Portable de 1 TB que continuava em suspensão:

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

oliver
fonte
alguma dica sobre como fazer isso sem sudo?
Aquário Potência
Eu acredito que o link foi alterado para: arrfab.net/posts/2009/Jan/30/…
esm 13/10/10
4

Eu descobri que o seguinte cronjob funciona para mim.

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

Obviamente, atualize-o com o nome do dispositivo do seu disco.

Você também pode variar o tempo com base em quanto tempo sua unidade fica ociosa antes de desligar.

Steven
fonte
2

O manual para o linuxhdparm 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 suporte a retransmissão dessas instruções para a unidade. A mesma referência menciona que a capacidade de usar o hdparm com um gabinete apenas é possível com certos modelos "mais recentes (2008 e posteriores)" que suportam o sistema de tradução de comandos SCSI-ATA, também conhecido como "SAT". Ainda não tentei fazer isso em nada além de uma recente unidade de backup barata, um modelo HP SimpleSave. Parece fornecer algumas funcionalidades limitadas de gerenciamento de energia.

E é claro que isso também pressupõe que o OpenBSD hdparmfuncione da mesma maneira. Não conheço nada do OpenBSD, então não posso ajudá-lo por lá.

intuído
fonte
1
O equivalente do hdparm ao OpenBSD é atactl. Mas não sei se funciona em dispositivos USB; atactl(8)é referenciado por wd(4)(a página do manual do driver de disco IDE), mas não por umass(4)(a página do manual do driver de armazenamento USB).
Gilles 'SO- stop be evil'
Vou brincar com isso, embora, como as unidades USB sejam montadas usando os dispositivos / dev / sd *, não tenho certeza se wd e atactl se aplicam. Hora de ler / tocar.
Gabe.
você acha que hdparmpoderia ser usado em um loop de alguma forma sem o sudo para evitar dormir?
Aquarius Power
Você conhece hdparamo valor padrão para -B [apm_setting]?
JYZ