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メモリの接続された日時と対象のデバイス名が表示されません。