gab*_*be. 16 drivers openbsd scsi hard-disk block-device
有谁知道是否有一种优雅的方法可以告诉外部 USB 驱动器在一段时间不活动后不要减速?我见过基于 cron 的解决方案每分钟写入一个文件,但没有任何东西散发出unixey 优雅的气息。必须有一个 hdparm 或 scsi 命令,我可以向驱动器发出(通过 OpenBSD 中的 sd 驱动程序访问 USB 驱动器)来告诉它不要休眠。恐怕这可能是机箱控制器内置的一个功能,因此除了将驱动器从机箱中取出并直接放入机器之外,没有太多可以改变它,但我想我会问,在关闭的机会。
理想情况下,我正在寻找 OpenBSD 解决方案,但我知道还有其他解决方案存在同样的问题,因此将考虑任何解决方案作为答案。
Ere*_*bus 11
只是我的 2 美分...
降低磁盘转速确实会缩短其使用寿命。多年的经验表明,启动和停止磁盘电机比 24/7 旋转更容易引起疲劳。我所有具有大启动/停止计数的磁盘都重新分配了扇区,并且我所有 10 年 24/7 旋转的磁盘(信不信由你)都像新的一样。毕竟,磁盘是为旋转而不是空闲而设计的,因此如果您的优先事项是疲劳而不是功耗,那么您可以随意让磁盘 24/7 旋转。
我有一个外部 2TB 磁盘,它在 30 分钟不活动后会减速。该磁盘旨在 24/7 全天候开机以进行备份,并充当连接到 Orange PI 的小型 NAS。
我使用了以下 udev 规则
/etc/udev/rules.d
Run Code Online (Sandbox Code Playgroud)
(它从来没有工作,因为降速是在磁盘固件中)
SUBSYSTEM=="usb", TEST=="power/autosuspend" ATTR{power/autosuspend}="-1"
Run Code Online (Sandbox Code Playgroud)
虽然磁盘支持
hdparm -B
Run Code Online (Sandbox Code Playgroud)
我写了一个可以在启动时运行的小守护进程
/etc/rc.local
Run Code Online (Sandbox Code Playgroud)
在日志文件中写入 10 次当前日期和时间,因此磁盘始终处于打开状态。随意修改。
命令行选项是:写入awake.log的目标目录和(可选)时间延迟(默认300)
例如
/usr/sbin/disk_awake /mnt/some_disk/keep_alive 30
Run Code Online (Sandbox Code Playgroud)
代码:(可以用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);
}
Run Code Online (Sandbox Code Playgroud)
小智 7
我发现以下 cronjob 对我有用。
*/5 * * * * /bin/touch /dev/sdb &>/dev/null
显然,使用磁盘的设备名称更新它。
您还可以根据驱动器在断电前空闲的时间来改变时间。
我看到了引用和问题,但没有任何直接的语法建议,因此尽管有人接受了我的答案,但还是添加了我的答案。用于优雅地停用睡眠的命令hdparm(根据要求)将是:
hdparm -S 0 /dev/sdx
或者可能...
hdparm -B255 /dev/sdx
对于您的驱动器支持和不支持的内容,请执行:
hdparm -I /dev/sdx
运行这些需要您自担风险,但如果您的驱动器支持第一个选项,则完全禁用睡眠,对我来说似乎相当优雅。这些选项可能在 2010 年不可用,所以如果是这样,这应该会对过来的人有所帮助!
小智 5
是的,它通常内置在固件中。一些驱动器制造商提供基于 MS Windows 的管理工具,允许您修改各种参数,包括禁用“睡眠”或减速计时器。如果您可以使用 Windows 盒子,那么追求这个角度可能是值得的。
小智 5
这个来自http://www.arrfab.net/blog/?p=107 的解决方案(适用于 Linux)帮助了一个 1TB 的希捷便携式硬盘,它一直处于休眠状态:
# sdparm --clear=STANDBY /dev/sdc -S
Run Code Online (Sandbox Code Playgroud)
即使闲置一小时,驱动器现在也能立即响应。不过,还没有测试设置是否在重启等过程中保存。