Предотвратить спящий внешний жесткий диск USB


12

Кто-нибудь знает, есть ли элегантный способ сказать внешнему USB-накопителю не отключаться после периода бездействия? Я видел решения на основе cron, которые пишут файл каждую минуту, но ничего, что пахнет приятной юникси-элегантностью. Должна быть команда hdparm или scsi, которую я могу выдать (доступ к usb-накопителям осуществляется через драйвер sd в OpenBSD), чтобы запретить ему переходить в спящий режим. Я боюсь, что это, вероятно, функция, встроенная в контроллер в корпусе, и, как таковая, мало что может изменить, кроме как вытащить диск из его корпуса и вставить его прямо в машину, но я решил спросить, на всякий случай.

В идеале я ищу решение OpenBSD, но я знаю, что есть другие с такой же проблемой, поэтому любые решения будут рассмотрены для ответа.


1
Мне просто любопытно, почему вы не хотите, чтобы диск вращался.
Цепанг

1
Ну, на данный момент, это потому, что у меня этот диск смонтирован с помощью NFS на другом компьютере, и если я загружаю машину № 2, когда диск вращается, происходит тайм-аут, а раздел NFS не монтируется.
таращиться

1
Не позволяя приводу вращаться, можно сократить срок его службы. Я бы рассмотрел решение проблемы тайм-аута. У меня раньше была похожая проблема с резервным NAS, и использование автомонтирования (такого как autofs) гарантировало, что система не будет работать по тайм-ауту и ​​будет раскручивать диски только при обращении к точке монтирования (и автоматическом монтировании).
unode

Ответы:


4

Да, это вообще встроено в прошивку. Некоторые производители приводов предоставляют инструмент управления на базе MS Windows, который позволяет изменять различные параметры, в том числе отключать «спящий» или таймер замедления. Если у вас есть доступ к Windows-боксу, возможно, стоит придерживаться этого подхода.


8

Просто мои 2 цента ...

Более чем верно, что вращение дисков уменьшает их срок службы. Многолетний опыт показал, что запуск и остановка дискового двигателя вызывает гораздо большую усталость, чем вращение в режиме 24/7. Все мои диски с большим количеством запусков / остановок имеют перераспределенные сектора, и все мои диски, которые вращаются 10 лет 24/7, хороши, как новые. В конце концов, диски предназначены для вращения, а не для холостого хода, поэтому, если ваш приоритет меньше усталости, чем энергопотребление, не стесняйтесь, чтобы ваши диски вращались 24/7.

У меня есть внешний диск 2TB, который вращается после 30 минут бездействия. Диск предназначен для круглосуточного питания для резервного копирования и работает как небольшой NAS, подключенный к Orange PI.

Я использовал следующее правило udev в

/etc/udev/rules.d

(Это никогда не работало, поскольку вращение вниз находится в прошивке дисков)

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);
}

6
Зачем нужна специальная (с) программа? Почему бы не просто задание cron ... `* / 15 * * * * date> / mnt / disk / .date`
Стивен Блотт

Я использую Lenovo T470p, внешний USB-накопитель с USB-корпусом orico. Я загружаюсь с USB, как только начинается ожидание, устройство выходит на чтение только при пробуждении. Конфигурация udev.d устранила проблему для меня.
18.10

6

Это решение (для Linux) от http://www.arrfab.net/blog/?p=107 помогло для портативного накопителя Seagate емкостью 1 ТБ, который продолжал спать:

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

Теперь привод реагирует мгновенно, даже если он не используется в течение часа. Пока не проверял, сохраняется ли настройка при перезагрузках и т. Д.


какой-нибудь совет сделать это без sudo?
Водолей Сила

Я считаю , что ссылка изменилась на: arrfab.net/posts/2009/Jan/30/...
ESM

4

Я обнаружил, что следующий cronjob работает для меня.

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

Очевидно, обновите его с именем устройства вашего диска.

Вы также можете изменить время в зависимости от того, как долго ваш диск простаивает, прежде чем он выключится.


2

Руководство для Linuxhdparm предоставляет информацию следующим образом :

-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).

Тем не менее, все еще не гарантируется, что ваш корпус диска будет поддерживать передачу этих инструкций на диск. В той же ссылке упоминается, что возможность использовать hdparm с оболочкой вообще возможна только с определенными «более новыми (2008 и более поздними)» моделями, которые поддерживают систему трансляции команд SCSI-ATA, то есть «SAT». Я еще не пытался сделать это на чем-либо, кроме недавнего дешевого резервного диска, модели HP SimpleSave. Кажется, он обеспечивает некоторые ограниченные функции управления питанием.

И, конечно, это также предполагает, что OpenBSD hdparmработает таким же образом. Я совсем не разбираюсь в способах OpenBSD, поэтому не могу вам помочь.


1
OpenBSD эквивалент hdparm есть atactl. Но я не знаю, работает ли это на USB-устройствах; atactl(8)на него ссылается wd(4)( справочная страница драйвера диска IDE), но не на umass(4)( справочная страница драйвера USB-накопителя).
Жиль "ТАК - перестань быть злым"

Я собираюсь поиграть с этим, хотя, поскольку usb-накопители монтируются с использованием устройств / dev / sd *, я не уверен, что wd и atactl применимы. Время заняться чтением / игрой.
таращиться

Как вы думаете, hdparmможет быть использован в цикле без sudo для предотвращения сна?
Водолей Сила

Вы знаете hdparamзначение по умолчанию для -B [apm_setting]?
Jyz
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.