Jak uruchomić polecenie po zakończeniu szorowania * ZFS *?

11

Chciałbym użyć crona, aby zaplanować okresowe szorowanie mojej puli ZFS, i w pewnym rozsądnym czasie po zakończeniu szorowania , wyślij mi e-mailem raport o stanie. Ma to na celu wychwycenie problemów bez konieczności ich ręcznego wyszukiwania (push zamiast pull).

Pierwsza część jest łatwa: wystarczy skonfigurować zadanie crona, aby działało zpool scrub $POOLjako root w dowolnym przedziale czasu, który jest rozsądny w mojej konkretnej sytuacji.

Druga część, nie jestem do końca pewien, jak to zrobić. zpool scrubnatychmiast wraca, a następnie szorowanie jest uruchamiane w tle przez system (co jest z pewnością pożądanym zachowaniem, jeśli szorowanie jest inicjowane przez administratora z terminala). zpool statusdaje mi raport o stanie i wychodzi (z kodem wyjścia 0, gdy szorowanie jest uruchomione; jeszcze się nie skończyło, więc nie wiem, czy status wyjścia zmienia się po zakończeniu, ale wątpię). Jedynym parametrem udokumentowanym dla szorowania zpool jest -s„zatrzymanie szorowania”.

Głównym problemem jest wykrycie zmiany statusu z szorowania na szorowanie zakończone . Biorąc to pod uwagę, reszta powinna się ułożyć.

Idealnie, chciałbym powiedzieć, zpool scrubżeby nie wracać, dopóki szorowanie się nie skończy, ale nie widzę żadnego sposobu, aby to zrobić. (Ułatwiłoby to po prostu cron zpool scrub --wait-until-done $POOL; zpool status $POOL.)

W przeciwnym razie chciałbym zapytać system, czy proces czyszczenia jest w toku, najlepiej w sposób, który nie powoduje zbyt dużego ryzyka zerwania z aktualizacją lub zmianą konfiguracji, dzięki czemu mogę podjąć decyzję, czy poprzednio działający szorowanie zostało zakończone (przez wykonanie statusu zpool, gdy stan szorowania zmienia się z szorowania na brak szorowania).

Ta szczególna konfiguracja dotyczy systemu stacji roboczej, więc chociaż narzędzie do monitorowania, takie jak Nagios, prawdopodobnie zawiera dodatki, które rozwiązałyby problem, wydaje się, że zainstalowanie takiego narzędzia tylko do tego jednego zadania jest przesadą. Czy ktoś może zasugerować rozwiązanie problemu niższej technologii?

CVn
źródło

Odpowiedzi:

13

W systemie ZFS W systemie Linux , począwszy od wersji 0.6.3, można to całkiem elegancko obsłużyć za pomocą demona zdarzeń ZFS (zed). Demon zdarzeń, dzięki bezpośredniemu monitorowaniu zdarzeń jądra, może niemal natychmiast reagować na wszelkie zdarzenia, które mają miejsce, i nie zależy od ciągłego odpytywania i analizowania wyników innych poleceń.

Utwórz skrypt powłoki o dowolnej nazwie pliku zaczynającej się od /etc/zfs/zed.d/scrub.finish(na przykład scrub.finish-custom.sh). Ten skrypt może podjąć dowolne odpowiednie działanie, takie jak wysłanie wiadomości e-mail, napisanie gdzieś wpisu w dzienniku lub zmusienie systemu do śpiewania i tańczenia (OK, może nie to). Podano przykłady, które mogą stanowić punkt wyjścia.

Jeśli wszystko, czego chcesz, to otrzymać wiadomość e-mail po zakończeniu czyszczenia, dostarczony scrub.finish-email.shskrypt zrobi to dobrze. Po prostu edytuj /etc/zfs/zed.d/zed.rc, aby wskazać, dokąd należy wysłać wiadomość e-mail i czy wiadomość powinna zostać wysłana również wtedy, gdy w puli nie występują żadne problemy, upewnij się, że w nazwie scrub.finish/ etc znajduje się nazwa Do tego prowadzi /zfs/zed.d i upewnij się, że Zed jest uruchamiany przy starcie systemu.

CVn
źródło
aktualną implementację można znaleźć na wiki.archlinux.org/index.php/ZFS#Monitoring_/_Mailing_on_Events
Stuart Cardall
3

Chociaż to pytanie jest specyficzne dla systemu Linux, jest to pierwszy wynik wyszukiwania Google podczas wyszukiwania „poczekaj, aż scrub zostanie zakończony” , dlatego chciałbym dodać kilka użytecznych informacji dla osób korzystających z OpenSolaris (przetestowałem go na OmniOS, ale SmartOS, illumos itp. powinien być podobny) zamiast Linuksa (normalne Solaris również powinno działać, ale tam go nie testowałem).

Możesz użyć syseventadmdo zarejestrowania zdarzeń jądra. Pełna lista znajduje się w /usr/include/sys/sysevent/eventdefs.h(wystarczy wyszukać „ZFS” w tym pliku). Po dodaniu zdarzeń usługa musi zostać zrestartowana, na przykład:

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

W ten sposób skrypt zostanie uruchomiony po zakończeniu szorowania dowolnej puli - musisz sprawdzić w skrypcie, czy $1jest równa żądanej nazwie puli. Mimo to jest o wiele mniej narzutów niż odpytywanie.

użytkownik121391
źródło
2

Używam tego prostego skryptu do szorowania raportów stanu przez e-mail.

Jeśli chcesz wykryć przejście od scrub runningdo scrub finished, sprawdziłbym statepole zpool statuswyjściowe. Coś takiego:

# 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
źródło
Spojrzałem na kod, ale wygląda na to, że daje on status tylko po uruchomieniu skryptu. Jak powiadomiłby mnie, gdy status zmieni się z „szorowania” na „skończony”?
CVn
@ MichaelKjörling skrypt nie skończy się, dopóki trwa szorowanie z powodu while ... donesprawdzania pętli dla tego stanu.
the-wabbit
Myślę, że coś takiego to pójdzie. Nawiasem mówiąc, grep -qpowinien również działać w twoim fragmencie skryptu powłoki, negując potrzebę przekierowania do / dev / null. :)
CVn
Tak, przetestowałem to na Solarisie 10 z POSIX grep, który nie ma tej opcji.
dsmsk80
Ach, okej. GNU grep ma jednak -q z pożądaną semantyką.
CVn