Не допускайте сну зовнішнього жорсткого диска USB


12

Хтось знає, чи є елегантний спосіб сказати зовнішньому USB-накопичувачеві, щоб він не переходив після періоду бездіяльності? Я бачив рішення на основі хронів, які пишуть файл щохвилини, але нічого, що пахне приємною елегантністю Unixey. Повинно бути команда hdparm або scsi, яку я можу видавати (до USB-накопичувачів можна отримати доступ через драйвер sd у OpenBSD), щоб сказати, що він не спить. Я боюся, що це, мабуть, функція, вбудована в контролер у корпусі, і як таке не дуже може змінити його, крім того, щоб вирвати накопичувач із його корпусу та вставити його безпосередньо в машину, але я зрозумів, що запитаю, на випадок.

В ідеалі я шукаю рішення OpenBSD, але я знаю, що там є інші з тією ж проблемою, тому будь-які рішення будуть розглянуті як відповідь.


1
Мені просто цікаво, чому ви не хочете, щоб привід згортався.
thepang

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

1
Якщо не пускати привід, він може скоротити його термін експлуатації. Я б замість цього вирішив вирішити проблему очікування. У мене була аналогічна проблема раніше, ніж із резервним копією NAS та використанням автомашини (наприклад, autofs) гарантували, що система не буде тактикована та закручувати диски лише у тому випадку, коли доступ до точки монтажу (і встановлено автоматично).
unode

Відповіді:


4

Так, він, як правило, вбудований в прошивку. Деякі виробники накопичувачів надають інструмент управління на базі MS Windows, який дозволить вам змінювати різні параметри, включаючи відключення режиму "сну" або відключення таймера. Якщо у вас є доступ до вікна Windows, можливо, варто дотримуватися цього кута.


8

Тільки мої 2 копійки ...

Більш ніж правда, що віджимання дисків зменшує їх термін служби. Багаторічний досвід показав, що запуск і зупинка дискового двигуна викликає набагато більше втоми, ніж 24/7 віджимання. Усі мої диски з великим числом запуску / зупинки мають перерозподілені сектори, і всі мої диски, які крутяться 10 років 24/7, добре (вірите чи ні) як нові. Зрештою, диски створені для спінінгу, а не для холостого ходу, тому, якщо ваш пріоритет - менша стомлюваність, ніж споживання електроенергії, не соромтесь крутити свої диски 24/7.

У мене зовнішній 2 ТБ диск, який згортається після 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 разів у циклах поточну дату та час у лог-файл, тому диск завжди увімкнено. Не соромтеся змінювати, як вам подобається.

Параметри командного рядка: цільовий каталог для запису 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
Чому потрібна спеціальна (С) програма? Чому б не просто робота з крон ... `* / 15 * * * * дата> / mnt / disk / .date`
Стівен Блот

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

6

Це рішення (для Linux) від http://www.arrfab.net/blog/?p=107 допомогло для портативного накопичувача Seagate 1 Тб, який продовжував спати:

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

Привід зараз негайно реагує, навіть коли залишається простою протягом години. Ще не перевіряли, чи збережено налаштування під час перезавантаження тощо.


будь-яка порада робити це без судо?
Сила Водолія

Я вважаю , що посилання змінилася на: arrfab.net/posts/2009/Jan/30 / ...
ESM

4

Я виявив, що наступна робота на мене працює.

* / 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могли б використовувати петельку певним чином без судо для запобігання сну?
Сила Водолія

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