Zapobiegaj uśpieniu zewnętrznego dysku twardego USB


12

Czy ktoś wie, czy istnieje elegancki sposób, aby powiedzieć zewnętrznemu napędowi USB, aby nie wirował po okresie bezczynności? Widziałem rozwiązania oparte na cronie, które zapisują plik co minutę, ale nic nie pachnie niezłą elegancją. Musi istnieć polecenie hdparm lub scsi, które mogę wydać (dyski USB są dostępne za pośrednictwem sterownika SD w OpenBSD) na dysk, aby powiedzieć mu, aby nie spał. Obawiam się, że jest to prawdopodobnie funkcja wbudowana w kontroler w obudowie i jako taka niewiele może go zmienić, poza wyrywaniem napędu z obudowy i umieszczaniem go bezpośrednio w maszynie, ale pomyślałem, że zapytam: przy okazji.

Idealnie szukam rozwiązania OpenBSD, ale wiem, że istnieją inni z tym samym problemem, więc wszelkie rozwiązania będą brane pod uwagę w odpowiedzi.


1
Jestem tylko ciekawy, dlaczego nie chcesz, aby dysk się obracał.
tshepang

1
Cóż, na razie dzieje się tak dlatego, że mam ten dysk podłączony przez NFS na innym komputerze, a jeśli uruchomię komputer # 2, gdy dysk jest wyłączony, upłynie limit czasu, a partycja NFS nie zostanie podłączona.
Gabe.

1
Niedopuszczenie do obracania się napędu może skrócić jego żywotność. Zamiast tego rozważę rozwiązanie problemu z przekroczeniem limitu czasu. Miałem wcześniej podobny problem z zapasowym serwerem NAS i użycie automountera (takiego jak autofs) zapewniło, że system nie przekroczy limitu czasu, a jedynie rozkręci dyski, jeśli dostęp do punktu montowania zostanie uzyskany (i automatycznie zamontowany).
unode

Odpowiedzi:


4

Tak, zazwyczaj jest wbudowany w oprogramowanie układowe. Niektórzy producenci napędów udostępniają narzędzie do zarządzania oparte na systemie MS Windows, które pozwala modyfikować różne parametry, w tym wyłączać „uśpienie” lub wyłącznik czasowy. Jeśli masz dostęp do okna systemu Windows, warto kontynuować ten kąt.


8

Tylko moje 2 centy ...

Jest więcej niż prawdą, że obracanie dysków zmniejsza ich żywotność. Lata doświadczeń pokazały, że uruchomienie i zatrzymanie silnika dyskowego powoduje znacznie większe zmęczenie niż wirowanie 24/7. Wszystkie moje dyski z dużą liczbą start / stop przeniosły sektory, a wszystkie moje dyski, które obracają 10 lat 24/7 są (wierzcie lub nie) dobre jak nowe. W końcu dyski są przeznaczone do wirowania, a nie do pracy na biegu jałowym, więc jeśli Twoim priorytetem jest mniejsze zmęczenie niż zużycie energii, możesz swobodnie obracać dyski 24/7.

Mam zewnętrzny dysk 2 TB, który obraca się po 30 minutach bezczynności. Dysk powinien być zasilany 24 godziny na dobę przez 7 dni w tygodniu w celu tworzenia kopii zapasowych i działania jako mały NAS podłączony do Orange PI.

Użyłem następującej reguły udev w

/etc/udev/rules.d

(Nigdy nie działało, ponieważ spinowanie jest w oprogramowaniu układowym dysków)

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

Chociaż dysk obsługuje

hdparm -B

Napisałem mały proces demona, który może działać podczas rozruchu w

/etc/rc.local

który zapisuje 10 razy w cykli bieżącą datę i godzinę w pliku dziennika, dzięki czemu dysk jest zawsze włączony. Modyfikuj, jak chcesz.

Opcje wiersza poleceń to: katalog docelowy do zapisu awake.log i (opcjonalnie) opóźnienie czasowe (domyślnie 300)

na przykład

/usr/sbin/disk_awake /mnt/some_disk/keep_alive 30

kod: (możesz skompilować za pomocą 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
Dlaczego potrzebujemy specjalnego programu (C)? Dlaczego nie po prostu zadanie crona ... `* / 15 * * * * date> / mnt / disk / .date`
Stephen

Korzystam z zewnętrznego napędu USB Lenovo T470p z obudową USB orico. Uruchamiam z USB, gdy tylko rozpocznie się tryb gotowości, urządzenie przechodzi w tryb odczytu tylko po wybudzeniu. Konfiguracja udev.d naprawiła dla mnie ten problem.
thst

6

To rozwiązanie (dla Linuksa) z http://www.arrfab.net/blog/?p=107 pomogło stworzyć dysk Seagate Portable o pojemności 1 TB, który nie przestawał spać:

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

Napęd reaguje natychmiast, nawet gdy jest bezczynny przez godzinę. Jednak jeszcze nie przetestowałem, czy ustawienie jest zapisywane między restartami itp.


jakaś wskazówka na temat robienia tego bez sudo?
Aquarius Power

Uważam, że link zmienił się na: arrfab.net/posts/2009/Jan/30/…
esm

4

Przekonałem się, że następujący cronjob działa dla mnie.

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

Oczywiście zaktualizuj go o nazwę urządzenia na dysku.

Możesz także zmieniać czas w zależności od tego, jak długo dysk jest bezczynny, zanim się wyłączy.


2

Ręczne dla Linuxhdparm zapewnia następujące informacje:

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

Biorąc to pod uwagę, nadal nie ma gwarancji, że obudowa napędu będzie obsługiwać przekazywanie tych instrukcji do napędu. To samo odniesienie wspomina, że ​​możliwość użycia hdparm z obudową jest możliwa tylko w przypadku niektórych „nowszych modeli (2008 i późniejszych)”, które obsługują system tłumaczenia poleceń SCSI-ATA, czyli „SAT”. Jeszcze nie próbowałem tego robić na niczym innym, jak na niedawnym tanim dysku do tworzenia kopii zapasowych, modelu HP SimpleSave. Wydaje się, że zapewnia pewne ograniczone funkcje zarządzania energią.

I oczywiście zakłada to również, że OpenBSD hdparmdziała w ten sam sposób. W ogóle nie mam wiedzy na temat OpenBSD, więc nie mogę ci pomóc.


1
Odpowiednikiem hdparm w OpenBSD jest atactl. Ale nie wiem, czy to działa na urządzeniach USB; atactl(8)jest przywoływany przez wd(4)(stronę manuala sterownika dysku IDE), ale nie przez umass(4)(stronę manuala sterownika pamięci USB).
Gilles „SO- przestań być zły”

Będę się tym bawić, jednak ponieważ dyski USB montuje się za pomocą urządzeń / dev / sd *, nie jestem pewien, czy wd i atactl mają zastosowanie. Czas na trochę czytania / grania.
Gabe.

czy uważasz, że hdparmmożna go użyć w pętli w jakiś sposób bez sudo, aby zapobiec zasypianiu?
Aquarius Power

Czy znasz hdparamwartość domyślną dla -B [apm_setting]?
jyz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.