Armadilloフォーラム

USBによるアップデートができない

sho_oikawa

2016年10月3日 9時24分

お世話になっております。

Armadillo-440にて、Armadillo実践開発ガイド第二部の8.7.1に沿って
USBによるアップデートを試みたのですが、うまくいきませんでした。
USB自体は認識されているものの、取り付け、取り外しを行っても
何の反応も示さない様子です。

また、「df -h」コマンドの入力時、「図8.6 Armadillo-420のストレージ使用量」
のようにFilesystemsにudevが表示されていなかったのですが、
こちらは何か関係があるでしょうか。

そもそもudevdと呼ばれるものでアップデートを実行するとのことでしたが、
kernelなどでmake menuconfigする際に追加する必要などあるのでしょうか。
(ちなみにほぼ初期状態です。)

ご存知の方がいらっしゃいましたらご教授いただければと思います。
よろしくお願いいたします。

コメント

> Armadillo-440にて、Armadillo実践開発ガイド第二部の8.7.1に沿って
> USBによるアップデートを試みたのですが、うまくいきませんでした。
> USB自体は認識されているものの、取り付け、取り外しを行っても
> 何の反応も示さない様子です。

カーネルはデバイスを認識しているものの、udevが指定したスクリプトを
実行していないということですね?

udevがカーネルからイベントをもらっているか、udevadm monitor または、
udevmonitorで確認してみてください。(使っている udevのバージョンに
よります)

> また、「df -h」コマンドの入力時、「図8.6 Armadillo-420のストレージ使用量」
> のようにFilesystemsにudevが表示されていなかったのですが、
> こちらは何か関係があるでしょうか。

/dev に tmpfs が mountされていなくても、動くような気がしますが、
ごめんなさい覚えてないです。

リリースされているイメージでも、mount されていないのでしょうか?
お使いのブートローダー、カーネル、ユーザーランドのイメージファイルは
どれでしょうか?

> そもそもudevdと呼ばれるものでアップデートを実行するとのことでしたが、
> kernelなどでmake menuconfigする際に追加する必要などあるのでしょうか。

リリースされているイメージであれば、udevが動くためのカーネルの機能は
入っています。なので、menuconfigなどで追加する必要はありません。

> (ちなみにほぼ初期状態です。)

「ほぼ」ということは、なにか変更していると思うのですが、リリースされている
イメージに書き換えることは可能ですか?

コメントありがとうございます。

> カーネルはデバイスを認識しているものの、udevが指定したスクリプトを
> 実行していないということですね?
> udevがカーネルからイベントをもらっているか、udevadm monitor または、
> udevmonitorで確認してみてください。(使っている udevのバージョンに
> よります)

「udevmonitor」は使用できなかったため、「udevadm monitor」を使用してみました。
まだudevのモニター結果が読めるほど習熟していないこともあり、
とりあえずログを添付させていただきます。

> /dev に tmpfs が mountされていなくても、動くような気がしますが、
> ごめんなさい覚えてないです。
> リリースされているイメージでも、mount されていないのでしょうか?
> お使いのブートローダー、カーネル、ユーザーランドのイメージファイルは
> どれでしょうか?

どれでしょうか、とはバージョンのことでしょうか?
こちらでよろしいでしょうか。。。
Hermit-At v3.8.0
linux-3.14.36-at7(atmark@atde5)

> 「ほぼ」ということは、なにか変更していると思うのですが、リリースされている
> イメージに書き換えることは可能ですか?
Javaを使用しないため、その部分を消したくらいです。

以前、フォーラムにudevを動かすためのz99_usb_image_update.rulesの内容が間違っていた、という
情報が寄せられていたのでそちらも試してみましたが、やはり自動アップロードは始まりませんでした。

以上、よろしくお願いいたします。

ファイル ファイルの説明
USB抜き差し時動作.txt

> 「udevmonitor」は使用できなかったため、「udevadm monitor」を使用してみました。

ごめんなさい。スペルミスです。

> まだudevのモニター結果が読めるほど習熟していないこともあり、
> とりあえずログを添付させていただきます。

ログを見る限り、sdaの追加が見れますね
ということは、実行されてもおかしくないはずです。

RUNで指定されているファイルに実行権限がないとか?
RUNで指定するファイルは、実行ファイルであればなんでも良いです。
もちろん Shell scriptでも。

#!/bin/sh
 
touch /tmp/a

とだけ書いたシェルスクリプトを作成し、試してみてはいかがでしょうか?

# cat > /tmp/a.sh
#!/bin/sh
touch /tmp/a
Control-D
# chmod +x /tmp/a.sh
# udevadm control --reload-rules
 : # usb memoryの抜き差し
# ls /tmp/a

返信いただき、ありがとうございます。

> > まだudevのモニター結果が読めるほど習熟していないこともあり、
> > とりあえずログを添付させていただきます。
>
> ログを見る限り、sdaの追加が見れますね
> ということは、実行されてもおかしくないはずです。
>
> RUNで指定されているファイルに実行権限がないとか?
> RUNで指定するファイルは、実行ファイルであればなんでも良いです。
> もちろん Shell scriptでも。
>
>

> #!/bin/sh
> 
> touch /tmp/a
> 

>
> とだけ書いたシェルスクリプトを作成し、試してみてはいかがでしょうか?
>
>

> # cat > /tmp/a.sh
> #!/bin/sh
> touch /tmp/a
> Control-D
> # chmod +x /tmp/a.sh
> # udevadm control --reload-rules
>  : # usb memoryの抜き差し
> # ls /tmp/a
> 

上記のようにシェルスクリプト「/tmp/a.sh」を作成し、次に
z99_usb_image_update.rulesを以下のように修正し、USB抜き差しが発生したならば、
/tmp/aを作成するスクリプトを実行するようにしました。

KERNEL=="sd*[0-9]*",ENV{ID_BUS}=="usb",ACTION=="add",OPTIONS+="event_timeout=120",RUN+="/tmp/a.sh %k"
KERNEL=="sd*[0-9]*",ENV{ID_BUS}=="usb",ACTION=="remove",RUN+="/tmp/a.sh"

ルールを再度適用してUSBの抜き差しを発生させてみましたが、
aファイルは作成されておりませんでした。

sdaが追加されているような動作は毎回あるのですが、
肝心のスクリプトの動作は無いようです。。。

>

> KERNEL=="sd*[0-9]*",ENV{ID_BUS}=="usb",ACTION=="add",OPTIONS+="event_timeout=120",RUN+="/tmp/a.sh %k"
> KERNEL=="sd*[0-9]*",ENV{ID_BUS}=="usb",ACTION=="remove",RUN+="/tmp/a.sh"
> 

>
> ルールを再度適用してUSBの抜き差しを発生させてみましたが、
> aファイルは作成されておりませんでした。
>
> sdaが追加されているような動作は毎回あるのですが、
> 肝心のスクリプトの動作は無いようです。。。

上記のルールファイルにおいて、

KERNEL=="sd*",ENV{ID_BUS}=="usb",ACTION=="add",OPTIONS+="event_timeout=120",RUN+="/tmp/a.sh %k"
KERNEL=="sd*",ENV{ID_BUS}=="usb",ACTION=="remove",RUN+="/tmp/a.sh"

としたら挿入時、取り外し時、どちらでもa.shが動作し、/tmp/aが作成されていることが確認できました。
KERNELの部分がsdaであることが関係しているのでしょうか?
製品化した時にArmadillo毎に違う場合があると考えられるとすると、上記で十分だと言えるのか
不安です。。。

at_takashi.sasayama

2016年10月3日 16時02分

笹山です。

もしかして、パーティション未作成のUSBメモリでテストをされていますでしょうか?
先に、添付いただきましたログに sda1 の記述が一切なかったのでその点が気になりました。

パーティション未作成のUSBメモリを挿入すると以下の様に、sda1 が存在しないため、
正規表現の sd*[0-9]* に合致せず、スクリプトは実行されません。
今回変更なされた sd* は sda に合致するので実行されます。

scsi 8:0:0:0: Direct-Access              silicon-power    PMAP PQ: 0 ANSI: 0 CCS
sd 8:0:0:0: [sda] 3915776 512-byte logical blocks: (2.00 GB/1.86 GiB)
sd 8:0:0:0: [sda] Write Protect is off
sd 8:0:0:0: [sda] Mode Sense: 23 00 00 00
sd 8:0:0:0: [sda] No Caching mode page found
sd 8:0:0:0: [sda] Assuming drive cache: write through
sd 8:0:0:0: [sda] No Caching mode page found
sd 8:0:0:0: [sda] Assuming drive cache: write through
 sda:  ★ sda1 が存在しない
sd 8:0:0:0: [sda] No Caching mode page found
sd 8:0:0:0: [sda] Assuming drive cache: write through
sd 8:0:0:0: [sda] Attached SCSI removable disk

もしもパーティション未作成の場合は、作成後に試してみたら
正常に動作しないでしょうか?

溝渕です。

> パーティション未作成のUSBメモリを挿入すると以下の様に、sda1 が存在しないため、
> 正規表現の sd*[0-9]* に合致せず、スクリプトは実行されません。

udevのパターンマッチングは正規表現に似ている部分もありますが異なります。

以下、man udevより抜粋。

"*"
Matches zero or more characters.

"[]"
Matches any single character specified within the brackets. For
example, the pattern string "tty[SR]" would match either "ttyS" or
"ttyR". Ranges are also supported via the "-" character. For
example, to match on the range of all digits, the pattern "[0-9]"
could be used. If the first character following the "[" is a "!",
any characters not enclosed are matched.

なので、"sda", "sda1"などにマッチさせるのであれば、"sd*[!0-9]"などとするのが良いかと思います。debian環境だと、"/lib/udev"以下に置いてあるルールでこのようになっている場合が多いです。

以上です。

コメントありがとうございます。

> なので、"sda", "sda1"などにマッチさせるのであれば、"sd*[!0-9]"などとするのが良いかと思います。debian環境だと、"/lib/udev"以下に置いてあるルールでこのようになっている場合が多いです。

フォーマットし、まっさらな状態にしたUSBを使用してバージョンアップをすることが
多いと考えられますので、上記の内容でバージョンアップをしていきたいと思います。

タイムアウト時間を調整しないとudevでタイムアウトし、コマンド自体が
sigkillで殺されることはありましたが、無事バージョンアップすることができました。

アドバイスいただいた皆様、非常に助かりました。
ありがとうございました。