udevルールを使用するには、/ dev / sdaと同じパスを取得する必要があります。

udevルールを使用するには、/ dev / sdaと同じパスを取得する必要があります。

/dev/sd*.

目標は、echo $...... > /var/.....値が保存されたらRUN + =を使用して別の操作を実行することです...必要に応じて取り出します。私の説明が明確であることを願っています。ありがとうございます。

この例では、現在のディスクへのパスを取得しようとしています/dev/sd*。 udevルールを使用して操作を実行します。

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_added.sh" SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_removed.sh" 

問題は、echo $ KERNEL> my-fileを使用して検索すると現在のディスクのパスが見つからないことです。到着したばかりのディスクでsmartctlコマンドを実行するには、この変数が必要です。

device_add.shの目的は、最後に接続されたディスクにsmartctl -a /dev/sd*置き換えることを除いて、コマンドを開始することです。今これは私の問題です。ルールによって検出された/dev/sd*最後に接続されたディスク/パスを復元する必要があります。udev

答え1

質問を正しく理解したかどうかはまだわかりません。

問題は、「udevルール内でRUNを使用してプログラムを実行すると、そのイベントに対してカーネルによって生成された実際のデバイスノードにどのようにアクセスしますか?」です。その場合は、ハードドライブを接続または取り外すときに、実際のカーネルデバイスを含むKERNEL環境変数(参考資料を参照)を確認してください。man udevsda

これがあなたが望むものではない場合は説明してくださいこれはなぜ必要ですか?/dev/sdaつまり、どの目的でどのようなことをしたいかを示します。また読んでくださいXYの問題


問題は、物理ディスクのイベントを追加するのではなく、USBデバイスのイベントを一致させることです(USBレベルでデバイスと通信でき、ディスクに限定されません)。あなたは次のようなものが必要です

KERNEL=="sd*", SUBSYSTEMS=="usb", ACTION=="add", ...

DEVTYPEがないかENV{DEVTYPE}="disk"

詳しくは、新しく作成されたノードへのフルパスを含める必要があるman udev環境変数もありますDEVNODE(テストされていません)。

最後にコマンドを実行するには、smartctl次の段落を覚えておいてください。RUNman udev

これは、非常に短期的に実行されるフォアグラウンドジョブでのみ使用できます。長期実行イベントプロセスは、そのデバイスまたはスレーブデバイスに対するすべての追加イベントをブロックできます。

デーモンや他の長期実行プロセスを開始することはudevには適していません。切り離されたかどうかにかかわらず、分岐されたプロセスはイベント処理が完了した後に無条件に終了します。

だからそれは決まりますあなたがやりたいことはsmartctlそれが正しい場所であるかもしれません。


ルールを試しましたが、機能しないためディスクが認識されず、スクリプトは実行されません。私はそれを試しましたが、うまくKERNEL=="sd[a-z]"いきませんでした。

これにより、ルールの他の部分が間違っています(たとえば、満たされていない追加条件)。udev追加すると、/dev/sd*ルールは次のようになります。KERNEL=="sd[a-z]" 〜するマッチ。

udevadm info -p /sys/class/block/sdx質問を編集し、ディスクを挿入した後に得られた情報を追加します/dev/sdxsdx必要に応じて交換)。現在使用されているが機能していないルールと比較してみてください。

関連情報