Wie führe ich einen Befehl aus, sobald ein ZFS-Scrub * abgeschlossen * ist?

11

Ich möchte cron verwenden, um regelmäßige Scrubs meines ZFS-Pools zu planen, und zu einem relativ kurzen Zeitpunkt nach Abschluss des Scrubs einen Statusbericht per E-Mail an mich selbst senden. Dies dient dazu, Probleme zu erkennen, ohne sie manuell suchen zu müssen (drücken statt ziehen).

Der erste Teil ist einfach: Richten Sie einfach einen Cron-Job ein, der zpool scrub $POOLin jedem Intervall, das in meiner speziellen Situation angemessen ist, als Root ausgeführt wird.

Im zweiten Teil bin ich mir nicht ganz so sicher, wie ich es machen soll. zpool scrubkehrt sofort zurück und dann wird das Scrub vom System im Hintergrund ausgeführt (was sicherlich wünschenswert ist, wenn das Scrub von einem Administrator von einem Terminal aus initiiert wird). zpool statusgibt mir einen Statusbericht und beendet das Programm (mit dem Beendigungscode 0, während das Scrub ausgeführt wird; es ist noch nicht abgeschlossen, sodass ich nicht weiß, ob sich der Beendigungsstatus ändert, wenn er abgeschlossen ist, aber ich bezweifle es). Der einzige für zpool scrub dokumentierte Parameter ist -s"stop scrubbing ".

Das Hauptproblem besteht darin, die Statusänderung vom Schrubben zum fertigen Schrubben zu erkennen . Angesichts dessen sollte der Rest an seinen Platz fallen.

Im Idealfall möchte ich sagen zpool scrub, dass ich nicht zurückkehren soll, bis das Peeling beendet ist, aber ich sehe keine Möglichkeit, dies zu erreichen. (Es würde es fast zu einfach machen, einfach zu cronen zpool scrub --wait-until-done $POOL; zpool status $POOL.)

Andernfalls möchte ich das System fragen, ob gerade ein Scrub ausgeführt wird, vorzugsweise auf eine Weise, die nicht zu riskant ist, mit einem Upgrade oder einer Konfigurationsänderung zu brechen, damit ich darauf reagieren kann, ob ein zuvor ausgeführt wird oder nicht Das Scrubben ist beendet (durch Ausführen eines Zpool-Status, wenn der Scrub-Status vom Scrubben zum Nicht-Scrubben wechselt).

Dieses spezielle Setup ist für ein Workstation-System vorgesehen. Während ein Überwachungstool wie Nagios wahrscheinlich Add-Ins enthält, die das Problem lösen würden, ist es ziemlich übertrieben, ein solches Tool nur für diese eine Aufgabe zu installieren. Kann jemand eine Low-Tech-Lösung für das Problem vorschlagen?

ein CVn
quelle

Antworten:

13

Unter ZFS Unter Linux kann dies ab Version 0.6.3 mit dem ZFS Event Daemon (zed) recht elegant gehandhabt werden . Der Ereignisdämon kann durch direkte Überwachung der Kernelereignisse fast sofort auf alle Ereignisse reagieren, die stattfinden, und hängt nicht von der kontinuierlichen Abfrage und Analyse der Ausgabe eines anderen Befehls ab.

Erstellen Sie ein Shell-Skript mit einem beliebigen Dateinamen, der mit /etc/zfs/zed.d/scrub.finish(z. B. scrub.finish-custom.sh) beginnt . Dieses Skript kann alle geeigneten Maßnahmen ergreifen, z. B. eine E-Mail senden, irgendwo einen Protokolleintrag schreiben oder das System zum Singen und Tanzen bringen (OK, vielleicht nicht). Es werden Beispiele bereitgestellt, die einen Ausgangspunkt bieten können.

Wenn Sie nach Abschluss des Scrubs nur eine E-Mail erhalten möchten, ist das bereitgestellte scrub.finish-email.shSkript genau das Richtige für Sie. Bearbeiten Sie einfach /etc/zfs/zed.d/zed.rc, um anzugeben, wohin die E-Mail gesendet werden soll und ob eine E-Mail gesendet werden soll, auch wenn im Pool keine Probleme auftreten. Stellen Sie sicher, dass scrub.finishin / etc. /zfs/zed.d führt dazu und stellen Sie sicher, dass zed beim Booten gestartet wird.

ein CVn
quelle
Für die aktuelle Implementierung siehe wiki.archlinux.org/index.php/ZFS#Monitoring_/_Mailing_on_Events
Stuart Cardall
3

Obwohl diese Frage spezifisch für Linux ist, ist sie das erste Google-Ergebnis bei der Suche nach "Warten, bis das Scrub abgeschlossen ist" . Daher möchte ich einige nützliche Informationen für Benutzer von OpenSolaris hinzufügen (getestet unter OmniOS, aber SmartOS, illumos usw.) sollte ähnlich sein) anstelle von Linux (normales Solaris sollte auch funktionieren, aber ich habe es dort nicht getestet).

Sie können syseventadmdamit Kernel-Ereignisse registrieren. Die vollständige Liste finden Sie in /usr/include/sys/sysevent/eventdefs.h(suchen Sie einfach in dieser Datei nach "ZFS"). Nach dem Hinzufügen von Ereignissen muss der Dienst neu gestartet werden, zum Beispiel:

syseventadm add -c EC_zfs -s ESC_ZFS_scrub_finish /path/to/script.sh \$pool_name
syseventadm restart

Auf diese Weise wird das Skript gestartet, wenn das Scrubben eines Pools abgeschlossen ist. Sie müssen im Skript überprüfen, ob es $1Ihrem gewünschten Poolnamen entspricht. Trotzdem ist der Aufwand viel geringer als beim Abrufen.

user121391
quelle
2

Ich verwende dieses einfache Skript zum Bereinigen von Statusberichten per E-Mail.

Wenn Sie Übergang zu erkennen , müssen von scrub runningzu scrub finishedwürde ich das überprüft stateFeld zpool statusausgegeben. Etwas wie das:

# start scrubbing 
zpool scrub ZPOOL

# wait till scrub is finished
while zpool status ZPOOL | grep 'scan:  *scrub in progress' > /dev/null; do
   echo -n '.'
   sleep 10
done

# send a report
zpool status | mail -s "zpool status: ZPOOL" RECIPIENT
dsmsk80
quelle
Ich habe mir den Code angesehen, aber es scheint, dass er Ihnen nur den Status gibt, wenn das Skript ausgeführt wird. Wie würde es mich benachrichtigen, wenn der Status von "Schrubben" zu "Fertig" wechselt?
Ein Lebenslauf
@ MichaelKjörling Das Skript wird nicht beendet, solange das Scrub ausgeführt wird, da die while ... doneSchleife genau auf diesen Zustand überprüft.
The-Wabbit
Ich denke, so etwas werde ich gehen. Sollte übrigens grep -qauch in Ihrem Shell-Skript-Snippet funktionieren, sodass Sie nicht nach / dev / null umleiten müssen. :)
ein CVn
Ja, ich habe es unter Solaris 10 mit POSIX grep getestet, dem diese Option fehlt.
dsmsk80
Ah, OK. GNU grep hat jedoch -q mit der gewünschten Semantik.
Ein CVn