Armadilloフォーラム

Armadillo実践開発ガイド第8章に記載のudevルールについて

tetsuya.ooka

2014年9月19日 13時22分

お世話になっております。ロームの大岡です。

Armadillo実践開発ガイドの「第8章 8.7.1 USBメモリを使用してのアップデート」に記載されているudevのルール
「図8.13 USBメモリが接続された時にスクリプトを実行するudevルール(z99_usb_image_update.rules)」は
内容が間違ってはいませんか?

実際にこの通り試してみるとUSB取り外し時にスクリプトが実行されず、
以下のように修正すると期待通り動作しました。

KERNEL=="sd*[0-9]*",BUS=="usb",ACTION=="add",RUN+="/etc/config/usb_image_update.sh start $KERNEL"
KERNEL=="sd*[0-9]*",ACTION=="remove",RUN+="/etc/config/usb_image_update.sh stop"

メーリングリストにも以前に以下の投稿があって、
多分この人も実践開発ガイドを参考にして間違えてしまったのではないでしょうか。
[Armadillo:08908] シリアルUSBの挿抜のイベント取得について
http://lists.atmark-techno.com/pipermail/armadillo/2013-June/008911.html

コメント

毎度お世話様、伊澤@ITTOです。
この件、私の方でも丁度昨日引っ掛かりまして、やはり同じように解決しました。
まぁ、目的はアップデートではありませんでしたが。
ポイントは二点ですね。
・ダブルクォーテーションが余計
・ACTION="remove"にBUS指定は不要
重ねて報告まで。

at_daisuke.sasaki

2014年9月29日 11時29分

佐々木大輔です。

ご指摘ありがとうございます。

ACTION=”remove”の検出時にSYSFSのエントリを見にいく「BUS(SUBSYSTEMS *)」を指定するのは不適切ですね。
KernelからのUEVENTをudevdが受け取り、SYSFSを見に行った時には、
既にファイルが無くなってしまっているようです。

*: Armadilloのudevでは、BUSとSUBSYSTEMSのどちらでもルールが書けますが、
udev 174でBUSは削除され、SUBSYSTEMSでルールを記載するようになっています。

確実にUSBストレージが抜けた事を、条件に入れたい場合は、「DEVPATH」を入れると良いです。

KERNEL=="sd*[0-9]*", DEVPATH=="*usb*", ACTION=="remove", RUN+="/etc/config/usb_image_update.sh stop"

UEVENTに対しどのようなDEVPATHとなっているかは、
udevmonitor に「--env]オプションを付加する事で調べる事ができます。

[[armadillo ~]#  udevmonitor --env
udevmonitor prints the received event from the kernel [UEVENT]
and the event which udev sends out after rule processing [UDEV]
・・・省略・・・
UEVENT[947003397.256274] remove@/devices/platform/fsl-ehci.1/usb2/2-1/2-1:1.0/host56/target56:0:0/56:0:0:0/block/sda/sda1
ACTION=remove
DEVPATH=/devices/platform/fsl-ehci.1/usb2/2-1/2-1:1.0/host56/target56:0:0/56:0:0:0/block/sda/sda1
SUBSYSTEM=block
MAJOR=8
MINOR=1
DEVTYPE=partition
SEQNUM=3177
・・・省略・・・

余談になりますが、DEVPATHを以下のように書くと、USBストレージが抜けたポートも条件に入れる事ができます。

・Armadillo-440の下段のUSBストレージが抜けた事を検知しシェルスクリプトを動作させる

KERNEL=="sd*[0-9]*", DEVPATH=="/devices/platform/fsl-ehci.1/usb2/*", ACTION=="remove", RUN+="/etc/config/usb_image_update.sh stop"

・Armadillo-440の上段のUSBストレージが抜けた事を検知しシェルスクリプトを動作させる

KERNEL=="sd*[0-9]*", DEVPATH=="/devices/platform/fsl-ehci.0/usb1/*", ACTION=="remove", RUN+="/etc/config/usb_image_update.sh stop"

ご指摘いただいた、Armadillo 実践開発ガイド 第2部の記述については、
今後のアップデートで修正します。