แค่ 2 เซ็นต์ของฉัน ...
มันยิ่งกว่าความจริงที่การหมุนดิสก์จะลดอายุการใช้งาน ประสบการณ์หลายปีแสดงให้เห็นว่าการเริ่มและหยุดมอเตอร์ดิสก์ทำให้เกิดความล้ามากกว่าปั่นหมาด 24/7 ดิสก์ของฉันทั้งหมดที่มีขนาดเริ่มต้น / หยุดขนาดใหญ่มีการจัดสรรเซ็กเตอร์และดิสก์ทั้งหมดของฉันที่หมุนรอบ 10 ปี 24/7 จะเชื่อว่าดีหรือใหม่ ท้ายที่สุดแล้วดิสก์ถูกสร้างขึ้นมาเพื่อการหมุนไม่ใช่เพื่อการไม่ทำงานดังนั้นหากคุณให้ความสำคัญกับความเหนื่อยล้าน้อยกว่าการใช้พลังงานโปรดอย่าลังเลที่จะให้ดิสก์ของคุณหมุนวนตลอดเวลา
ฉันมีดิสก์ 2TB ภายนอกที่หมุนลงหลังจากไม่มีการใช้งานเป็นเวลา 30 นาที ดิสก์นั้นใช้พลังงานจาก 24/7 เพื่อสำรองข้อมูลและทำหน้าที่เป็น NAS ขนาดเล็กที่ติดอยู่กับ Orange PI
ฉันใช้กฎ 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);
}