ブログ

Armadillo-840でUSBメモリ挿入を自動認識してスクリプトを実行する

at_takuya.sasaki
2015年11月30日 1時31分

Armadillo-400シリーズの実践開発ガイド第2部に載っている、以下のHowToを参考に、USBメモリを自動認識して、任意のスクリプトを実行してみました。 なお、とりあえずの動作確認のために、各スクリプトファイルを含んだユーザーランドイメージを作らずに、試してみます。

8.7.1. USBメモリを使用してのアップデート

1. /etc/udev/rules.d配下に rulesファイルを以下のように作成する

[root@armadillo840-0 (ttySC2) ~]# vi /etc/udev/rules.d/z99_usb_image_update.rules
 
KERNEL=="sd*[0-9]*", SUBSYSTEMS=="usb",ACTION=="add",RUN+="/etc/config/usb_action.sh start $KERNEL"
KERNEL=="sd*[0-9]*", ACTION=="remove", RUN+="/etc/config/usb_action.sh stop"

またはSUBSYSTEMSではなく、BUSでも同様に動作します。

[root@armadillo840-0 (ttySC2) ~]# vi /etc/udev/rules.d/z99_usb_image_update.rules
KERNEL=="sd*[0-9]*", BUS=="usb",ACTION=="add",RUN+="/etc/config/usb_action.sh start $KERNEL"
KERNEL=="sd*[0-9]*", ACTION=="remove", RUN+="/etc/config/usb_action.sh stop"

2. USBメモリを挿抜した際に呼び出されるスクリプトを作成します。

今回のスクリプトは、シリアルにコマンド名、パラメータを表示するだけにします。

[root@armadillo840-0 (ttySC2) ~]# vi /etc/config/usb_action.sh
#!/bin/sh
echo $0 $1 $2 > /dev/ttySC2
[root@armadillo840-0 (ttySC2) ~]# chmod +x /etc/config/usb_action.sh

なお、このスクリプトはudevdのバッググラウンドから呼ばれるのでechoとだけ書いても、シリアルにはログが出ません。 シリアルにログを出すには明示的に/dev/ttySC2などのシリアルコンソールを示すデバイスを指定しましょう。

また、明示的に先頭にシェルの指定 ( #!/bin/sh )をしてあげないとスクリプトの呼び出しに失敗し、/var/log/messagesに以下のログが出ます。

Jan  1 02:53:00 (none) daemon.err udevd-event[3823]: run_program: exec
of program '/etc/config/usb_action.sh' failed

3. udevdにrulesをリロードさせる

[root@armadillo840-0 (ttySC2) ~]# udevcontrol reload_rules

4. USBメモリを差します。

シリアルコンソール上に★で示す箇所が表示されていれば、スクリプトが実行されている証拠になります。

[root@armadillo840-0 (ttySC2) ~]# usb 1-1: new high-speed USB device
number 3 using rmobile-ehci-driver
scsi1 : usb-storage 1-1:1.0
scsi 1:0:0:0: Direct-Access     UFD 2.0  Silicon-Power8G  1100 PQ: 0 ANSI: 4
sd 1:0:0:0: [sda] 15730688 512-byte logical blocks: (8.05 GB/7.50 GiB)
sd 1:0:0:0: [sda] Write Protect is off
sd 1:0:0:0: [sda] No Caching mode page found
sd 1:0:0:0: [sda] Assuming drive cache: write through
sd 1:0:0:0: [sda] No Caching mode page found
sd 1:0:0:0: [sda] Assuming drive cache: write through
 sda: sda1
sd 1:0:0:0: [sda] No Caching mode page found
sd 1:0:0:0: [sda] Assuming drive cache: write through
sd 1:0:0:0: [sda] Attached SCSI removable disk
★ /etc/config/usb_action.sh start sda1

5. USBメモリを抜きます。

シリアルコンソール上に★で示す箇所が表示されていれば、スクリプトが実行されている証拠になります。

[root@armadillo840-0 (ttySC2) ~]# usb 1-1: USB disconnect, device number 3
★ /etc/config/usb_action.sh stop

以上