내 2 센트 만 ...
디스크를 회전 시키면 서비스 수명이 줄어드는 것이 사실입니다. 수년간의 경험에 따르면 디스크 모터를 시작하고 정지하면 24/7 스핀보다 훨씬 많은 피로가 발생합니다. 시작 / 정지 횟수가 큰 모든 디스크에는 섹터가 재 할당되어 있으며 연중 무휴로 10 년 동안 회전하는 모든 디스크는 새 것처럼 믿습니다 (믿거 나 말거나). 결국 디스크는 유휴 상태가 아닌 회 전용으로 만들어 지므로 우선 순위가 전력 소비보다 피로가 적 으면 디스크를 24/7 회전시킬 수 있습니다.
30 분 동안 활동이 없으면 회전하는 외부 2TB 디스크가 있습니다. 디스크는 백업을 목적으로하고 주황색 PI에 연결된 작은 NAS의 역할을하기 위해 연중 무휴 24 시간 전원이 공급됩니다.
나는 다음 udev 규칙을 사용했다.
/etc/udev/rules.d
(스핀 다운이 디스크 펌웨어에 있으므로 작동하지 않았습니다)
SUBSYSTEM=="usb", TEST=="power/autosuspend" ATTR{power/autosuspend}="-1"
디스크가
hdparm -B
부팅시 실행할 수있는 작은 데몬 프로세스를 작성했습니다.
/etc/rc.local
디스크가 항상 켜져 있도록 로그 파일에 현재 날짜와 시간을 10 번씩 cicles에 기록합니다. 원하는대로 수정하십시오.
명령 행 옵션은 다음과 같습니다. awake.log를 작성할 대상 디렉토리 및 (선택적) 시간 지연 (기본값 300)
예 :
/usr/sbin/disk_awake /mnt/some_disk/keep_alive 30
코드 : (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);
}