ブログ

Armadillo-X1,Armadillo-IoT G3/G3L: USBメモリが接続された時のイベントを検知する方法(その2)〜特定のUSBメモリを識別する〜

at_keita.mogaki
2018年1月29日 13時58分

1.はじめに

以前掲載しました「Armadillo-X1,Armadillo-IoT G3/G3L: USBメモリが接続された時のイベントを検知する方法」に続いて、特定のUSBメモリが接続されたタイミングで、アプリを実行する方法を紹介します。この方法を用いると、複数のUSBデバイスが接続されている環境でも重複することなく、特定のUSBメモリの接続を検知できるようになります。

今回は例として、特定のUSBメモリをArmadilloに接続した時に、任意のアプリを実行する方法を紹介します。

2.特定のUSBメモリを識別する方法

USBデバイスは、ベンダーIDとプロダクトID、シリアル番号を用いると、特定のUSBデバイスとして識別することが可能になります。
USBメモリのベンダーID、プロダクトID、シリアル番号を調べる手順を以下に記載します。

まず、ArmadilloにUSBメモリを接続してください。接続完了後、lsコマンドを用いてUSBメモリのデバイス名を確認します。

root@armadillo:~# ls /dev/sd[a-z]
/dev/sda
root@armadillo:~#

lsコマンドの実行結果より、USBメモリのデバイス名がsdaであることがわかります。

udevadm infoコマンドを用いて、接続したUSBメモリの情報を取得します。udevadm infoコマンドは、--attribute-walkオプションと--name=[デバイス名]を指定することで、指定されたデバイスの全てのsysfsプロパティを確認することができます。 今回は、'/devices/soc/30800000.aips-bus/30b10000.usb/ci_hdrc.0/usb1/1-1'のベンダーID(ATTRS{idVendor})、プロダクトID(ATTRS{idProduct})、シリアル番号(ATTRS{serial})の値を確認します。

root@armadillo:~# udevadm info --attribute-walk --name=/dev/sda
 
    〜 省略 〜
 
  looking at parent device '/devices/soc/30800000.aips-bus/30b10000.usb/ci_hdrc.0/usb1/1-1':
 
    ATTRS{idVendor}=="090c"                  # ベンダーID
    ATTRS{serial}=="13010115028000000734"    # シリアル番号
    ATTRS{idProduct}=="1000"                 # プロダクトID
 
    〜 省略 〜
 
root@armadillo:~#

udevadm infoコマンドの実行結果より、ベンダーIDが090c、プロダクトIDが1000、シリアル番号が13010115028000000734であることがわかりました。

3.udevのrulesファイルを修正する

前回作成した、udevのrulesファイルを修正します。

root@armadillo:~# vi /etc/udev/rules.d/10-device-connect-test.rules

rulesファイルは、先程取得したベンダーID、プロダクトID、シリアル番号を元に以下のように記述して下さい。

ACTION=="add", \
SUBSYSTEMS=="usb", \
ATTRS{idVendor}=="090c", \
ATTRS{serial}=="13010115028000000734", \
ATTRS{idProduct}=="1000", \
ENV{DEVTYPE}=="disk", \
RUN:="/etc/udev/device-connect-test.sh"

今回rulesファイルに追加した各キーの役割について、以下に説明を記載します。
・ATTRS:デバイスパスを上方に検索して、一致するsysfs属性値を持つデバイスを見つけます。今回はベンダーID、プロダクトID、シリアル番号を設定します。
・ENV:デバイス・プロパティキーに対する値を照合します。今回はUSBメモリ内でパーティションが作成されていた場合に、複数のイベントを取得してしまうことを防ぐために、DEVTYPEを設定しています。
※その他のキーの役割については、前回のブログに記載した「3.udevのrulesファイルを作成する」の内容を参照して下さい。

追加したrulesファイルを適応させます。

root@armadillo:~# udevadm control --reload

4.実行するシェルスクリプトの作成

USBメモリが接続された時に、実行するテストアプリを作成します。
前回のブログに記載した「4.実行するシェルスクリプトの作成」の内容を参照して、シェルスクリプトを作成して下さい。

5.動作確認

USBメモリをArmadilloに接続して下さい。USBメモリ接続後、/tmp/device-connect-test.logの内容を確認して下さい。

root@armadillo:~# cat /tmp/device-connect-test.log
Wed Jan 24 17:29:53 JST 2018 /dev/sda connect
root@armadillo:~#

問題なく設定が行われていると、USBメモリの接続された日時と対象のデバイス名が表示され、異なるUSBメモリを接続した時は、USBメモリの接続された日時と対象のデバイス名が表示されません。