特定のハードドライブが接続されているときにプログラムを実行するにはどうすればいいですか (Debian の場合)?

特定のハードドライブが接続されているときにプログラムを実行するにはどうすればいいですか (Debian の場合)?

ドライブ (特定のドライブ、または任意のドライブ) がホットプラグされるたびに、特定のコマンドを自動的に実行したいと考えています。ヘッドレス Debian システムを実行しています。

もっと具体的に言うと、ドライブを自動マウントしたいのです。これは AutoFS でも可能ですが、これは Truecrypt ドライブなので、AutoFS は私の知る限りでは動作しません。そのため、ドライブが接続されるたびに、ドライブを検出して必要なコマンドを実行する何らかのスクリプトを実行する必要があります。

ドライブが接続されたときに自動的に何かを実行するにはどうすればよいでしょうか。また、ドライブが取り外されたときに別の何かを実行するにはどうすればよいでしょうか。

答え1

実際には非常に簡単です。カスタムudevルールを書く必要があります。

  /etc/udev/rules.d/10-local.rules

これを行う利点は、カスタム ルールが他のルールよりも先に読み取られることです。

このファイルには、この形式の1行が含まれます。

  <conditions to be met> KERNEL=="sd?1", NAME="my_usb_adapter", RUN+="/home/my_name/bin/my_program"

この意味は次のとおりです。

  1. 「満たすべき条件」とは、ディスクに固有のいくつかの条件であり、ディスクを一意に識別するため、別の HDD が挿入されてもアクションは実行されません。
  2. KERNEL=="sd?1" は、新しいパーティション /dev/sda1、/dev/sdb1 などが検出された場合にのみ、udev にこのルールのチェックを開始するように指示します。必要な場合は、パーティションではなくデバイスに対して同じことを行うことができます。その場合、KERNEL=="sd?" が適切なステートメントです。
  3. NAME="my_usb_adapter" は /dev/my_usb_adapter に永続ノードを作成するので、マウントする必要がある場合に、マウントするデバイスがどこにあるかがわかります。
  4. RUN ルールは自明です。my_program端末の入力や出力を必要とせずに実行可能にすることを忘れないでください。

次のコマンドを使用して、マッチングを実行するために必要な情報を取得できます。

 udevadm info -a -p $(udevadm info -q path -n /dev/sdb)

ディスクが/dev/sdbの場合は、そうでない場合は必要に応じて変更してください。これにより、大量の情報が提供されます。

  ATTRS{idVendor}=="18a5"
  ATTRS{idProduct}=="0302"
  ATTRS{serial}=="TT0E4E008XW3DT9H"

(これらの値は私の USB ドングルの 1 つの値であり、あなたの値は異なります)。重要な注意点が 1 つあります。マッチング ルールは同じ親デバイスから取得する必要があり、混在させることはできません。

最終的なルールは次のように記述できます。

 ATTRS{idVendor}=="18a5", ATTRS{idProduct}=="0302", ATTRS{serial}=="TT0E4E008XW3DT9H", KERNEL=="sd?1", NAME="my_usb_adapter", RUN+="/home/my_name/bin/my_program"

udev ファイルは改行できないことに注意してください。改行すると、udev は改行を 2 つの別々のルールとして認識します。端末には何も出力されません。また、、、およびを区別することに細心の注意を払っています。=この点で間違いがないようにしてください。==+=

関連情報