USB 외장 하드 드라이브의 절전 모드 방지

USB 외장 하드 드라이브의 절전 모드 방지

일정 기간 동안 활동이 없으면 외부 USB 드라이브가 회전하지 않도록 지시하는 우아한 방법이 있는지 아는 사람이 있습니까? 매분마다 파일에 기록하는 cron 기반 솔루션을 본 적이 있지만 좋은 냄새가 나는 unixey 우아함은 전혀 없습니다. 최대 절전 모드로 전환하지 않도록 드라이브에 실행할 수 있는 hdparm 또는 scsi 명령이 있어야 합니다(USB 드라이브는 OpenBSD의 sd 드라이버를 통해 액세스됩니다). 나는 이것이 아마도특징케이스 속 컨트롤러에 내장되어 있어서 케이스에서 드라이브를 꺼내서 직접 기계에 넣는 것 외에는 바꿀 수 있는 게 없는데, 기회가 있으면 물어볼까 하는 생각이 들었습니다.

이상적으로는 OpenBSD 솔루션을 찾고 있지만 동일한 문제를 안고 있는 다른 솔루션도 있다는 것을 알고 있으므로 어떤 솔루션이든 답변으로 간주됩니다.

답변1

내 2센트만...

디스크의 회전 속도를 늦추면 수명이 단축되는 것은 사실입니다. 수년간의 경험에 따르면 디스크 모터를 시작하고 중지하는 것이 연중무휴 24시간 회전하는 것보다 더 많은 피로를 유발하는 것으로 나타났습니다. 시작/중지 횟수가 많은 모든 디스크에는 섹터가 재할당되었으며, 10년 동안 연중무휴로 회전한 모든 디스크(믿거나 말거나)는 새 것과 같습니다. 결국 디스크는 유휴 상태가 아닌 회전하도록 설계되었으므로 전력 소비보다 피로를 줄이는 것이 우선이라면 디스크를 연중무휴 24시간 회전시켜 두십시오.

30분 동안 유휴 상태가 되면 외부 2TB 디스크가 회전을 멈춥니다. 디스크는 백업 목적으로 연중무휴 24시간 전원이 공급되도록 설계되었으며 Orange PI에 연결된 소형 NAS 역할을 합니다.

나는 다음 udev 규칙을 사용했습니다.

/etc/udev/rules.d

(디스크 펌웨어의 RPM 저하로 인해 작동하지 않았습니다)

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

디스크가 지원하지만

hdparm -B

부팅 시 실행되는 작은 데몬을 작성했습니다.

/etc/rc.local

디스크가 항상 켜져 있도록 현재 날짜와 시간을 로그 파일에 10번씩 주기적으로 기록합니다. 마음에 드시는 대로 수정해 보시기 바랍니다.

명령줄 옵션은 다음과 같습니다: 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);
}

답변2

다음 cronjob이 나에게 적합하다는 것을 알았습니다.

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

분명히 디스크의 장치 이름으로 업데이트하십시오.

전원이 꺼지기 전까지 드라이브가 유휴 상태로 유지되는 시간에 따라 시간을 변경할 수도 있습니다.

답변3

인용문과 질문을 보았지만 직접적인 구문 제안은 없었으므로 승인되었음에도 불구하고 답변을 추가했습니다. 요청에 따라 절전 모드를 정상적으로 비활성화하는 명령은 hdparm다음과 같습니다.

hdparm -S 0 /dev/sdx

아니면 어쩌면...

hdparm -B255 /dev/sdx

드라이브가 지원하는 기능과 지원하지 않는 기능에 대해 다음을 수행하세요.

hdparm -I /dev/sdx

이 기능을 실행하는 데 따른 책임은 사용자에게 있지만 드라이브가 첫 번째 옵션을 지원하는 경우 절전 모드를 완전히 비활성화하는 것이 나에게는 매우 우아해 보입니다. 이러한 옵션은 2010년에는 제공되지 않을 수 있으므로, 그렇다면 누군가가 방문하는 데 도움이 될 것입니다!

답변4

이 솔루션(Linux용)은 다음에서 제공됩니다.http://www.arrfab.net/blog/?p=1071TB Seagate 휴대용 하드 드라이브가 항상 잠자기 상태인 문제를 해결하는 데 도움이 됩니다.

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

이제 드라이브는 한 시간 동안 유휴 상태로 있어도 즉시 반응합니다. 그러나 이 설정이 재부팅 등을 통해 저장되는지 여부는 테스트되지 않았습니다.

관련 정보