一定期間活動がなければ、外部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
これで、ドライブは1時間アイドル状態であってもすぐに反応します。ただし、この設定が再起動などで保存されているかどうかはテストされていません。