Sicheres manuelles Herunterfahren der Festplatte mit hdparm?

6892
Shane

Ich habe einen Laptop mit einem SSD-Laufwerk für das primäre Betriebssystem und eine große Spin-Disk für die Speicherung. Ich habe derzeit einen Alias, den ich verwende, um das Laufwerk manuell herunterzudrehen, wenn ich es nicht benutze (nach umount natürlich):

sudo hdparm -y /dev/disk/by-id/ata-WDC_WD7500BPKX-80HPJT0_WD-WX31AB3N6985 

Ist das sicher zu benutzen? Wird sich hdparmweigern, dies zu tun, wenn das Laufwerk noch zu synchronisieren oder wenn ich es umount vergessen? Wenn nicht, gibt es eine Möglichkeit hdparm(oder ein anderes Programm), um zu überprüfen, ob dies sicher ist?


UPDATE -

So sehr ich auch Ihre beiden Antworten schätze, sie helfen mir überhaupt nicht, weil ich unzählige verschiedene Wertkombinationen für die APM- und die Spindown-Zeiteinstellung ausprobiert habe, wobei (abgesehen von a) weniger als 10 Sekunden zuvor Ergebnisse erzielt wurden Spin-Down b) Kein Spin-Down, aber beliebiges Parken, oder c) Kein Spin-Down oder Parken. Ich habe auch versucht, das Web nach meinem spezifischen Laufwerksmodell und den entsprechenden APM-Werten zu durchsuchen, ohne Erfolg.

Die Richtung, in die ich gehen möchte, ist folgende: Ich muss einen Weg finden, um herauszufinden, ob die Platte verwendet wird, damit ich einen systemd-Dienst schreiben kann. Das nächste, was ich bis jetzt erreichen kann, ist lsof | grep /mnt/data, oder ein solcher Unsinn. Aber wie Sie sehen, ist das alles andere als ideal. Ich möchte eine Methode, um dies zu erreichen, die nicht von einem vorgegebenen Mount-Punkt abhängt, oder die von der CPU gierigen, mehrfachen Aufrufe von lsof + D-Mntpoint in der Antwort, die ich selbst zur Verfügung gestellt habe.

Sehen Sie sich meine Antwort unten an, um eine Vorstellung davon zu erhalten, was ich versuche

2
Ich verwende einfach die Option "-S", um ein kurzes Timeout einzustellen. Auf diese Weise entscheidet das Gerät selbst, wann es heruntergefahren wird. Nattgew vor 9 Jahren 1
Hmm .. Ich habe versucht, ein kurzes Timeout einzustellen, und es ist viel zu kurz für meinen Geschmack (ich möchte das Laufwerk nicht schnell auslasten). Ich habe mich seitdem mit WD (meinem Laufwerkhersteller) in Verbindung gesetzt, und sie haben mir erzählt, dass nur Laufwerke der Enterprise-Klasse solche Funktionen unterstützen. Shane vor 8 Jahren 0
@Shane: naja, wenn es zu kurz ist, kannst du das Timeout erhöhen, bis es nicht richtig ist, oder? Peque vor 8 Jahren 0

4 Antworten auf die Frage

3
Otheus

Du hast einen Alias! Vielleicht ist es besser, ein Skript zu haben, das das Synchronisieren / Aufheben der Bereitstellung durchführt und dann hdparm aufruft. Fügen Sie das Skript der Sudoers-Datei hinzu.

cat >/usr/local/sbin/spindown disk=/dev/disk/by-uuid/c542a956-fbfe-42f7-ac8f-44c029a35a69 sync && unmount /bigdisk/volume && hdparam -y $disk 

Das && stellt sicher, dass der vorherige Befehl erfolgreich beendet wird, bevor der nächste versucht wird.

Dann zu Sudoers hinzufügen. Das könnte funktionieren:

cat >/etc/sudoers.d/spindown <<EOF ALL ALL=(ALL) NOPASSWD:/usr/local/sbin/spindown EOF 

DanielB machte einen brillanten Vorschlag: Verwenden Sie autofs, um eine lokale Festplatte automatisch ein- / auszuhängen (ich habe nie daran gedacht, sie auf diese Weise zu verwenden, da ich normalerweise auf Servern arbeite und da autofs traditionell für NFS war). Sobald dies eingerichtet ist (frage mich nicht wie;)), füge so etwas zu einem Cronjob hinzu:

cat >/etc/cron.d/spindown << EOF * * * * * hdparm -C | grep -q -E "idle|active" DISK-DEV && grep -q MOUNTPOINT /etc/mtab && hdparm -y DISK-DEV EOF 

Stellen Sie sicher, dass Sie DISK-DEV und MOUNTPOINT ersetzen (wenn Disk-dev 0 oder 1 Partitionen hat, können Sie sie für MOUNTPOINT verwenden). Bitte beachten Sie: Ich kann das nicht wirklich testen, da das physische System, auf das ich Zugriff auf ATM habe, ein RAID-Gerät ist und der Controller diese Befehle nicht unterstützt.

Die Demontage der Festplatte ist nicht sehr praktisch, Sie könnten dies wahrscheinlich mit "autofs" umgehen. Daniel B vor 8 Jahren 2
Das ist eine großartige Idee, @DanielB! Holen Sie sich autofs, um das Unmounten auszulösen, und lassen Sie hdparm seine Arbeit automatisch erledigen! Otheus vor 8 Jahren 0
3
Daniel B

Anstatt dies manuell herauszufinden, verlassen Sie sich auf vorhandene Elemente. Ich verwende hd-idle auf meinem Dateiserver, es funktioniert großartig. Ich kann meine Laufwerke auch nicht aushängen, da es wirklich keinen Grund gibt, dies zu tun. Wenn ich auf eine Datei zugreifen möchte, werden die Festplatten hochgefahren. Nach Ablauf der Zeit werden sie wieder heruntergefahren.

Wenn Sie in Bezug auf die Datenintegrität sehr paranoid sind, können Sie autofs verwenden, mit denen Ihre Dateisysteme je nach Bedarf automatisch bereitgestellt werden können. Ich habe es selbst nicht benutzt, aber die ArchWiki-Seite enthält einige Informationen, die recht brauchbar erscheinen.

Danke, Mann. HD-Idle ist genau das, wonach ich gesucht habe. Und ich habe autofs verwendet. Ich weiß nicht, warum ich nicht auf den Gedanken gekommen bin, das mit einem leichten Dämon zu verwenden, der nicht gemountete Festplatten herunterwirft. Shane vor 8 Jahren 0
Ein Grund für das manuelle Aufheben der Bereitstellung von Laufwerken ist der Ruhezustand auf einem Laptop. Ich suche nach einem Weg, um zu verhindern, dass sich eine HDD beim Wiederaufnehmen aus dem Ruhezustand hochdreht, z. B. wenn sie nicht eingehängt ist. Auch wenn es nicht gemountet ist und ich es manuell mit hdparm in den Ruhezustand versetzt habe, wacht es immer noch auf. Michael vor 5 Jahren 0
@Michael Wenn sich Ihr Laptop im Standby-Modus befindet, ist das Laufwerk vollständig heruntergefahren. Es muss hochlaufen, um wieder erkannt zu werden. Daran führt kein Weg vorbei. Daniel B vor 5 Jahren 0
1
Peque

Hinweis

Sie müssen die Partitionen nicht umhängen, um die Festplatte herunterzufahren. Es ist einfacher, wenn Sie nur ein Standby-Timeout einstellen (das nach einiger Zeit ausgelöst wird). Auf diese Weise wird die Festplatte bei Bedarf aktiviert (Spin-Up) und Sie können sie sofort verwenden, ohne die Partitionen neu zu mounten.

Befehlszeilenlösung

Wie @Nattgew für einen Kommentar vorgeschlagen hat, verwenden Sie hdparm(falls dies das von Ihnen verwendete Werkzeug ist) die -SOption zum Festlegen eines Standby-Zeitlimits:

-S Set standby (spindown) timeout 

Auf diese Weise wird die Festplatte automatisch heruntergefahren, wenn keine Aktivität vorliegt.

Um diese Änderung dauerhaft zu machen (z. B. nach dem Neustart), müssen Sie möglicherweise Änderungen an vornehmen /etc/hdparm.conf. Da Ihre Distribution heutzutage wahrscheinlich verwendet wird systemd, müssen Sie möglicherweise eine Einheit erstellen:

https://unix.stackexchange.com/a/89013/66295

Am einfachsten wäre es wahrscheinlich, ein grafisches Werkzeug zu verwenden ... (Ja, manchmal, wenn bereits eine grafische Benutzeroberfläche in Ihrem System aktiviert ist, ist dies der schnellste Weg).

GUI-Lösung (GNOME)

Wie Sie sagen, Sie verwenden Ihren Laptop, nehme ich an, Sie haben tatsächlich eine grafische Oberfläche. Bei GNOME-Distributionen gibt es ein Programm mit dem Namen "Disks":

enter image description here

Wenn Sie die Festplatte ausgewählt haben, die Sie in den Standby-Modus versetzen möchten, können Sie im Menü auf "Laufwerkseinstellungen" klicken (oder CTRL+ Ekann auch eine Verknüpfung sein):

enter image description here

Ändern Sie dann die Standby-Timeout-Einstellungen:

enter image description here

Bitte beachten Sie, dass die APM-Einstellung (die `hdparm` setzt) ​​auf vielen Laufwerken nicht richtig funktioniert und das Laufwerk nach einigen Sekunden anstatt nach Minuten oder Stunden herunterfährt. Dies kann Ihre Festplatte zerstören. Daniel B vor 8 Jahren 0
1
Shane

Hier ist mein Hack eines Drehbuchs bis jetzt. Ich werde das offen halten, bis jemand eine bessere Lösung findet ...

#!/bin/bash  # for each disk specified as disk # if disk is active/idle # disk in use as inuse = false # for each mount point as mntpoint accociated with it # if (lsof | grep mntpoint) # inuse = true # break # endif # endfor # if inuse # spin down disk # endif # endif # endfor  DISKS_LEN=1 DISKS[1]=ata-WDC_WD7500BPKX-80HPJT0_WD-WX31AB3N6985  spindown_disk() { (sync $1 && sudo hdparm -y /dev/$1 >/dev/null) & }  diskArr_len=0 for i in `seq $DISKS_LEN`; do linkpath=$(readlink /dev/disk/by-id/$) ((diskArr_len+=1)) diskArr[$i]=$ done  for i in `seq $diskArr_len`; do disk=$ if (sudo hdparm -C /dev/$disk | grep -B1 'active/idle'); then inuse=false mntpoints="$(mktemp)" mount \ | grep "^/dev/$disk[0-9]" \ | sed -r "s|^/dev/$disk[0-9] on (.*) type.*$|\1|" \ >"$mntpoints" while read mntpoint; do while read openfile; do [ $inuse = false ] && echo open files: echo $'\t'/$ inuse=true done < <(lsof | grep "$mntpoint") done <"$mntpoints" rm -f "$mntpoints" if [ "$inuse" = true ]; then echo $disk is in use else echo spinning down $disk \(after sync\) spindown_disk $disk fi else echo $disk is already inactive fi done  exit 0 

Ich werde noch herausfinden müssen, wie ich dies in einem systemd-Dienst einpacken kann, der alle X Minuten läuft. Natürlich wäre es besser, wenn es eine Alternative zu lsof und grep gäbe. Ich bin mir auch nicht sicher, ob dies aufgrund der Verwendung von grep mit lustigen Mount-Point-Zeichen funktionieren würde. Wenn Sie mehr als 9 Partitionen haben, müsste dies ebenfalls überarbeitet werden.

Bitte, wenn Sie irgendwelche Vorschläge haben, zögern Sie nicht.

Welche GNU / Linux-Distribution verwendest du? Welcher Desktop? Warum benutzen Sie nicht die `-S`-Option (Standby bei Inaktivität)? Peque vor 8 Jahren 0
Es ist egal, welche Linux-Distribution ich verwende. Solange hdparm die Register des Laufwerks einstellt, ist es an dem Laufwerk, sie zu respektieren. Ich kann bestätigen, dass dies der Fall ist, da ich viele verschiedene Kombinationen von mit -S und -B übergebenen Werten ausprobiert habe (siehe meine Frage oben bearbeiten). Wenn Sie immer noch nicht überzeugt sind, wurden auf meinem Computer mehrere verschiedene Distributionen mit den gleichen Ergebnissen installiert Shane vor 8 Jahren 0
Ich denke, das tut es. Was Sie erreichen möchten, ist mit einer grafischen Benutzeroberfläche möglicherweise einfacher als mit einem definitiv nicht optimalen Skript, das Sie alle X Minuten ausführen möchten. Peque vor 8 Jahren 0
A) Was ist Ihrer Meinung nach die GUI als Backend? B) Ich habe versucht, gnome-disks zu verwenden, bevor ich mit dem Aufruf von hdparm von einer Shell aus sprach Shane vor 8 Jahren 0
A) Ich weiß es nicht und ich denke auch nicht. ;-) B) Haben Sie die Option "Standby-Zeitüberschreitung" gefunden (meine Antwort enthält einen Screenshot). Das hat nicht funktioniert Peque vor 8 Jahren 0
@Peque Ich freue mich zwar über deinen Versuch, meine Frage mit Screenshots und allen anderen zu beantworten Shane vor 8 Jahren 0
Haben Sie die Option "Standby-Zeitüberschreitung" gefunden? (In meiner Antwort gibt es einen Screenshot). Das hat nicht funktioniert Es hat das Laufwerk nicht heruntergefahren, wenn es aktiv war? oder der Timeout funktionierte nicht wie erwartet? Peque vor 8 Jahren 0