防止USB外置硬盘进入休眠状态


12

有谁知道是否有一种优雅的方式告诉外部USB驱动器在一段时间不活动后不停止旋转?我见过基于cron的解决方案,该解决方案每分钟都会写入一个文件,但是没有什么闻起来像unixey一样优雅。我必须发出一个hdparm或scsi命令(通过OpenBSD中的sd驱动程序访问usb驱动器),以告诉该驱动器不休眠。恐怕这可能是机箱控制器内置的功能,因此除了将驱动器从机箱中取出并直接放入机器中之外,没有什么可以改变的,但是我想我会问,机缘巧合。

理想情况下,我正在寻找OpenBSD解决方案,但我知道还有其他问题/问题,因此将考虑使用任何解决方案作为答案。


1
我很好奇为什么您不希望驱动器降速运转。
tshepang 2011年

1
好吧,目前,这是因为我已经通过NFS在另一台机器上安装了该驱动器,并且如果我在启动该驱动器的过程中启动了#2机器,它会超时,并且不会挂载NFS分区。
gabe。

1
不让驱动器旋转会降低其使用寿命。我会考虑解决超时问题。在使用备份NAS并使用自动挂载程序(例如autofs)之前,我遇到了类似的问题,以确保系统不会超时,并且仅在访问(并自动挂载)挂载点时才旋转磁盘。
Unode 2012年

Answers:


4

是的,它通常内置在固件中。一些驱动器制造商提供了基于MS Windows的管理工具,该工具将允许您修改各种参数,包括禁用“睡眠”或降速计时器。如果您可以使用Windows盒子,那么追求这个角度可能是值得的。


8

只是我的2美分...

旋转磁盘会缩短其使用寿命,这确实是事实。多年的经验表明,启动和停止磁盘电动机比24/7旋转引起的疲劳要严重得多。我所有启动/停止计数大的磁盘都有重新分配的扇区,并且我所有24/7旋转10年的磁盘都很好(不管信不信由你)。毕竟,磁盘是为旋转而设计的,而不是为了使驱动器空转,因此,如果您的首要任务是减轻疲劳而不是消耗电能,那么可以自由旋转24/7磁盘。

我有一个外部2TB磁盘,在闲置30分钟后它会旋转下来。该磁盘旨在24/7上电,以用于备份目的,并充当连接到Orange PI的小型NAS。

我在下面使用了udev规则

/etc/udev/rules.d

(它从未使用过,因为降速是在磁盘固件中进行的)

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

尽管磁盘支持

hdparm -B

我写了一个小的守护进程,可以在启动时运行

/etc/rc.local

在日志文件中将当前日期和时间写入cicle中的10次,因此磁盘始终处于打开状态。随意修改。

命令行选项包括:写入aake.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);
}

6
为什么需要特殊的(C)程序?为什么不只是一份cron工作...`* / 15 * * * *日期> / mnt / disk / .date`
Stephen

我正在运行带有Orico USB外壳的Lenovo T470p外部USB驱动器。我正在从USB引导,一旦备用数据库启动,设备在唤醒时将变为只读状态。udev.d配置为我解决了这个问题。
THST

6

来自http://www.arrfab.net/blog/?p=107的此解决方案(适用于Linux)有助于生产1TB的Seagate Portable驱动器,该驱动器一直处于睡眠状态:

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

现在,即使闲置一个小时,驱动器也可以立即响应。不过,尚未测试设置是否在重新启动后保存。


在没有sudo的情况下进行此操作的任何提示?
Aquarius

我认为此链接已更改为:arrfab.net/posts/2009/Jan/30/...
ESM

4

我发现以下cronjob对我有用。

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

显然用磁盘的设备名称更新它。

您还可以根据驱动器掉电前的空闲时间来改变时间。


2

为Linux手册hdparm提供了以下信息:

-B  Query/set Advanced Power Management feature,
    if the drive supports it.
    A low value means aggressive  power  management
    and a high value means better performance.

    Possible settings range
    from values 1 through  127  (which  permit spin-down),
    and values 128 through 254 (which do not permit spin-down).

    The highest degree of  power  management
    is attained with a setting of 1,
    and the highest I/O performance with a setting of 254.

    A  value  of  255  tells hdparm to
    disable Advanced Power Management altogether on the drive
    (not all drives support disabling it, but  most do).

话虽如此,仍然不能保证驱动器机箱将支持将这些指令中继到驱动器。相同的参考文献提到,只有在某些支持SCSI-ATA命令转换系统(又称为“ SAT”)的“较新的(2008年及更高版本)”模型中,才可以将hdparm与外壳一起使用。除了最近的廉价备份驱动器(HP SimpleSave型号)之外,我还没有尝试执行此操作。它似乎提供了一些有限的电源管理功能。

当然,这还假设OpenBSD的hdparm工作方式相同。我对OpenBSD的方法一无所知,因此我无法为您提供帮助。


1
hdparm的OpenBSD等效于atactl。但是我不知道它是否可以在USB设备上使用。atactl(8)wd(4)(IDE磁盘驱动程序手册页)引用,但未被umass(4)(USB存储驱动程序手册页)引用。
吉尔(Gilles)“所以,别再邪恶了”,

我将使用此功能,尽管由于USB驱动器是使用/ dev / sd *设备安装的,所以我不确定wd和atactl是否适用。是时候做一些阅读/玩了。
gabe。

您认为hdparm可以以某种方式不使用sudo进行循环来防止睡眠吗?
Aquarius Power

您知道hdparam默认值-B [apm_setting]吗?
jyz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.