次の問題があります。 LVMに暗号化されたLVを持つArchを実行しているコンピュータがあります。 (暗号化された)LVの内部には別のPVがあります。だから実際には2つのVGがあります。 1つは暗号化されていないデータを含み、もう1つは暗号化されたデータのみを含みます。
今は仕事がうまくなるように努力しています。暗号化されたボリュームのPVをスキャンしてインストールするスクリプトがあります。残念ながら、タイミングの問題により正常に動作しません。
私が知っている限り、私が電話しpvscan
たりディスクしたりするvgscan
とlvscan
、LVM署名が検索され、見つかったら新しいVGがアクティブになります。これはこれまで動作します。その後、udev
通知を受け取り、下に別のリンクを作成してください/dev
。残念ながら、これは非同期的に発生します。したがって、私のスクリプトは、ファイルシステムを確認/マウントするために必要なリンクが見つからずに実行され続けます。
だから私の質問は次のようになります
udev
すべてのリンクが作成され使用可能になるまで待つことはできますか?udev
パラメータ/環境変数/...でリンクされているすべてのスクリプトを呼び出すルールを登録できますか?- ブロックデバイス自体を介して
udev
作成されたリンクに一致するルールを登録できますか? vgscan
&Co.が終了して解決されるのを待つ方法はありますかudev
?
別の考えがあれば聞きたいです。
ベストアンサー1
設定が少し変わります(LVM内のLVM)。
一般的には、可能な限りudevに依存し、自分のスクリプトにあまり依存しないでください。つまり、ジョブをトリガーし、udev / systemdがイベントトリガー方式で残りを処理するようにします(一部のスクリプトでコマンドを順番に実行する代わりに)。 !また、「すべて」ではなく、お使いのデバイスのみがチェックされることに注意してください。
何が起こっているのかを理解するために読んで69-lvm-metad.rules
使用することもできます。udevadm monitor
しかし、私はまたあなたの質問のいくつかに答えます。
デバイスノードのスクリプトの実行
スクリプトを実行するには、RUN
udevルールで使用できます。これはRUN
非同期で実行中です。後ろにルールが処理されました(と比較PROGRAM
)。
ACTION=="add", KERNEL=="sdb", RUN+="/usr/local/bin/some_script"
udevは、udev-eventの変数に基づくKERNEL
環境変数を使用してスクリプトを呼び出します。ACTION
もちろん、シンボリックリンクを一致させることもできますが、操作を実行するには、シンボリックリンク名に依存するのではなく、実際のデバイスと一致させて追加で指定することもできます。これを使用して、udevadm monitor --property
その属性(固有IDなど)を含むさまざまなイベントを表示できます。そしてリンクが追加される予定なのでマッチングが難しい場合がありますので参考にしてください(直接確認できませんでした)。
SYMLINK
Match the name of a symlink targeting the node. It can be used once a SYMLINK key has been set in one of the preceding
rules. There may be multiple symlinks; only one needs to match.
udevイベントが処理されるのを待っています
udevadm settle
すべてのudevイベントが処理されるまでブロックされます。また、タイムアウトまたは特定のファイルが表示されるのを待つパラメータがありますが、ユースケースではパラメータなしで実行するだけで十分です。
引用するudevadm マンページ:
udevadm settle [options]
Watches the udev event queue, and exits if all current events are handled.