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/sdX
ID_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
一度操作すると、他の必要な操作(実行など)を実行するように設定でき、rsync
udevルールを変更し続ける必要はありません。シェルスクリプトを変更するだけです。
udev
再起動せずにルールを正しく再ロードするために必要なもの
使用sudo udevadm control --reload
。