Sicheres manuelles Herunterfahren der Festplatte mit hdparm?

2

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

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

Ist das sicher zu bedienen? Wird dies hdparmabgelehnt, wenn das Laufwerk noch nicht synchronisiert wurde oder ich vergessen habe, es abzumelden? Wenn nicht, gibt es eine Möglichkeit hdparm(oder eine andere Möglichkeit) zu prüfen, ob dies sicher ist?


UPDATE -

So sehr ich Ihre beiden Antworten auch schätze, sie helfen mir überhaupt nicht, da ich unzählige verschiedene Wertekombinationen für die Einstellungen für APM und Auslaufzeit ausprobiert habe, ohne dass Ergebnisse außer a) vor weniger als 10 Sekunden erzielt wurden Spin-Down b) kein Spin-Down, aber zufälliges Parken oder c) kein Spin-Down oder Parken. Ich habe auch versucht, im Internet nach meinem spezifischen Laufwerksmodell und den entsprechenden APM-Werten zu suchen, ohne Erfolg.

Die Richtung, in die ich gehen möchte, ist folgende: Ich muss einen Weg finden, um festzustellen, ob die Festplatte verwendet wird, damit ich einen systemd-Dienst schreiben kann. Der nächste lsof | grep /mnt/dataPunkt, zu dem ich bisher kommen kann, ist oder ein solcher Unsinn. Aber wie Sie sehen, ist das alles andere als ideal. Ich hätte gerne eine Methode, um dies zu erreichen, die nicht von einem vorher festgelegten Einhängepunkt oder den mehrfachen Aufrufen von lsof + D mntpoint in der Antwort abhängt, die ich mir selbst gegeben habe.

Schauen Sie sich meine Antwort unten an, um eine Vorstellung davon zu bekommen, was ich zu tun versuche

Shane
quelle
1
Ich benutze nur die -SOption, um ein kurzes Timeout einzustellen, damit das Gerät selbst entscheidet, wann es herunterfährt.
Nattgew
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 verschleißen). Ich habe mich seitdem an WD (meinen Laufwerkshersteller) gewandt, und sie haben mir nur die Supportfunktionen für Laufwerke der Enterprise-Klasse wie diese mitgeteilt.
Shane
@ Shane: na ja, wenn es zu kurz ist, kannst du das Timeout erhöhen, bis es nicht mehr ist, oder?
Peque

Antworten:

3

Anstatt manuell zu versuchen, dies herauszufinden, verlassen Sie sich auf vorhandenes Material. Ich benutze HD-Idle auf meinem Dateiserver, es funktioniert großartig. Ich hänge meine Laufwerke auch nicht ab, weil es wirklich keinen Grund gibt, dies zu tun. Wenn ich auf eine Datei zugreifen möchte, werden die Datenträger hochgefahren. Nachdem die Zeit abgelaufen ist, werden sie wieder heruntergefahren.

Wenn Sie in Bezug auf die Datenintegrität äußerst paranoid sind, können Sie autofs verwenden , mit denen Ihre Dateisysteme bei Bedarf automatisch bereitgestellt und umgemountet werden können. Ich habe es selbst nicht benutzt, aber die ArchWiki-Seite bietet einige Informationen, die ziemlich brauchbar aussehen.

Daniel B
quelle
Danke, Mann. HD-Idle ist genau das, wonach ich gesucht habe. Und ich habe autofs verwendet, ich weiß nicht, warum mir das nicht eingefallen ist, wenn ich einen leichten Daemon verwende, der nicht gemountete Festplatten herunterfährt.
Shane
Ein Grund, die Bereitstellung von Laufwerken manuell aufzuheben, ist der Energiesparmodus bzw. die Wiederaufnahme des Betriebs auf einem Laptop. Ich suche nach einer Möglichkeit, um zu verhindern, dass sich eine Festplatte im Standby-Modus dreht, z. B. wenn sie nicht aktiviert ist. Auch wenn es nicht gemountet ist und ich es manuell mit hdparm in den Ruhezustand versetzt habe, wacht es immer noch aus dem Ruhezustand auf.
Michael
@Michael Wenn sich Ihr Laptop im Standby-Modus befindet, wird das Laufwerk vollständig ausgeschaltet. Es muss sich drehen, um wieder erkennbar zu sein. Daran führt kein Weg vorbei.
Daniel B
3

Du hast einen Alias! Vielleicht ist es besser, ein Skript zu haben, das das Synchronisieren / Aufheben der Bereitstellung vornimmt 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 wurde, bevor der nächste ausgeführt wird.

Dann zu Sudoern 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 zu mounten / zu entmounten (ich habe nie daran gedacht, dies so zu tun, da ich normalerweise auf Servern arbeite und autofs traditionell für NFS war). Dann, wenn das eingerichtet ist (frag 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 über 0 oder 1 Partition verfügt, können Sie diese für MOUNTPOINT verwenden). Bitte beachten Sie: Ich kann dies nicht testen, da das einzige physische System, auf das ich Zugriff habe, ein RAID-Gerät ist und der Controller diese Befehle nicht unterstützt.

Otheus
quelle
2
Es ist nicht sehr praktisch, die Festplatte immer abzuhängen. Sie könnten das wahrscheinlich umgehen autofs.
Daniel B
Das ist eine großartige Idee, @DanielB! Also lass autofs das Unmounting auslösen und lass dann hdparm seine Arbeit automatisch machen!
Otheus
1

Hinweis

Sie müssen die Partitionen nicht ummounten, um die Festplatte herunterzufahren. Es ist einfacher, wenn Sie nur ein Standby-Timeout festlegen (das nach einiger Zeit ausgelöst wird, wenn es nicht verwendet wird). Auf diese Weise wird die Festplatte bei Bedarf aktiviert (hochgefahren) und kann sofort verwendet werden, ohne dass die Partitionen erneut bereitgestellt werden müssen.

Befehlszeilenlösung

Verwenden hdparmSie, wie @Nattgew für einen Kommentar vorgeschlagen hat, (sofern dies das von Ihnen bevorzugte Tool ist) die -SOption, ein Standby-Zeitlimit festzulegen:

-S   Set standby (spindown) timeout

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

Um diese Änderung dauerhaft zu machen (dh nach einem 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

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

GUI-Lösung (GNOME)

Ich gehe davon aus, dass Sie über eine grafische Benutzeroberfläche verfügen. Bei GNOME-Distributionen gibt es ein Programm mit dem Namen "Disks":

Bildbeschreibung hier eingeben

Sobald 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):

Bildbeschreibung hier eingeben

Ändern Sie dann die Einstellungen für das Standby-Zeitlimit:

Bildbeschreibung hier eingeben

Peque
quelle
Beachten Sie, dass die eingestellte APM-Einstellung hdparmauf vielen Laufwerken nicht ordnungsgemäß funktioniert und das Laufwerk nach Sekunden statt nach Minuten oder Stunden herunterfährt. Dies kann Ihre Festplatte zerstören.
Daniel B
1

Hier ist mein Hack von einem Skript 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/${DISKS[$i]})
    ((diskArr_len+=1))
    diskArr[$i]=${linkpath##*/}
done

for i in `seq $diskArr_len`; do
    disk=${diskArr[$i]}
    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'/${openfile#*/}
                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 einen systemd-Dienst einbinden kann, der alle X Minuten ausgeführt wird. Offensichtlich wäre es besser, wenn es eine Alternative zu lsof und grep gäbe. Ich bin mir auch nicht sicher, ob dies mit lustigen Mount-Point-Zeichen funktionieren würde, da grep verwendet wird. Außerdem müsste es überarbeitet werden, wenn Sie mehr als 9 Partitionen hätten.

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

Shane
quelle
Welche GNU / Linux-Distribution verwenden Sie? Welcher Desktop? Warum nutzen Sie die -SOption nicht (Standby, wenn sie nicht aktiv ist)?
Peque
Es spielt keine Rolle, welche Linux-Distribution ich verwende. Solange hdparm die Register des Laufwerks einstellt, ist es Sache des Laufwerks, diese zu respektieren. Ich kann bestätigen, dass dies der Fall ist, da ich viele verschiedene Kombinationen von Werten ausprobiert habe, die mit -S und -B übergeben wurden (siehe meine Frage oben). Wenn Sie immer noch nicht überzeugt sind, habe ich mehrere verschiedene Distributionen mit den gleichen Ergebnissen auf meinem Computer installiert
Shane,
Ich denke schon. Was Sie erreichen möchten, ist möglicherweise einfacher mit einer grafischen Oberfläche als mit einem definitiv nicht optimalen Skript, das Sie alle X Minuten ausführen möchten ...
Peque
A) Was verwendet die GUI Ihrer Meinung nach als Backend? B) Ich habe versucht, Gnome-Disks zu verwenden, bevor ich mich mit dem Aufrufen von hdparm aus einer Shell herumgetrieben habe
Shane,
A) Ich weiß es nicht und ich denke auch nicht. ;-) B) Hast du die Option "Standby Timeout" gefunden (in meiner Antwort ist ein Screenshot enthalten)? Das hat nicht geklappt
Peque