ハードディスクを追加すると、Udevルールはトリガーされません。

ハードディスクを追加すると、Udevルールはトリガーされません。

Ubuntu 20.04を使用しています。

UUIDでドライブを識別するudevルールを使用して特定のハードドライブを接続するときに操作を実行しようとしています。スクリプトは最終的にドライブをマウントし、rsync を実行するルーチンを実行します。プロセスのエラーを排除するために、現在テストコマンドを試しています。

ドライブがSATAホットスワップを介して接続され、正しいUUIDが確認されました。私はこの正確な構文を使用しているように見えるいくつかのガイドに従いましたが、何を試しても何も起こりません。

私が完了したステップは次のとおりです。

  • 90-backup.rulesというファイルが作成されます/etc/udev/rules.d。内容は次のとおりです。

ACTION=="add", ENV{ID_FS_UUID}=="b527aadc-9dce-4ead-8937-e53ca2cfac84", RUN+="/bin/echo 1 >> /rule.test"

  • 試験を終えた udevadm control --reload-rules && udevadm trigger

  • 試験を終えたsystemctl reload udev

  • 実行すると、udevadm test /dev/sdXルールファイルが一覧表示されていることがわかります。

Reading rules file: /etc/udev/rules.d/90-backup.rules

  • udevadm info /dev/sdXID_FS_UUID環境変数が正しく読み取り可能であることを確認するために使用されます。

  • KERNEL=='sd?'パラメータの前に追加してみてくださいACTION

現在サーバーを使用しているため、まだ再起動しようとしていません。適切なデバッグのために再起動せずに、udevがルールを正しく再ロードできるようにするために必要なものを一度に決定するのが最善です。

助けてくれてありがとう。

頑張ってください、アンドレアス

答え1

RUN+="/bin/echo 1 >> /rule.test

udev出力をリダイレクトしようとしないでください(ルールプロセスで完了すると実際には機能しないようですRUN)。代わりに、RUNプロセスにシェルスクリプトを使用して必要なコマンドを実行させます。

デバッグ中にスクリプトが動作するタイミングを追跡するのが便利な場合があるため、次のコードを保存してシェルスクリプトを作成します/usr/local/bin/myscript.sh(もちろん、必要な名前を付けます)。

#!/bin/sh
printf '%s\n' "Script run by udev $( date +%c )" > /tmp/rule-test

上記のスクリプトは、スクリプトが実行されるたびにディレクトリrule-test内のファイルに現在の時間を書き込みます。/tmpただし、スクリプトの実行権限を付与する必要があります。

sudo chmod +x /usr/local/bin/myscript.sh

次に、RUNセクションにスクリプトへのフルパスが含まれるようにudevルールを変更します。

ACTION=="add", ENV{ID_FS_UUID}=="b527aadc-9dce-4ead-8937-e53ca2cfac84", RUN+="/usr/local/bin/myscript.sh"

最後に、udevルールを再ロードします。

sudo udevadm control --reload

ハードドライブを接続し、時間が記録されていることを確認してください/tmp/rule-test

myscript.sh一度操作すると、他の必要な操作(実行など)を実行するように設定でき、rsyncudevルールを変更し続ける必要はありません。シェルスクリプトを変更するだけです。

udev再起動せずにルールを正しく再ロードするために必要なもの

使用sudo udevadm control --reload

関連情報