วิธีการรันคำสั่งเมื่อ ZFS ขัด * เสร็จสมบูรณ์ *?


11

ฉันต้องการใช้ cron เพื่อกำหนดตารางการขัดเป็นระยะของสระ ZFS ของฉันและในเวลาสั้น ๆ พอสมควรหลังจากการขัดเสร็จสิ้นส่งอีเมลรายงานสถานะถึงตัวฉันเอง วัตถุประสงค์ของการทำเช่นนี้คือการตรวจสอบปัญหาต่าง ๆ โดยไม่ต้องค้นหาด้วยตนเอง (ผลักดันแทนที่จะดึง)

ส่วนแรกนั้นง่าย: เพียงแค่ตั้งค่างาน cron เพื่อทำงานzpool scrub $POOLเป็น root ในทุกช่วงเวลาที่เหมาะสมในสถานการณ์เฉพาะของฉัน

ส่วนที่สองฉันยังไม่ค่อยแน่ใจว่าจะทำอย่างไร zpool scrubส่งคืนทันทีและจากนั้นระบบจะรันสครับในพื้นหลัง (ซึ่งเป็นพฤติกรรมที่พึงประสงค์อย่างแน่นอนหากผู้ดูแลระบบเริ่มต้นการสครับจากผู้ใช้) zpool statusให้รายงานสถานะและออก (พร้อมรหัสทางออก 0 ในขณะที่การขัดกำลังทำงานอยู่ แต่ยังไม่เสร็จดังนั้นฉันไม่ทราบว่าสถานะทางออกเปลี่ยนเมื่อเสร็จแล้ว แต่ฉันสงสัย) พารามิเตอร์เดียวที่บันทึกไว้สำหรับ zpool scrub คือ-s"หยุดการขัดถู"

ปัญหาหลักคือการตรวจสอบการเปลี่ยนสถานะจากการขัดถูเพื่อขัดสำเร็จรูป ระบุว่าส่วนที่เหลือควรตกอยู่ในสถานที่

เป็นการดีที่ฉันต้องการบอกzpool scrubไม่ให้กลับจนกว่าการขัดผิวจะเสร็จสิ้น แต่ฉันไม่เห็นวิธีที่จะทำเช่นนั้น (มันจะทำให้ง่ายเกินไปที่จะ cron ง่ายๆzpool scrub --wait-until-done $POOL; zpool status $POOL)

หากล้มเหลวฉันต้องการถามระบบว่ากำลังทำการขัดอยู่หรือไม่โดยเฉพาะอย่างยิ่งในวิธีที่ไม่เสี่ยงกับการอัปเกรดหรือการเปลี่ยนแปลงการกำหนดค่าเพื่อให้ฉันสามารถทำงานก่อนหรือไม่ การขัดเสร็จสิ้นแล้ว (โดยการดำเนินการสถานะ zpool เมื่อสถานะการขัดถูเริ่มตั้งแต่การขัดจนถึงการไม่ขัดผิว)

การตั้งค่านี้เฉพาะสำหรับระบบเวิร์กสเตชันดังนั้นในขณะที่เครื่องมือตรวจสอบเช่น Nagios อาจมีโปรแกรมเสริมที่จะแก้ปัญหาได้ก็รู้สึกค่อนข้าง overkill ในการติดตั้งเครื่องมือดังกล่าวสำหรับงานนี้ บางคนสามารถแนะนำวิธีการแก้ปัญหาที่ต่ำกว่าเทคโนโลยีได้หรือไม่?

คำตอบ:


13

บนZFS บน Linux การเริ่มต้นด้วยเวอร์ชัน 0.6.3สามารถจัดการได้ค่อนข้างหรูหราโดยใช้ZFS Event Daemon (zed) daemon ของเหตุการณ์โดยอาศัยการติดตามเหตุการณ์เคอร์เนลโดยตรงสามารถตอบสนองต่อเหตุการณ์ที่เกิดขึ้นเกือบจะทันทีและไม่ได้ขึ้นอยู่กับการสำรวจและการแยกวิเคราะห์อย่างต่อเนื่องของเอาต์พุตคำสั่งอื่น ๆ

สร้างเชลล์สคริปต์ด้วยชื่อไฟล์ใด ๆ ที่ขึ้นต้นด้วย/etc/zfs/zed.d/scrub.finish(ตัวอย่างเช่นscrub.finish-custom.sh) สคริปต์นั้นสามารถดำเนินการใด ๆ ที่เหมาะสมเช่นการส่งอีเมลเขียนรายการบันทึกที่ไหนสักแห่งหรือทำให้ระบบร้องเพลงและเต้น (ตกลงอาจไม่ใช่อย่างนั้นก็ได้) ตัวอย่างที่มีให้ที่สามารถให้เป็นจุดเริ่มต้น

หากสิ่งที่คุณต้องการคือการรับอีเมลเมื่อการขัดเสร็จสมบูรณ์scrub.finish-email.shสคริปต์ที่ให้ไว้จะทำอย่างนั้น เพียงแค่แก้ไข /etc/zfs/zed.d/zed.rc เพื่อระบุว่าควรส่งอีเมลไปที่ใดและควรให้ส่งอีเมลด้วยหรือไม่หากพูลไม่พบปัญหาใด ๆ ตรวจสอบให้แน่ใจว่ามีชื่อscrub.finishตามด้วยอะไรใน / etc /zfs/zed.d นำไปสู่มันและตรวจสอบให้แน่ใจว่า zed เริ่มทำงานเมื่อเริ่มระบบ


สำหรับการนำไปใช้ในปัจจุบันดูwiki.archlinux.org/index.php/ZFS#Monitoring_/_Mailing_on_Events
Stuart Cardall

3

แม้ว่าคำถามนี้จะเฉพาะกับ linux แต่เป็นผลการค้นหา google ครั้งแรกเมื่อค้นหา"รอจนกว่าการขัดจะเสร็จสิ้น"ดังนั้นฉันต้องการเพิ่มข้อมูลที่เป็นประโยชน์สำหรับผู้ที่ใช้งาน OpenSolaris (ทดสอบกับ OmniOS แต่ SmartOS, Illumos เป็นต้น . ควรเหมือนกัน) แทน Linux (ปกติ Solaris ควรทำงานเช่นกัน แต่ฉันไม่ได้ทดสอบที่นั่น)

คุณสามารถใช้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

@ MichaelKjörlingสคริปต์จะไม่เสร็จสิ้นตราบใดที่สครับกำลังดำเนินการเนื่องจากการwhile ... doneตรวจสอบลูปสำหรับเงื่อนไขนี้
the-wabbit

ฉันคิดว่านี่เป็นวิธีที่ฉันจะไป โดยวิธีการที่grep -qควรจะทำงานได้ดีในส่วนของเชลล์สคริปต์ของคุณโดยไม่ต้องการเปลี่ยนเส้นทางไปยัง / dev / null :)
CVn

ใช่ฉันทดสอบบน Solaris 10 ด้วย grep POSIX ซึ่งไม่มีตัวเลือกนี้
dsmsk80

อาโอเค. grep ของ GNU นั้นมี -q ด้วย semantics ที่ต้องการ
CVn

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.