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

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

Ich möchte cron verwenden, um regelmäßige Scrubs meines ZFS-Pools zu planen, und zwar zu einem einigermaßen kurzen Zeitpunktnach dem Peeling, mir selbst einen Statusbericht per E-Mail zu senden. Der Zweck besteht darin, etwaige Probleme zu erkennen, ohne manuell danach suchen zu müssen (Push statt Pull).

Der erste Teil ist einfach: Richten Sie einfach einen Cron-Job ein, der zpool scrub $POOLals Root in den für meine spezielle Situation sinnvollen Intervallen ausgeführt wird.

Beim zweiten Teil bin ich mir nicht ganz sicher, wie ich das machen soll. zpool scrubkehrt sofort zurück und dann wird der Scrub vom System im Hintergrund ausgeführt (was sicherlich ein wünschenswertes Verhalten ist, wenn der Scrub von einem Administrator von einem Terminal aus gestartet wird). zpool statusgibt mir einen Statusbericht und beendet sich (mit Exit-Code 0, während der Scrub ausgeführt wird; er ist noch nicht fertig, also weiß ich nicht, ob sich der Exit-Status ändert, wenn er fertig ist, aber ich bezweifle es). Der einzige für zpool scrub dokumentierte Parameter ist -sfür „Stopp des Scrubbings“.

Das Hauptproblem ist die Erkennung der Statusänderung vonSchrubbenZufertig schrubben.Wenn man das berücksichtigt, sollte der Rest seinen Platz finden.

Idealerweise würde ich sagen, zpool scrubdass nicht zurückgekehrt werden soll, bis der Scrub abgeschlossen ist, aber ich sehe keine Möglichkeit, das zu erreichen. (Es wäre fast zu einfach, einfach cron auszuführen 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, bei der kein allzu großes Risiko besteht, dass es durch ein Upgrade oder eine Konfigurationsänderung unterbrochen wird, sodass ich darauf reagieren kann, ob ein zuvor ausgeführter Scrub abgeschlossen ist oder nicht (indem ich einen Zpool-Status ausführe, wenn der Scrub-Status von „Scrubbing“ auf „Nicht-Scrubbing“ wechselt).

Dieses spezielle Setup ist für ein Workstation-System gedacht. Ein Überwachungstool wie NagioswahrscheinlichEs gibt zwar Add-Ins, die das Problem lösen würden, aber die Installation eines solchen Tools nur für diese eine Aufgabe erscheint eher übertrieben.Kann jemand eine einfachere Lösung für das Problem vorschlagen?

Antwort1

AnZFS unter Linux, beginnen mitVersion 0.6.3Dies kann recht elegant gehandhabt werden, indem man denZFS-Ereignisdaemon (zed).Da der Ereignisdaemon die Kernel-Ereignisse direkt überwacht, kann er nahezu sofort auf alle auftretenden Ereignisse reagieren und ist nicht auf die kontinuierliche Abfrage und Analyse der Ausgabe anderer Befehle angewiesen.

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

Wenn Sie nur eine E-Mail erhalten möchten, wenn der Scrub abgeschlossen ist, scrub.finish-email.sherledigt das bereitgestellte Skript dies problemlos. 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 der Pool keine Probleme aufweist. Stellen Sie sicher, dass ein Name scrub.finishgefolgt von irgendetwas in /etc/zfs/zed.d dorthin führt, und stellen Sie sicher, dass zed beim Booten gestartet wird.

Antwort2

Obwohl diese Frage spezifisch für Linux ist, ist sie das erste Google-Ergebnis bei der Suche nach„Warten Sie, bis das Peeling fertig ist“, daher möchte ich einige nützliche Informationen für Leute hinzufügen, die OpenSolaris (habe es auf OmniOS getestet, aber SmartOS, illumos usw. sollten ähnlich sein) statt Linux verwenden (normales Solaris sollte auch funktionieren, aber ich habe es dort nicht getestet).

Sie können syseventadmKernel-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 die Bereinigung eines Pools abgeschlossen ist. Sie müssen im Skript prüfen, ob es $1Ihrem gewünschten Poolnamen entspricht. Der Aufwand ist jedoch viel geringer als bei einer Abfrage.

Antwort3

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

scrub runningWenn Sie den Übergang von zu erkennen müssen, würde ich das Ausgabefeld scrub finishedprüfen . Etwa so:statezpool status

# 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

Antwort4

Neuere ZFS-Versionen haben genau das hinzugefügt, was der OP verlangt hat: use, -wum zu warten, bis scrub beendet ist, bevor man zurückkehrt. Beispiel:

zpool scrub tank -w ; zpool status tank | mail -s "report" [email protected]

verwandte Informationen