web-dev-qa-db-ja.com

ZFSスクラブが*完了*したら、コマンドを実行する方法は?

Cronを使用してZFSプールの定期的なスクラブをスケジュールしたいと思います。スクラブが完了した後、かなり短い時間に、ステータスレポートを自分宛にメールで送信します。これの目的は、手動でそれらを探すことなく(プルではなくプッシュ)問題をキャッチすることです。

最初の部分は簡単です。cronジョブをセットアップして、ルートとしてzpool scrub $POOLをrootとして実行し、特定の状況で妥当な間隔で実行します。

第二部、どうすればいいのかよくわかりません。 zpool scrubはすぐに戻り、システムによってバックグラウンドでスクラブが実行されます(スクラブが管理者によって端末から開始された場合、これは確かに望ましい動作です)。 zpool statusは、ステータスレポートを提供して終了します(スクラブの実行中に終了コード0で表示されます。まだ終了していないため、終了ステータスが変更されたかどうかはわかりませんが、疑問があります)。 zpool scrubについて文書化されている唯一のパラメーターは、 "stop scrubbing"の-sです。

主な問題は、ステータスの変化を srubbbing から finished scrubbing 。)に検出することです。その場合、残りは落ちる。

理想的には、zpool scrubにスクラブが完了するまで戻らないようにしたいのですが、それを行う方法がありません。 (単にzpool scrub --wait-until-done $POOL; zpool status $POOLをcronするだけではほとんど簡単になります。)

それができない場合は、システムに、スクラブが現在進行中かどうか、できればアップグレードまたは構成の変更によってリスクが高すぎないようにして、以前に実行されているかどうかに基づいて行動できるようにしたいと思います。スクラブが終了しました(スクラブステータスがスクラブから非スクラブに変わったときにzpoolステータスを実行することにより)。

この特定のセットアップはワークステーションシステム用であるため、Nagios おそらくなどの監視ツールには問題を解決するアドインがありますが、そのようなツールを単にインストールするのはやり過ぎですこの1つのタスク。 誰かが問題に対するローテクのソリューションを提案できますか?

11
a CVn

LinuxのZFSバージョン0.6.3以降、ZFSイベントを使用することで、これは非常にエレガントに処理できます。デーモン(zed)。イベントデーモンは、カーネルイベントを直接監視することにより、発生するすべてのイベントにほぼ即座に対応でき、他のコマンドの継続的なポーリングと解析に依存しません。出力。

/etc/zfs/zed.d/scrub.finishで始まる任意のファイル名でシェルスクリプトを作成します(たとえば、scrub.finish-custom.sh)。そのスクリプトは、電子メールの送信、どこかにログエントリの書き込み、システムの歌と踊りの作成など、適切なアクションを実行できます(OK、多分そうではありません)。開始点を提供できる例が提供されます。

スクラブが完了したときに電子メールを受信したいだけの場合は、提供されているscrub.finish-email.shスクリプトがそれを適切に実行します。 /etc/zfs/zed.d/zed.rcを編集して、電子メールの送信先と、プールで問題が発生していない場合に電子メールを送信するかどうかを指定するだけで、scrub.finishという名前が付いていることを確認してください/etc/zfs/zed.dにあるものによってそれが引き起こされ、ブート時にzedが開始されていることを確認します。

13
a CVn

この質問はLinuxに固有のものですが、"スクラブが完了するまで待機する"を検索したときの最初のgoogleの結果です。 Linuxの代わりにOmniOS、ただしSmartOS、illumosなどは同様です)(通常の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が目的のプール名と等しいかどうかをスクリプト内で確認する必要があります。それでも、それはポーリングよりもはるかに少ないオーバーヘッドです。

3
user121391

この簡単なスクリプトを使用して、ステータスレポートを電子メールでスクラブします。

scrub runningからscrub finishedへの遷移を検出する必要がある場合は、zpool status出力のstateフィールドを確認します。このようなもの:

# 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
2
dsmsk80

私は zfswatcher で多くの成功を収めてきました

1
ptman