Empêcher un disque dur externe USB de dormir

12

Est-ce que quelqu'un sait s'il existe un moyen élégant de dire à un lecteur USB externe de ne pas tomber en panne après une période d'inactivité? J'ai vu des solutions basées sur cron qui écrivent un fichier toutes les minutes, mais rien qui sent la belle élégance unixey. Il doit y avoir une commande hdparm ou scsi que je peux émettre (les lecteurs USB sont accessibles via le pilote sd dans OpenBSD) au lecteur pour lui dire de ne pas dormir. J'ai peur que ce soit probablement une fonctionnalité intégrée au contrôleur dans le boîtier, et en tant que tel, peu de choses peuvent le changer en dehors de l'extraction du lecteur de son boîtier et de le placer directement dans la machine, mais j'ai pensé que je demanderais, à tout hasard.

Idéalement, je recherche une solution OpenBSD, mais je sais qu'il y en a d'autres avec le même problème, donc toutes les solutions seront considérées pour la réponse.

gabe.
la source
1
Je suis simplement curieux de savoir pourquoi vous ne voulez pas que le lecteur ralentisse.
tshepang
1
Eh bien, pour le moment, c'est parce que j'ai ce lecteur monté via NFS sur une autre machine, et si je démarre la machine n ° 2 pendant que le lecteur est arrêté, il expire et la partition NFS ne monte pas.
gabe.
1
Ne pas laisser le disque tourner peut réduire sa durée de vie. J'envisagerais plutôt d'aborder la question des délais J'ai eu un problème similaire auparavant avec un NAS de sauvegarde et l'utilisation d'un monteur automatique (comme les autofs) a assuré que le système ne temporiserait pas et ne tournerait les disques que si le point de montage est accédé (et monté automatiquement).
unode le

Réponses:

4

Oui, il est généralement intégré au firmware. Certains fabricants de disques fournissent un outil de gestion basé sur MS Windows qui vous permettra de modifier divers paramètres, y compris la désactivation de la minuterie de veille ou de ralentissement. Si vous avez accès à une boîte Windows, il vaut peut-être la peine de poursuivre cet angle.

mazianni
la source
7

Juste mes 2 cents ...

Il est plus que vrai que la rotation des disques diminue leur durée de vie. Des années d'expérience ont montré que le démarrage et l'arrêt du moteur à disque provoquent beaucoup plus de fatigue qu'un essorage 24/7. Tous mes disques avec un grand nombre de démarrages / arrêts ont des secteurs réalloués et tous mes disques qui tournent 10 ans 24/7 sont (croyez-le ou non) comme neufs. Après tout, les disques sont faits pour tourner et non pour tourner au ralenti, donc si votre priorité est moins de fatigue que la consommation d'énergie, n'hésitez pas à faire tourner vos disques 24/7.

J'ai un disque externe de 2 To qui tourne après 30 minutes d'inactivité. Le disque est censé être allumé 24h / 24 et 7j / 7 à des fins de sauvegarde et agir comme un petit NAS connecté à un Orange PI.

J'ai utilisé la règle udev suivante dans

/etc/udev/rules.d

(Cela n'a jamais fonctionné car le spin down est dans le firmware des disques)

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

Bien que le disque prenne en charge

hdparm -B

J'ai écrit un petit processus démon qui peut s'exécuter au démarrage

/etc/rc.local

qui écrit 10 fois dans des cicles la date et l'heure actuelles dans un fichier journal afin que le disque soit toujours allumé. N'hésitez pas à modifier à votre guise.

Les options de ligne de commande sont: le répertoire cible pour écrire awake.log et (éventuellement) le délai (300 par défaut)

par exemple

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

le code: (vous pouvez compiler avec 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
la source
5
Pourquoi le besoin d'un programme spécial (C)? Pourquoi pas juste un travail cron ... `* / 15 * * * * date> / mnt / disk / .date`
Stephen Blott
J'utilise un lecteur USB externe Lenovo T470p avec un boîtier USB orico. Je démarre à partir de l'USB, dès que la veille démarre, l'appareil passe en lecture seule au réveil. La configuration udev.d a résolu le problème pour moi.
thst
6

Cette solution (pour Linux) de http://www.arrfab.net/blog/?p=107 a aidé pour un disque Seagate Portable de 1 To qui continuait de dormir:

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

Le lecteur est maintenant immédiatement réactif même lorsqu'il est laissé inactif pendant une heure. Cependant, je n'ai pas encore testé si le paramètre est enregistré lors des redémarrages, etc.

oliver
la source
une astuce pour le faire sans sudo?
Aquarius Power
Je crois que le lien a changé pour: arrfab.net/posts/2009/Jan/30/…
esm
4

J'ai trouvé que le cronjob suivant fonctionne pour moi.

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

Évidemment, mettez-le à jour avec le nom de périphérique de votre disque.

Vous pouvez également faire varier le temps en fonction de la durée pendant laquelle votre disque est inactif avant de s'éteindre.

Steven
la source
2

Le manuel pour Linuxhdparm fournit les informations suivantes:

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

Cela étant dit, il n'est toujours pas garanti que votre boîtier de disque prend en charge le relais de ces instructions vers le disque. La même référence mentionne que la possibilité d'utiliser hdparm avec un boîtier n'est possible qu'avec certains modèles "plus récents (2008 et versions ultérieures)" qui prennent en charge le système de traduction de commandes SCSI-ATA, également appelé "SAT". Je n'ai pas encore essayé de le faire sur autre chose qu'un disque de sauvegarde bon marché récent, un modèle HP SimpleSave. Il semble offrir une fonctionnalité de gestion de l'alimentation limitée.

Et bien sûr, cela suppose également que OpenBSD hdparmfonctionne de la même manière. Je ne connais pas du tout OpenBSD, je ne peux donc pas vous aider.

intuition
la source
1
L'équivalent OpenBSD de hdparm est atactl. Mais je ne sais pas si cela fonctionne sur les périphériques USB; atactl(8)est référencé par wd(4)(la page de manuel du pilote de disque IDE) mais pas par umass(4)(la page de manuel du pilote de stockage USB).
Gilles 'SO- arrête d'être méchant'
Je vais jouer avec cela, bien que puisque les lecteurs USB se montent à l'aide des périphériques / dev / sd *, je ne suis pas sûr que wd et atactl s'appliquent. Il est temps de lire / jouer.
gabe.
pensez-vous hdparmpourrait être utilisé dans une boucle d'une manière ou d'une autre sans sudo pour éviter de dormir?
Aquarius Power
Connaissez-vous la hdparamvaleur par défaut pour -B [apm_setting]?
jyz