ZFS scrub * tamamlandığında * bir komut nasıl çalıştırılır?


11

ZFS havuzumun periyodik fırçalarını planlamak için cron kullanmak istiyorum ve fırçalama bittikten kısa bir süre sonra kendime bir durum raporu e-posta ile gönderin. Bunun amacı, herhangi bir problemi manuel olarak aramak zorunda kalmadan yakalamaktır (çekmek yerine itmek).

İlk bölüm kolay: sadece zpool scrub $POOLbenim özel durumumda makul olan herhangi bir aralıkta kök olarak çalışacak bir cron işi kurmak .

İkinci kısım, nasıl yapacağımdan pek emin değilim. zpool scrubhemen geri döner ve daha sonra fırçalama sistem tarafından arka planda çalıştırılır (fırçalama terminalden bir yönetici tarafından başlatıldığında kesinlikle arzu edilen bir davranıştır). zpool statusbana bir durum raporu verir ve çıkar (fırçalama çalışırken çıkış kodu 0 ile; henüz bitmedi, bu yüzden bittikten sonra çıkış durumunun değişip değişmediğini bilmiyorum, ama şüpheliyim). Zpool fırçalama için belgelenen tek parametre -s"fırçalamayı durdur" içindir.

Asıl sorun, fırçalamadan bitmiş fırçalamaya kadar durum değişikliğini tespit etmektir . Bu göz önüne alındığında, geri kalanı yerine oturmalıdır.

İdeal olarak, zpool scrubfırçalama bitene kadar geri dönmemesini söylemek isterdim , ancak bunu yapmanın herhangi bir yolunu göremiyorum. (Basitçe cron yapmak neredeyse çok kolay olurdu zpool scrub --wait-until-done $POOL; zpool status $POOL.)

Başarısız olursa, sisteme bir ovma işleminin halen devam edip etmediğini, tercihen bir yükseltme veya yapılandırma değişikliğiyle çok fazla risk kırmayacak şekilde sormak istiyorum, böylece daha önce çalışan olup olmadığına göre hareket edebilirim fırçalama bitti (fırçalama durumu fırçalamadan fırçalamaya değil, bir zpool durumu yürüterek).

Bu özel kurulum bir iş istasyonu sistemi içindir, bu yüzden Nagios gibi bir izleme aracı muhtemelen sorunu çözecek eklentilere sahip olsa da, sadece bu tek bir görev için böyle bir araç yüklemek oldukça aşırı hissettiriyor. Birisi soruna daha düşük teknolojili bir çözüm önerebilir mi?

Yanıtlar:


13

Açık ZFS On Linux ile başlayan sürümü 0.6.3 bu kullanarak oldukça zarif ele alınabilir (zed) ZFS Olay Daemon. Olay arka plan programı, çekirdek olaylarını doğrudan izleme sayesinde, gerçekleşen olaylara neredeyse anında tepki verebilir ve diğer komutların çıktılarının sürekli yoklanmasına ve ayrıştırılmasına bağlı değildir.

Herhangi bir dosya adıyla /etc/zfs/zed.d/scrub.finish(örneğin, scrub.finish-custom.sh) başlayan bir kabuk komut dosyası oluşturun . Bu komut dosyası, e-posta gönderme, bir yere günlük girişi yazma veya sistemi şarkı söyleyip dans etme gibi uygun herhangi bir eylemde bulunabilir (Tamam, belki bu olmayabilir). Bir başlangıç ​​noktası sağlayabilen örnekler verilmiştir.

Fırçalama tamamlandığında istediğiniz tek şey bir e-posta almaksa, sağlanan scrub.finish-email.shkomut dosyası bunu güzel bir şekilde yapar. Basitçe düzenlemek /etc/zfs/zed.d/zed.rc adlı emin bir şey yapmak, e-posta gönderilmesi gereken yere ve havuz hiçbir problem yaşanmaz ise email de gönderilmesi gerekmektedir belirtmek için scrub.finish/ etc şey tarafından takip /zfs/zed.d yol açar ve zed'in önyüklemede başlatıldığından emin olun.



3

Bu soru linux'a özgü olsa da, "fırçalama bitene kadar bekleyin" araması yapılan ilk google sonucudur , bu nedenle OpenSolaris çalıştıran insanlar için bazı yararlı bilgiler eklemek istiyorum (OmniOS, ancak SmartOS, illumos vb. Linux yerine (normal Solaris de çalışmalı, ama orada test etmedim).

syseventadmÇekirdek olaylarını kaydetmek için kullanabilirsiniz . Tam liste /usr/include/sys/sysevent/eventdefs.hşurada bulunabilir (sadece bu dosyada "ZFS" yi arayın). Etkinlik ekledikten sonra hizmetin yeniden başlatılması gerekir, örneğin:

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

Bu şekilde, herhangi bir havuzun ovulması bittiğinde komut dosyası başlatılır - komut dosyasının içinde $1istediğiniz havuz adına eşit olup olmadığını kontrol etmeniz gerekir . Yine de, yoklamadan çok daha az yük.


2

Bu basit komut dosyasını e-postayla durum bildirimini temizlemek için kullanıyorum.

Eğer geçişi algılamak gerekiyorsa scrub runningiçin scrub finishedde kontrol edeceğimi statealanını zpool statusçıkışı. Bunun gibi bir şey:

# 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

Ben koda baktım, ama sadece script çalıştırıldığında size durum veriyor gibi görünüyor. Durum "ovma" dan "bitmiş" e geçtiğinde bana nasıl bildirir?
CVn

@ MichaelKjörling komut dosyası, while ... donebu durum için döngü kontrolü nedeniyle fırçalama devam ettiği sürece bitmeyecektir .
the-wabbit

Bence böyle bir şey gideceğim yol. Bu arada, grep -qo kabuk komut dosyası snippet'inizde de çalışmalı ve / dev / null'a yönlendirme ihtiyacını ortadan kaldırmalıdır. :)
bir CVn

Evet, bu seçenekten yoksun POSIX grep ile Solaris 10 üzerinde test ettim.
dsmsk80

Ah tamam. Bununla birlikte GNU grep'te istenen semantikle -q vardır.
CVn

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.