Armadillo-IoT G3L(など) のQSPIブートローダの環境変数をLinuxから変更

中村です。

Armadillo-IoT G3, G3L, X1 のQSPIブートローダ(U-Boot)の環境変数を
eMMCで起動しているLinuxから変更することはできるのでしょうか?

G3Lのケースをあけずに(シリアルコンソールは接続せずUSBメモリ使って)、
eMMCのルートファイルシステムやLinuxカーネルを一括で書き換える
ことはできないか?と、情報をさがしています。

USBメモリ起動によるMMCの書き換えについては、
このあたり↓を参考にしようとしています。

簡易的なインストールディスクイメージの作成方法
https://users.atmark-techno.com/blog/1913/2426

USBメモリにルートファイルシステムを構築する
https://users.atmark-techno.com/blog/53/2764

USBメモリを使用してeMMCのLinuxカーネル、ルートファイルシステムを更新する
https://users.atmark-techno.com/blog/53/2765

USBメモリで複数の機器に効率よく特定のLinuxカーネル、ルートファイルシステムを書きこむ方法
https://users.atmark-techno.com/blog/53/2802

--
なかむら

製品: 
Armadillo-X1
Armadillo-IoT G3L
Armadillo-IoT G3

溝渕です。

> Armadillo-IoT G3, G3L, X1 のQSPIブートローダ(U-Boot)の環境変数を
> eMMCで起動しているLinuxから変更することはできるのでしょうか?

上記を満たすユーザーインターフェースは用意していません。

U-Bootの環境変数を編集するためには、そのフォーマットを知っているドライ
バまたはアプリが必要になると思います。

OpenWrtであれば、uboot-envtoolsというツールがこれに該当します。ソース
の確認は行っていないので何とも言えませんが、これが移植できれば簡単に操
作可能と思います。

> G3Lのケースをあけずに(シリアルコンソールは接続せずUSBメモリ使って)、
> eMMCのルートファイルシステムやLinuxカーネルを一括で書き換える
> ことはできないか?と、情報をさがしています。

最終的な動作イメージをもう少し教えていただけますか?

「一括で書き換え」と「環境変数の変更」が繋がりません。
# 想像力不足で申し訳ございません。

中村です。

> OpenWrtであれば、uboot-envtoolsというツールがこれに該当します。ソース
> の確認は行っていないので何とも言えませんが、これが移植できれば簡単に操
> 作可能と思います。

情報、ありがとうございます。
調べてみます。

> 最終的な動作イメージをもう少し教えていただけますか?
>
> 「一括で書き換え」と「環境変数の変更」が繋がりません。

開発者ブログの
>> USBメモリを使用してeMMCのLinuxカーネル、ルートファイルシステムを更新する
>> https://users.atmark-techno.com/blog/53/2765
の記事に、デバッグシリアルコンソールのU-Bootのプロンプトで

=> setenv mmcroot /dev/sda1 rootwait rw

としてUSBメモリのルートファイルシステムから起動し、
eMMC上のLinuxカーネルとルートファイルシステムを更新する方法を
説明しています。

このブログのページではUSBメモリで起動した後、
手動で書き換えを行っていますが、別の記事
>> 簡易的なインストールディスクイメージの作成方法
>> https://users.atmark-techno.com/blog/1913/2426
にスクリプトを使った自動化(一括書き換え)の方法が紹介されています。

このようなUSBメモリを用意して装着後、
U-BootのプロンプトではなくLinuxからU-Bootの環境変数を
mmcroot=/dev/sda1 rootwait rw
となるように設定をしてrebootすれば、USBメモリから起動して、
自動的に(一括で)Linuxカーネルとルートファイルシステムを
書き換えることができるのではないかと考えました。

で、USB起動のインストールスクリプトの最後で、
mmcroot=/dev/mmcblk2p2 rootwait rw
となるように設定して、そのスクリプトでrebootもしてしまえば、
次に自動再起動したときには更新後のシステムになっている、と。

--
なかむら

溝渕です。

ご確認ありがとうございます。

ご教示いただいたように、「USBメモリが接続されていたら、USBメモリ内のイ
メージでオンボードROMを書き換える」という用途であれば、udevを使った実
装が考えられます。

USB memoryがaddされたタイミングで、インストールスクリプトを実行し、USB
メモリ内のrootfsにchrootして、USBメモリ内のイメージファイルを書き込む
ような構成はいかがでしょうか。

同一個体で何度も同一イメージをインストールするのを防ぐには、シリアル番
号等のユニークな情報をUSBメモリに保持しておくなどの実装が考えられます。

root@armadillo:~# cat /proc/cpuinfo | grep Serial
Serial : 2148

中村です。

お返事、ありがとうございます。

> メージでオンボードROMを書き換える」という用途であれば、udevを使った実
> 装が考えられます。

udevによる「USBメモリを装着したら・・・」というような方法は考えていません。
ですので、
> 同一個体で何度も同一イメージをインストールするのを防ぐには、シリアル番
も、必要ありません。

(udevも含めて)どうやって書き換え処理を起動させるかの問題ではなく、
どうやってeMMCのDebianルートファイルシステムを簡単に(ケースをあけたり、
シリアルコンソールをつないだりすることなく)書き換えできるか、です。

> メモリ内のrootfsにchrootして、USBメモリ内のイメージファイルを書き込む

USBメモリにchrootしてeMMCのルートファイルシステムの書き換えが
できるのなら、元の質問の「U-Bootの環境変数を・・・・」は必要ありませんので、
質問を取り消して、それを使おうかと思いますが・・・、

そうだとすると(chrootでOKだとすると)、マニュアルの
6.1.4.2. ルートファイルシステムの書き換え
https://manual.atmark-techno.com/armadillo-iot-g3l/armadillo-iotg-g3l_product_manual_ja-1.3.0/ch06.html#sct.update-software-debian-all
の次の記述は、必須ではないということでよろしいでしょうか?

1. eMMC上のルートファイルシステムを書き換えるには、SDブートを行う必要があります。
必ずSDブートで起動した事を確認の上、以降の手順を実施してください。・・・

--
なかむら

溝渕です。

> USBメモリにchrootしてeMMCのルートファイルシステムの書き換えが
> できるのなら、元の質問の「U-Bootの環境変数を・・・・」は必要ありませんので、
> 質問を取り消して、それを使おうかと思いますが・・・、

やってみたところ、eMMCから起動しているプロセスが邪魔をしてうまくいきません...。

mount /dev/mmcblk2p2 /mnt
cd /mnt
unshare --mount-proc=/
pivot_root . old-root/
chroot .
mount -o remount -t proc proc /proc
/etc/init.d/rcS

chrootした先からランレベルの変更が簡単にできなさそうで、
 rebootを除く終了スクリプトの実行 -> 起動処理
を実行できませんでした。

そのため、まずuboot-envtoolsの利用をご検討ください。

> そうだとすると(chrootでOKだとすると)、マニュアルの
> 6.1.4.2. ルートファイルシステムの書き換え
> https://manual.atmark-techno.com/armadillo-iot-g3l/armadillo-iotg-g3l_product_manual_ja-1.3.0/ch06.html#sct.update-software-debian-all
> の次の記述は、必須ではないということでよろしいでしょうか?
>

> 1. eMMC上のルートファイルシステムを書き換えるには、SDブートを行う必要があります。
> 必ずSDブートで起動した事を確認の上、以降の手順を実施してください。・・・
> 

上記、正しくは、「eMMC上のルートファイルシステムを書き換えるには、
rootfsがeMMCであってはいけません。」となります。マニュアルでは、rootfs
の配置デバイスがeMMC or SDなので上記のような記載となってしまっています。

rootfsがUSBメモリやNFSサーバ上にあっても、eMMCを書き換えることは可能で
す。

混乱を与えてしまい申し訳ございません。

中村です。

> やってみたところ、eMMCから起動しているプロセスが邪魔をしてうまくいきません...。

実際のテストまでしていただき、ありがとうございます。

> そのため、まずuboot-envtoolsの利用をご検討ください。

そうします。

> 上記、正しくは、「eMMC上のルートファイルシステムを書き換えるには、
> rootfsがeMMCであってはいけません。」となります。マニュアルでは、rootfs
> の配置デバイスがeMMC or SDなので上記のような記載となってしまっています。
>
> rootfsがUSBメモリやNFSサーバ上にあっても、eMMCを書き換えることは可能で
> す。

先ほどの投稿ではマニュアルのだけ引用しましたが、
このあたりのこと(USBメモリ上でも...)は、最初の投稿で書いておいた
>>USBメモリを使用してeMMCのLinuxカーネル、ルートファイルシステムを更新する
>>https://users.atmark-techno.com/blog/53/2765
の記事に

・・・インストールディスクを使用する方法では、SDカードを使用する必要がありますが、
なんらかの理由によりSDカードを使用せずUSBメモリを使用したい場合があるかと思います。
そのため、ここではUSBメモリを使用して、eMMCのLinuxカーネル、ルートファイルシステムを
更新する方法について紹介します。

との説明がありましたので、承知しておりました。

というか・・・、このブログの記事を見つけて、
「USBメモリから起動してインストールできるなら、ケース開けないでもなんとかなるかな?」
と思って、今回の質問になりました。

> 混乱を与えてしまい申し訳ございません。

いえいえ・・・
どうもありがとうございました。

--
なかむら

中村です。

教えていただいたuboot-envtoolsはまだ試してませんが、
アットマークテクノat_yuma.arakawaさんのブロクで、
こんなのを見つけました。
最近の記事のようです。

Armadillo-X1,Armadillo-IoT G3/G3L: U-Bootのデフォルトのパラメータ設定を変更する
https://users.atmark-techno.com/blog/1913/2894

ブートローダーはLinuxから書き換えできますから、
この方法でも私がやりたかったことが実現できそうです。

--
なかむら

中村です。

少し前(去年の11/14)の自分の投稿への自己レスです。
(自分のメモみたいなものなので、この投稿へのお返事は不要です)

> アットマークテクノat_yuma.arakawaさんのブロクで、
> こんなのを見つけました。
> 最近の記事のようです。
>
> Armadillo-X1,Armadillo-IoT G3/G3L: U-Bootのデフォルトのパラメータ設定を変更する
> https://users.atmark-techno.com/blog/1913/2894
>
> ブートローダーはLinuxから書き換えできますから、
> この方法でも私がやりたかったことが実現できそうです。

この14日の投稿のあと、ArmadilloブログやHowToに使えそうな記事がありました。

11/15の記事
Armadillo-X1, Armadillo-IoT G3/G3L: U-Bootブートスクリプト(boot.scr)の使い方
https://users.atmark-techno.com/blog/6938/2906
https://armadillo.atmark-techno.com/howto/u-boot-script

11/24の記事
Armadillo-IoT G3/G3L: JP1を設定せずにSDカード内のカーネルを起動する方法
https://users.atmark-techno.com/blog/7370/2918

この記事だけでは、boot.scrがイマイチ理解しきれてませんが、
このあたりの方法も使えそうです。

元々の私の質問を書いた理由は、
G3Lでケースを開けずに(SDカードを使わずシリアルコンソールも使わず)、
USBメモリを使ってエンドユーザにルートファイルシステム(eMMC)を
書き換えてもらう方法を探している、というものでした。

--
なかむら

中村様

古関です。

> 元々の私の質問を書いた理由は、
> G3Lでケースを開けずに(SDカードを使わずシリアルコンソールも使わず)、
> USBメモリを使ってエンドユーザにルートファイルシステム(eMMC)を
> 書き換えてもらう方法を探している、というものでした。

次のhowtoで、USBメモリにあるkernel/rootfsから起動する方法を紹介しています。
USBメモリを使ったイメージの書き換えは、これで達成できると思います。
https://armadillo.atmark-techno.com/howto/linux-kernel-usbboot

G3/G3Lでインストールディスクを動作させるには、
ケースを空けてJPを接続する必要があり手間なのと、
特に、Armadillo-X1では、SDコネクタが標準搭載されていないにも関わらず、
インストールディスクがSD起動という非常に使いにくい状況です。

それを補完する目的で、先月このhowtoを公開しました。

中村です。

古関さん、
> 次のhowtoで、USBメモリにあるkernel/rootfsから起動する方法を紹介しています。
> USBメモリを使ったイメージの書き換えは、これで達成できると思います。
> https://armadillo.atmark-techno.com/howto/linux-kernel-usbboot

追加の情報提供、どうもありがとうございます。

--
なかむら

中村です。

1年以上も前の質問でになりますが、次のようなものがありました。

私の質問:
> Armadillo-IoT G3, G3L, X1 のQSPIブートローダ(U-Boot)の環境変数を
> 起動しているLinuxから変更することはできるのでしょうか?

これに対して
> > OpenWrtであれば、uboot-envtoolsというツールがこれに該当します。ソース
> > の確認は行っていないので何とも言えませんが、これが移植できれば簡単に操
> > 作可能と思います。
というお返事をいただき、
> 情報、ありがとうございます。
> 調べてみます。
と書いていたのですが、必要がなくなったこともあり、
結局自分では調べていませんでした。

今日別の調べものをしていてたまたま、その後(2018/06/26)に書かれた
at_itoさんのブログの次の記事を見つけましたので、
このスレッドに張り付けておきます。
[Linux動作中に(SPIフラッシュに書かれた)U-Bootのパラメータを確認、変更する方法]
https://users.atmark-techno.com/blog/53/3323

--
なかむら