at_takuya.sasaki
2015年11月30日 1時31分
Armadillo-400シリーズの実践開発ガイド第2部に載っている、以下のHowToを参考に、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
以上