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);
}