Verhindern Sie, dass eine externe USB-Festplatte in den Ruhezustand wechselt

12

Weiß jemand, ob es eine elegante Möglichkeit gibt, einem externen USB-Laufwerk zu sagen, dass es nach einer Zeit der Inaktivität nicht herunterfahren soll? Ich habe Cron-basierte Lösungen gesehen, die jede Minute eine Datei schreiben, aber nichts, was nach netter, unixey Eleganz riecht. Es muss einen Befehl hdparm oder scsi geben, den ich an das Laufwerk senden kann (auf USB-Laufwerke wird über den SD-Treiber in OpenBSD zugegriffen), damit es nicht in den Ruhezustand versetzt wird. Ich befürchte, dass dies wahrscheinlich eine Funktion ist, die in den Controller im Gehäuse integriert ist, und als solche kann nicht viel daran geändert werden, außer dass das Laufwerk aus dem Gehäuse herausgerissen und direkt in die Maschine gesteckt wird, aber ich dachte, ich würde fragen: auf die off Chance.

Idealerweise suche ich nach einer OpenBSD-Lösung, aber ich weiß, dass es andere gibt, die das gleiche Problem haben, sodass alle Lösungen für die Antwort in Betracht gezogen werden.

gabe.
quelle
1
Ich bin nur neugierig, warum Sie nicht wollen, dass der Antrieb herunterfährt.
Tshepang
1
Im Moment liegt es daran, dass ich dieses Laufwerk über NFS auf einem anderen Computer bereitgestellt habe. Wenn ich Computer Nr. 2 starte, während das Laufwerk heruntergefahren wird, tritt eine Zeitüberschreitung auf und die NFS-Partition wird nicht bereitgestellt.
gabe.
1
Wenn Sie das Laufwerk nicht herunterdrehen lassen, kann dies die Lebensdauer verkürzen. Ich würde stattdessen in Betracht ziehen, das Timeout-Problem zu beheben. Ich hatte zuvor ein ähnliches Problem mit einem Backup-NAS und die Verwendung eines Automounter (z. B. Autofs) stellte sicher, dass das System keine Zeitüberschreitung aufweist und die Festplatten nur hochfährt, wenn auf den Mountpoint zugegriffen wird (und automatisch gemountet wird).
Unode

Antworten:

4

Ja, es ist im Allgemeinen in die Firmware integriert. Einige Laufwerkshersteller bieten ein MS Windows-basiertes Verwaltungstool an, mit dem Sie verschiedene Parameter ändern können, einschließlich der Deaktivierung des "Sleep" - oder Spin-Down-Timers. Wenn Sie Zugriff auf eine Windows-Box haben, lohnt es sich möglicherweise, diesen Blickwinkel zu verfolgen.

Mazianni
quelle
7

Nur meine 2 Cent ...

Es ist mehr als wahr, dass das Herunterfahren der Festplatten deren Lebensdauer verkürzt. Jahrelange Erfahrung hat gezeigt, dass das Starten und Stoppen des Scheibenmotors weitaus ermüdender ist als das Drehen rund um die Uhr. Alle meine Festplatten mit großer Start / Stopp-Anzahl haben Sektoren neu zugewiesen, und alle meine Festplatten, die sich 10 Jahre lang rund um die Uhr drehen, sind (ob Sie es glauben oder nicht) so gut wie neu. Schließlich sind Festplatten für das Drehen und nicht für den Leerlauf ausgelegt. Wenn Ihre Priorität also weniger Ermüdung als der Stromverbrauch ist, können Sie Ihre Festplatten rund um die Uhr drehen lassen.

Ich habe eine externe 2-TB-Festplatte, die sich nach 30 Minuten Inaktivität herunterfährt. Die Festplatte soll zu Sicherungszwecken rund um die Uhr eingeschaltet sein und als kleines NAS fungieren, das an einen Orange PI angeschlossen ist.

Ich habe die folgende udev-Regel in verwendet

/etc/udev/rules.d

(Es hat nie funktioniert, da der Spin-Down in der Festplatten-Firmware erfolgt.)

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

Obwohl die Festplatte die unterstützt

hdparm -B

Ich habe einen kleinen Daemon-Prozess geschrieben, der beim Booten in ausgeführt werden kann

/etc/rc.local

Das schreibt 10-mal das aktuelle Datum und die aktuelle Uhrzeit in eine Protokolldatei, damit die Festplatte immer eingeschaltet ist. Fühlen Sie sich frei, zu ändern, wie Sie möchten.

Befehlszeilenoptionen sind: das Zielverzeichnis zum Schreiben von awake.log und (optional) die Zeitverzögerung (Standard 300)

z.B

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

der Code: (Sie können mit gcc kompilieren)

#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
quelle
5
Warum braucht man ein spezielles (C) Programm? Warum nicht einfach einen Cron-Job ... `* / 15 * * * * Datum> / mnt / disk / .date`
Stephen Blott
Ich verwende ein externes USB-Laufwerk Lenovo T470p mit einem orico USB-Gehäuse. Ich boote vom USB-Stick. Sobald der Standby-Modus startet, wird das Gerät beim Aufwecken schreibgeschützt. Die udev.d-Konfiguration hat das Problem für mich behoben.
21.
6

Diese Lösung (für Linux) von http://www.arrfab.net/blog/?p=107 hat zu einem tragbaren 1-TB-Seagate-Laufwerk beigetragen, das in den Ruhezustand überging:

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

Das Laufwerk reagiert jetzt sofort, selbst wenn es eine Stunde lang im Leerlauf bleibt. Es wurde jedoch noch nicht getestet, ob die Einstellung bei Neustarts usw. gespeichert wurde.

oliver
quelle
Gibt es einen Tipp dazu ohne Sudo?
Wassermann Macht
Ich glaube, der Link hat sich geändert zu: arrfab.net/posts/2009/Jan/30/…
esm
4

Ich habe festgestellt, dass der folgende Cronjob für mich funktioniert.

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

Aktualisieren Sie es offensichtlich mit dem Gerätenamen Ihrer Festplatte.

Sie können die Zeit auch variieren, je nachdem, wie lange Ihr Laufwerk im Leerlauf ist, bevor es heruntergefahren wird.

Steven
quelle
2

Das Handbuch für Linuxhdparm enthält die folgenden Informationen:

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

Es kann jedoch nicht garantiert werden, dass Ihr Laufwerksgehäuse die Weiterleitung dieser Anweisungen an das Laufwerk unterstützt. Dieselbe Referenz erwähnt, dass die Verwendung von hdparm mit einem Gehäuse nur mit bestimmten "neueren (2008 und höher)" Modellen möglich ist, die das SCSI-ATA-Befehlsübersetzungssystem, auch bekannt als "SAT", unterstützen. Ich habe noch nicht versucht, dies auf etwas anderem als einem aktuellen billigen Backup-Laufwerk, einem HP SimpleSave-Modell, zu tun. Es scheint einige eingeschränkte Energieverwaltungsfunktionen bereitzustellen.

Und dies setzt natürlich auch voraus, dass OpenBSDs hdparmauf die gleiche Weise funktionieren. Ich kenne mich mit OpenBSD überhaupt nicht aus, daher kann ich Ihnen dort nicht helfen.

intuitiv
quelle
1
Das OpenBSD-Äquivalent von hdparm ist atactl. Aber ich weiß nicht, ob es auf USB-Geräten funktioniert; atactl(8)wird von wd(4)(der Manpage zum IDE-Festplattentreiber), aber nicht von umass(4)(der Manpage zum USB-Speichertreiber ) referenziert .
Gilles 'SO - hör auf böse zu sein'
Ich werde damit spielen, aber da USB-Laufwerke mit den Geräten / dev / sd * gemountet werden, bin ich mir nicht sicher, ob wd und atactl zutreffen. Zeit zum Lesen / Spielen.
gabe.
Denkst du, du könntest hdparmauf irgendeine Weise ohne Sudo in einer Schleife verwendet werden, um das Schlafen zu verhindern?
Wassermann Power
Kennen Sie den hdparamStandardwert für -B [apm_setting]?
Jyz