ZFS स्क्रब * पूरा होने पर * एक बार कमांड कैसे चलाएं?


11

मैं अपने ZFS पूल के आवधिक स्क्रबों को शेड्यूल करने के लिए क्रोन का उपयोग करना चाहूंगा, और कुछ समय के बाद स्क्रब खत्म होने के बाद खुद को स्थिति रिपोर्ट ईमेल करूंगा। इसका उद्देश्य किसी भी समस्या को पकड़ने के लिए मैन्युअल रूप से उन्हें देखने के लिए है (खींचने के बजाय धक्का)।

पहला भाग आसान है: zpool scrub $POOLमेरी विशेष परिस्थिति में जो भी अंतराल उचित है, उसे जड़ के रूप में चलाने के लिए बस एक क्रॉन जॉब सेट करें ।

दूसरा भाग, मुझे यकीन नहीं है कि कैसे करना है। zpool scrubतुरंत लौटता है और फिर सिस्टम द्वारा बैकग्राउंड में स्क्रब चलाया जाता है (जो निश्चित रूप से वांछनीय व्यवहार होता है अगर स्क्रब किसी टर्मिनल से व्यवस्थापक द्वारा शुरू किया गया हो)। zpool statusमुझे एक स्थिति रिपोर्ट देता है और बाहर निकलता है (बाहर निकलने के कोड 0 के साथ, जबकि स्क्रब चल रहा है; यह अभी तक समाप्त नहीं हुआ है, इसलिए मुझे नहीं पता है कि बाहर निकलने की स्थिति एक बार हो जाने के बाद बदल जाती है, लेकिन मुझे संदेह है)। ज़ूल स्क्रब के लिए प्रलेखित एकमात्र पैरामीटर -s"स्क्रबिंग बंद करो" के लिए है।

मुख्य समस्या स्क्रबिंग से समाप्त स्क्रबिंग तक स्थिति के परिवर्तन का पता लगा रही है । यह देखते हुए कि बाकी जगह गिरना चाहिए।

आदर्श रूप से, मैं यह बताना चाहूंगा कि zpool scrubजब तक स्क्रब खत्म नहीं हो जाता है, लेकिन मुझे ऐसा करने का कोई तरीका नहीं दिखता है। (यह केवल क्रोन को लगभग बहुत आसान बना देगा zpool scrub --wait-until-done $POOL; zpool status $POOL।)

असफल होना, मैं सिस्टम से पूछना चाहता हूं कि क्या वर्तमान में एक स्क्रब चल रहा है, अधिमानतः एक तरह से जो अपग्रेड या कॉन्फ़िगरेशन परिवर्तन के साथ बहुत अधिक जोखिम नहीं उठाता है, ताकि मैं पहले से चल रहे या नहीं स्क्रब समाप्त हो गया है (एक रस्सियों की स्थिति को निष्पादित करके जब स्क्रब स्थिति स्क्रबिंग से स्क्रबिंग तक नहीं जाती है)।

यह विशेष सेटअप एक वर्कस्टेशन सिस्टम के लिए है, इसलिए जबकि एक निगरानी उपकरण जैसे कि नागियोस में संभवतः ऐड-इन है जो समस्या को हल करेगा, यह सिर्फ एक काम के लिए इस तरह के टूल को स्थापित करने के बजाय ओवरकिल महसूस करता है। क्या कोई समस्या के कम-तकनीकी समाधान का सुझाव दे सकता है?

जवाबों:


13

पर ZFS पर लिनक्स , के साथ शुरू संस्करण 0.6.3 इस का उपयोग करके काफी सुंदर ढंग से संभाला जा सकता है ZFS घटना Daemon (जेड)। इवेंट डेमॉन, सीधे कर्नेल घटनाओं की निगरानी के आधार पर, किसी भी घटना पर लगभग तुरंत प्रतिक्रिया कर सकता है और किसी अन्य कमांड के आउटपुट के निरंतर मतदान और पार्सिंग पर निर्भर नहीं करता है।

किसी भी फ़ाइल नाम के साथ एक शेल स्क्रिप्ट बनाएं जो /etc/zfs/zed.d/scrub.finish(उदाहरण के लिए scrub.finish-custom.sh) से शुरू होती है । वह स्क्रिप्ट कोई उपयुक्त कार्रवाई कर सकती है, जैसे कि ईमेल भेजना, कहीं लॉग प्रविष्टि लिखना या सिस्टम को गाना और नृत्य करना (ठीक है, शायद ऐसा नहीं है)। उदाहरण दिए गए हैं जो एक प्रारंभिक बिंदु प्रदान कर सकते हैं।

यदि आप चाहते हैं कि जब स्क्रब पूरा हो जाए, तो एक ईमेल प्राप्त करना है, बशर्ते scrub.finish-email.shकि स्क्रिप्ट अच्छी तरह से करेगी। ईमेल भेजने के लिए इंगित करने के लिए /etc/zfs/zed.d/zed.rc को बस संपादित करें और कि क्या कोई ईमेल भी भेजा जाना चाहिए, यदि पूल किसी भी समस्या का अनुभव नहीं कर रहा है, तो सुनिश्चित करें कि कुछ का नाम scrub.finish/ आदि से पीछा किया जाए। /zfs/zed.d इसे ले जाता है, और सुनिश्चित करें कि बूट पर जेड शुरू हो गया है।


वर्तमान कार्यान्वयन के लिए wiki.archlinux.org/index.php/ZFS#Monitoring_/_Mailing_on_Events
स्टुअर्ट कार्डल

3

यद्यपि यह प्रश्न लिनक्स के लिए विशिष्ट है, "स्क्रब समाप्त होने तक प्रतीक्षा करें" की खोज करते हुए यह पहला Google परिणाम है , इसलिए मैं ओपनसोलारिस चलाने वाले लोगों के लिए कुछ उपयोगी जानकारी जोड़ना चाहूंगा (इसे ओमनीओएस पर परीक्षण किया गया, लेकिन स्मार्टओएस, इल्यूमिन आदि) लिनक्स के बजाय समान होना चाहिए) (सामान्य सोलारिस को भी काम करना चाहिए, लेकिन मैंने वहां इसका परीक्षण नहीं किया)।

आप syseventadmकर्नेल घटनाओं को पंजीकृत करने के लिए उपयोग कर सकते हैं । पूरी सूची में पाया जा सकता है /usr/include/sys/sysevent/eventdefs.h(बस इस फ़ाइल में "ZFS" के लिए खोज)। घटनाओं को जोड़ने के बाद, सेवा को फिर से शुरू करना होगा, उदाहरण के लिए:

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

इस तरह, स्क्रिप्ट तब शुरू की जाएगी जब किसी भी पूल के खत्म होने पर कोई स्क्रबिंग हो - आपको स्क्रिप्ट के अंदर चेक करना होगा कि क्या $1आपके पूल के नाम के बराबर है। फिर भी, यह मतदान की तुलना में बहुत कम है।


2

मैं ईमेल द्वारा स्थिति रिपोर्टिंग की स्क्रबिंग के लिए इस सरल स्क्रिप्ट का उपयोग करता हूं।

आप से संक्रमण का पता लगाने की जरूरत है scrub runningके लिए scrub finishedमैं जाँच करेगा stateके क्षेत्र zpool 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

मैंने कोड को देखा, लेकिन ऐसा लगता है कि यह केवल आपको स्क्रिप्ट चलाने पर स्थिति देता है। जब स्थिति "स्क्रबिंग" से "समाप्त" हो जाती है तो यह मुझे कैसे सूचित करेगा?
एक CVn

@ माइकलकॉर्ज़िंग स्क्रिप्ट तब तक खत्म नहीं होगी जब तक कि while ... doneइस बहुत ही स्थिति के लिए लूप की जाँच के कारण स्क्रब प्रगति पर है ।
वबबिट

मुझे लगता है कि ऐसा ही कुछ मैं करूँगा। वैसे, आपकी / grep -qउस शेल स्क्रिप्ट स्क्रिप्ट में भी काम करना चाहिए , जो कि / dev / null को रीडायरेक्ट करने की आवश्यकता को नकारता है। :)
एक CVn

हां, मैंने इसे POSIX grep के साथ Solaris 10 पर परीक्षण किया जिसमें इस विकल्प का अभाव है।
dsmsk80

आह अच्छा। ग्नू ग्रीप में वांछित शब्दार्थ के साथ -q है, हालांकि।
बजे एक CVn

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.