Armadilloフォーラム

node-eyeを利用したArmadillo-IoT G3のOSアップデートについて

nko0012

2022年10月18日 10時05分

お世話になっております。
node-eyeを使ってArmadilloのOSアップデート機能を提供することを検討しております。

【背景】
現在、当方でカスタマイズしたインストールディスク(自前のソフトウェアや証明書などを入れた状態)を作成し、それをSDカードに焼き、Armadilloにインストールしてお客様に提供しようと考えています。
お客様提供後は定期的に自前のソフトウェアをリモートアップデートするような機能も入れ込む想定でいます。

【質問】
①node-eyeを使ったArmadilloのOSアップデートではルートファイルシステムの更新もできますか?
②①がYesの場合、全体の更新や一部パッケージのみの更新等の設定は可能ですか?

よろしくお願いいたします。

コメント

at_syunya.ohshio

2022年10月18日 11時27分

大塩です。

以下ご質問に回答致します。

> ①node-eyeを使ったArmadilloのOSアップデートではルートファイルシステムの更新もできますか?
Debian GNU/Linux ルートファイルシステム の更新をすることが可能です。
製品マニュアル「Debian GNU/Linux ルートファイルシステムをビルドする」を参考に、カスタマイズされたルートファイルシステムをビルドしていただき、作成されたファイルを node-eye の「ファームウェアアップデート」機能のユーザーランドに指定することでアップデートできます。

> ②①がYesの場合、全体の更新や一部パッケージのみの更新等の設定は可能ですか?
node-eye のアップデート機能は、指定されたカーネル/ユーザーランドの全体更新にのみ対応しております。
そのため、差分アップデートはできません。

以上です。

お返事ありがとうございます。
追加で教えてください。

【追加質問】
すでに運用されているAramadilloのOSアップデートをnode-eyeを活用して行った場合、全体更新ということですので、アップデート前に存在していた証明書やソフトも上書きされる認識で合ってますでしょうか?

【背景】
お客様先にArmadilloを提供後、お客様に認証情報等を入力してもらうことで、お客様ごとの証明書してArmadillo内に保持させることを想定しています(この証明書はインストールディスク内に事前に入れる証明書とは異なるユーザーユニークな証明書)
部分アップデートが可能であれば、工夫したらお客様用の証明書は残せるかなと思っていたのですが、全体更新となると、書き換えを想像しており上記の運用は難しいのかな?と思った次第です。

よろしくお願いいたします。

at_syunya.ohshio

2022年10月18日 15時31分

大塩です。

> すでに運用されているAramadilloのOSアップデートをnode-eyeを活用して行った場合、全体更新ということですので、アップデート前に存在していた証明書やソフトも上書きされる認識で合ってますでしょうか?
正確には、アップデートは以下のような処理が行われます。
・Linuxカーネルをアップデートする場合
 eMMCパーティション1に設置している「Linux カーネルイメージ/Device Tree Blob」の各ファイルが置き換わる
・Debian GNU/Linuxルートファイルシステム(ユーザーランド)をアップデートする場合
 eMMCパーティション2が指定したユーザーランドに更新される
eMMCメモリマップについては、製品マニュアル「ソフトウェア構成」をご確認ください。

背景に記載されているような運用をする場合、ユーザーユニークな証明書をユーザーランドのパーティションに置いている場合は上書きされてしまいます。
そのため、それ以外の領域や外部の領域(SDカード等)に保存してやれば消えることは無いはずです。
充分な動作確認の上、ご検討ください。

以上です。

ご丁寧に解説いただきありがとうございます。大分と理解が進みました。
ルートファイルシステムをアップデートする場合は上書きになるので、残しておきたいファイル等はどこかに退避させておく必要があるということですね。
最後に一点だけ教えてください。
node-eyeでアップデートを行う場合、SDカードは必要になりますでしょうか?

よろしくお願いいたします。

at_syunya.ohshio

2022年10月20日 14時54分

大塩です。

> 最後に一点だけ教えてください。
> node-eyeでアップデートを行う場合、SDカードは必要になりますでしょうか?
node-eye アップデートにSDカードは必要ありません。

以上です。

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

Node-eyeでは、ルートファイルシステムの置き換えがSDカードなどが不要でできるということかと思いますが、

以下の記事を見ますと、マニュアル「ルートファイルシステムの書き換え」はできませんと書かれております。apt-getコマンドを利用してくださいと。

https://armadillo.atmark-techno.com/blog/7370/3523

Node-eyeはどのようにしてルートファイルシステムの置き換えを行っているのでしょうか?

よろしくお願いします。

古関です。

initramfsを起動してルートファイルシステムを書き換えています。

SDカードを使う場合(インストールディスク)ではSD上に構築したルートファイルシステムで起動し
eMMC上のルートファイルシステムを初期化、書き換えを行っています。

node-eyeの場合、以下のような流れで書き換えを行います。

* eMMC上のDebianで起動しているとき
リモートアップデートの要求を受ける
ルートファイルシステムのアーカイブを一度ダウンロード
再起動

* initramfs(RAMDISK上のユーザーランド)で起動
eMMC上のルートファイルシステム初期化
ダウンロードしたアーカイブを展開
再起動してeMMC上のDebianで起動

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

ご回答ありがとうございます。
Node-eyeではinitramfsを起動してルートファイルシステムを置き換えている旨、理解しました。

以下の記事では、ルートファイルシステムを丸ごと置き換えすることを推奨していないように見えますが、
Node-eyeではinitramfsを利用して丸ごと置き換えしています。この辺の考え方はどう考えたらよいのでしょうか?
https://armadillo.atmark-techno.com/blog/7370/3523

例えば、apt-getコマンドだけではアップデートできるファイルに不足があるのでNode-eyeのやり方を推奨なのでしょうか?
よろしくお願いします。

古関です。

> 以下の記事では、ルートファイルシステムを丸ごと置き換えすることを推奨していないように見えますが、
> Node-eyeではinitramfsを利用して丸ごと置き換えしています。この辺の考え方はどう考えたらよいのでしょうか?
リモートで丸ごと書き換えを実行し(アップデート中の停電などで)失敗した場合、
遠隔地にある個体が起動できなくなったり、
ネットワーク接続できなくなったりするリスクがあります。

結果、システムが停止、現地回収を行ったりなどが必要になります。
このため通常は推奨しておりません。

一方、node-eyeでは、一括アップデートに失敗した場合
リカバリブートでネットワークにつながるところまでは戻りますので、
そこからリモートによる復旧作業が可能となります。

また、node-eyeには差分アップデート機能は標準ではありませんが、
任意コマンド実行機能をカスタムすることで対応はできます。

お客様で独自にapt repoにdebianパッケージを公開し、
任意コマンド実行でapt update/installする運用です。

よろしくお願いいたします。

satoshi.sa.aoki

2022年12月5日 7時59分

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

もう1点ご質問させてください。
Node-eyeのようなやり方(initramfsを利用したルートファイルシステム丸ごと置き換え)を自前で実装する方法についてマニュアルなどございますでしょうか?

よろしくお願いします。

古関です。

> もう1点ご質問させてください。
> Node-eyeのようなやり方(initramfsを利用したルートファイルシステム丸ごと置き換え)を
> 自前で実装する方法についてマニュアルなどございますでしょうか?

申し訳ありません。公開している情報はありません。

node-eye利用の有無にかかわらずinitramfsがいったん起動してから
debianが起動しますので、initramfs側に色々仕込むことで独自のアップデートを実装することは可能です。
(お客様での実装や動作検証が必要ですが。)

以下のinitramfsのcpioアーカイブを展開して中を見ると分かるのですが、
アーカイブの中にhook用のスクリプトがあります。
https://armadillo.atmark-techno.com/files/downloads/armadillo-iot-g3/so…

initramfs起動時に以下がcallされ
scripts/local-bottom/firmwareupdate

この中で/dev/mmcblk2p2(debianの配置先)にある
var/lib/node-eye/update-hook.shをcallします。

自前のアップデート実装を書いたupdate-hook.shを配置するのはどうでしょうか。

アップデート後はupdate-hook.shを消さないと起動のたびにアップデートがかかりますのでご注意ください。

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

ご返信ありがとうございます。
initramfs_x1-v2.1.0.cpio.gz(アーカイブ)をダウンロードしてscripts/local-bottom/firmwareupdateを確認できました。

実機(Armadillo IoT G3)の/var/lib/ には、node-eye/update-hook.shはなかったので、
作成し中身は以下にしまして、電源OFF/ONしてみたのですが、update-hook.shが呼ばれている形跡を確認できませんでした。

root@armadillo:~# cat /var/lib/node-eye/update-hook.sh
#!/bin/bash
 
echo @@ update-hook.sh called.
touch /root/hoge

何か上記のフック用のシェルを実行させるには実機に事前準備など必要でしょうか?

また、update-hook.shは、上記で教えていただいたNode-eyeの流れを参考にしますと、④~⑥を実施するイメージであってますか?

* eMMC上のDebianで起動しているとき
①リモートアップデートの要求を受ける
②ルートファイルシステムのアーカイブを一度ダウンロード
③再起動

* initramfs(RAMDISK上のユーザーランド)で起動
④eMMC上のルートファイルシステム初期化
⑤ダウンロードしたアーカイブを展開
⑥再起動してeMMC上のDebianで起動

よろしくお願いします。

古関です。

以下を試してみてもらえますでしょうか?
上手くいったら、起動時、シリアルコンソールにechoの内容が出力されます。

/var/lib/node-eye/update-hook.sh の内容
-------------------------------
#!/bin/sh

echo "#################### update-hook.sh called." > /dev/ttymxc4
-------------------------------

実行権限もつけておきます。(念のため)
chmod +x /var/lib/node-eye/update-hook.sh

initramfsはサイズを切り詰めているため、bashなかったかもしれません。

echoでコンソールに出ないかもしれません、シリアルポート(/dev/ttymxc4)にリダイレクトしています。

> また、update-hook.shは、上記で教えていただいたNode-eyeの流れを参考にしますと、④~⑥を実施するイメージであってますか?
はい。認識合っています。

古関です。

> initramfsはサイズを切り詰めているため、bashなかったかもしれません。

確認しましたが、busyboxなのでbash動きません。
また、coreutilsもbusybox版なのでdebianと比べると
オプション諸々少ないはずですのでご注意ください。

U-Bootのコンソールで 環境変数mmcrootを空にしてからbootすると、
Debianルートファイルシステムをmountできずにinitramfsでとどまります。

この状態でできること確認するのがよさそうです。

---------------------------------------------------
=> printenv mmcroot
mmcroot=/dev/mmcblk2p2 rootwait rw
=> setenv mmcroot
=> boot

... 省略...

(initramfs)
---------------------------------------------------

特別、推奨している方法ではございませんので
操作内容によってはeMMC内のイメージを破壊できてしまいます。
十分な検証等を行ってからご利用いただけばと思います。
(破壊しても、SDインストーラーで復旧はできますが)

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

早速のご返信まことにありがとうございます。
以下を試してみましたところ、起動時のシリアルコンソールにログを確認できました。

/var/lib/node-eye/update-hook.sh の内容
-------------------------------
#!/bin/sh

echo "#################### update-hook.sh called." > /dev/ttymxc4
-------------------------------

また、環境変数mmcrootを空にしてからbootする方法についてもご教授いただきましてありがとうございます。
実際にやってみたんですが、lsコマンドなどでファイル中身等が確認できずでした。。
大変恐縮ですが、以下のあたりを実装していく方法について補足いただけませんでしょうか?

* initramfs(RAMDISK上のユーザーランド)で起動
④eMMC上のルートファイルシステム初期化
⑤ダウンロードしたアーカイブを展開
⑥再起動してeMMC上のDebianで起動

よろしくお願いいたします。