Armadilloフォーラム

Armadillo-X1で、SD スロット拡張ボードがない場合の、カーネルが壊れた場合の復旧について

tsato_814

2022年6月17日 0時01分

お世話になります。
佐藤と申します。

当方では、Armadillo-X1 を使った IoT機器を生産させて頂いています。
カスタマイズされた、Linuxカーネルイメージを、
以下のようにして自社のwebサイトからダウンロードし、
書き換えています。

-------------------------------------------------------------
wget https://xxx.xxx/xxx/uImage -O /home/tmp/uImage
mount -t vfat /dev/mmcblk2p1 /mnt
cp /home/tmp/uImage /mnt/uImage
umount /mnt
-------------------------------------------------------------
(サイトのurlは伏せさせていただきました)

生産工場の都合により、ネットからは、
光回線 → ONU → 有線LAN → WiFiルータ → WiFi → PC → 有線LAN → Armadillo-X1
の経路でダウンロードしていますが、途中経路の不調により、
ダウンロードがうまくいかず、エラーとなった模様で
(なお、エラーとなった部分は、上記の前後にも数か所あったことを
実際に確認していますが、その際のログを保存しておらず、
記憶に頼っているのみです)、
それを気付かずにrebootしたところ、カーネルが壊れてしまったようで、
添付ファイルのようなメッセージが出力され、起動できませんでした。
(同様の現象が2台発生したため、1台目を「1台目の電源投入時画面出力.txt」、
2台目を「2台目の電源投入時画面出力.txt」としています。)

その対応として、
工場出荷イメージと同じイメージのインストールディスクイメージを作成し、
SDカードに書き込んで、インストールディスクを作り、ひとまず工場出荷状態に
復旧させてから、以降通常の作業することで、なんとかならないか、
と考えました。

ところが、Armadillo-X1 であるため、SDスロットがないわけですが、
動作する「SD スロット拡張ボード」も現在なくなってしまったため、
実際にはSDから復旧できない状況です。

U-Bootの環境変数のデフォルト値を変更することで、USBメモリから起動するように
変更する方法もある旨、拝見しましたが、
おそらく、あらかじめその変更をしていないと不可なのではと予想しています。

とりあえず、「SD スロット拡張ボード」を手配するよう動いていますが、
何か他に方法があるようでしたら、ご教示頂きたくお願い申し上げます。

なお、先程の画面出力の最後は、U-Boot コマンドプロンプトのようだったので、
試しに、各種U-Bootコマンドを入力した際の結果も、
「1台目のU-Bootコマンド入力時ログ.txt」と
「2台目のU-Bootコマンド入力時ログ.txt」に添付しておきます。

この際、helpコマンドを入力してみてわかったのですが、
「usbboot」というコマンドがあるらしいのですが、これを使ってUSBメモリから
インストールしたり、あるいはSDブートしたりできないか、
と淡い期待を抱いています。(「ums」コマンドも必要?)

コメント

at_akihito.irie

2022年6月17日 10時51分

入江です。

> 何か他に方法があるようでしたら、ご教示頂きたくお願い申し上げます。

カーネルイメージだけでしたら、以下の手順でUSBメモリ内のuImageを使用し
て(u-boot、dtb、rootfsはeMMC内のものを使用)起動できますのでお試しくだ
さい。

まず、適当なUSBメモリを用意します。
uImageが保存できればいいので容量は問いません。

そのUSBメモリをATDEなどでext4でフォーマットします。
以下はATDEに接続したUSBメモリが/dev/sdbとして認識された例です。
環境によって異なりますので、適宜読み替えてください。

[ATDE]$ sudo umount /dev/sdb[0-9] #マウントされていたらアンマウントします。
[ATDE]$ sudo mkfs.ext4 /dev/sdb1 #USBメモリの第1パーティションをext4でフォーマットします。

その後、sdb1にuImageを配置してください。

[ATDE]$ sudo mount /dev/sdb1 /mnt #USBメモリの第1パーティションを/mntにマウントします。
[ATDE]$ sudo uImage /mnt/ #起動できるuImageをUSBメモリに配置します。
[ATDE]$ sudo umount /mnt #USBメモリをアンマウントします。

USBメモリをArmadillo-X1に挿入し、u-bootで以下のコマンドを実行してください。
打ち間違いやすいのでコピーアンドペーストすることをおすすめします。

=> setenv loadimage ext4load usb 0:1 \${loadaddr} uImage
=> usb start
=> boot

これでuImageのみUSBメモリのものを使用して起動できるはずです。

起動したら、eMMC内のuImageを正しいものに書き換えて、USBメモリを抜いた
状態で正しく起動するかご確認ください。

上記手順ではsaveenvしていないので、次回起動時には環境変数は元に戻って
います。

入江様

アドバイスありがとうございます。佐藤です。
急遽の出張が入ったため対応できず、返事が遅れてしまい、申し訳ありません。

ご教示して頂いた通りやってみましたが、うまくいきませんでした。

その際のログを添付します。

もしかしたら、カーネルイメージだけではなく、
他の部分も壊してしまっていた可能性もあります。

前回書き忘れましたが、X1の型番は、「AX1110-U01Z」(メモリ 1GB、WLAN コンボ搭載)です。
拡張ボードは載っていません。

ログで気になるのは、
Booting from net ...
となっていることですが、
「usb start」実行時のメッセージからすると、
USBの番号の指定が違うとか?よくわかりませんが。
あとは、
** Unable to read file boot.scr **
とありますが、これは前回添付したログにもあったので
関係ないかもしれません。

お手数をおかけしますが、もし何かわかればアドバイス頂けると助かります。

ファイル ファイルの説明
USBメモリからブート?した際のログ.txt

佐藤です。

本件、自己解決したので追記します。

その後、SDスロット拡張ボードを入手し、SDカードで
インストールディスクを作成し、工場出荷状態に
復旧させることで、当初の目的は果たせたため、
しばらく放置となってしまいました。

ですが、ちょっと気持ちが悪いため、時間が空いてから
再度確認してみました。

結局、前回うまくいかなかったのは、使用したUSBメモリに
起因したものでした。

「usb start」実行時のメッセージにあるとおりで、
「unable to get device descriptor (error=-1)」
だったため、USBメモリを認識できていないようでした。

別のUSBメモリを使用することにより、入江様に頂いた
手順どおりに実行して、問題なく起動できましたし、
eMMC内のuImageを書き換えて、USBメモリを抜いた状態で
正しく起動できました。
(既に、不具合品はなおっていたので、わざと前回同様にして、
不具合を再現させておきました)

大変お騒がせしました、またありがとうございました。

(うまくいかなかったUSBメモリですが、Windowsではちゃんと
デスクリプタを取得できてるし、動作も問題なかったんですが…)

アットマークテクノの古賀です。

佐藤さん:
>本件、自己解決したので追記します。

解決したとのことで、何よりです。

>別のUSBメモリを使用することにより、入江様に頂いた
>手順どおりに実行して、問題なく起動できましたし、
>eMMC内のuImageを書き換えて、USBメモリを抜いた状態で
>正しく起動できました。

>(うまくいかなかったUSBメモリですが、Windowsではちゃんと
>デスクリプタを取得できてるし、動作も問題なかったんですが…)

差し支えなえれば、うまくいかなかった USB メモリの機種名を教えて頂けますか。
現在入手可能な製品であれば、再現確認してみようかと思います。

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

> 差し支えなえれば、うまくいかなかった USB メモリの機種名を教えて頂けますか。
メーカは、I-O DATAですが、機種名は残念ながらわかりません。
いつ買ったのかも覚えていません。

ちなみに、Windows SDKのツールであるUSBView.exeを使ったところ、
VID=0x04BB、PID=0x101Aであることがわかりました。

Descriptorの他の情報も見れるので、
USBViewでの出力も添付しておきます。

ファイル ファイルの説明
USBView_USBメモリ.JPG

アットマークテクノの古賀です。

佐藤さん:
>コメントありがとうございます。
>
>>差し支えなえれば、うまくいかなかった USB メモリの機種名を教えて頂けますか。
>メーカは、I-O DATAですが、機種名は残念ながらわかりません。
>いつ買ったのかも覚えていません。

了解しました。

>ちなみに、Windows SDKのツールであるUSBView.exeを使ったところ、
>VID=0x04BB、PID=0x101Aであることがわかりました。
>
>Descriptorの他の情報も見れるので、
>USBViewでの出力も添付しておきます。

0x04BB_0x101A の製品情報は、見当たらないですね。お役に立てず、ごめんなさい。
どちらかといえば興味本位での質問ですが、Armadillo-X1 で Linux を起動した後、その USB メモリを Armadillo-X1 に装着した場合も認識されないでしょうか?
もし、Linux だと認識されるのであれば u-boot の USB アクセス周りに要因があるのだと思います。

佐藤です。

> Linux を起動した後、その USB メモリを Armadillo-X1
> に装着した場合も認識されないでしょうか?
>
やってみました。
Linuxでは認識されますし、中身を読むことも問題なくできますね。

念の為、その状態で再度 u-bootを起動し、「usb start」を実行すると、
やはり同じエラーとなりました。

u-bootと、ある限定的なUSBメモリの間での問題かもしれません。
なので、これ以上深追いしてもしょうがないので、
ここで打ち切りたいと思います。

古賀さん、色々とありがとうございました。