Armadilloフォーラム

リカバリーイメージの書き込み方法について

a2c-maru

2024年2月9日 21時32分

node-eyeマニュアル
Armadillo-IoT ゲートウェイ G3L
の「4.5.5. リカバリーイメージの書き込み方法」には、
node-eye と Webサーバによるリカバリーイメージの
書き込み方法が記載されていますが、

リカバリーイメージを(node-eyeを介さず)microSDで
書き込むことはできないでしょうか?

背景は次の通りです。
・エンドユーザーへの設置後の作業を最小限にしたい、
・設置前の準備段階で実施するとしても、
 必要な構成は極力シンプルにしたい。

期待としては、インストールディスクイメージと一緒に
書き込みたいです。

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

コメント

at_syunya.ohshio

2024年2月19日 15時05分

大塩です。

> リカバリーイメージを(node-eyeを介さず)microSDで
> 書き込むことはできないでしょうか?
>
> ・エンドユーザーへの設置後の作業を最小限にしたい、
> ・設置前の準備段階で実施するとしても、
>  必要な構成は極力シンプルにしたい。
>
> 期待としては、インストールディスクイメージと一緒に
> 書き込みたいです。

お待たせして申し訳ありません。

インストールディスクイメージ作成ツールを修正し、node-eye リカバリーイメージに対応するようにしました。
暫定版ではありますが、インストールディスクイメージ作成ツールのURLを添付しますのでこちらで動作確認をしてみてください。
https://download.atmark-techno.com/misc/forum/make_install_disk_image_n…

■使用方法
通常では sudo ./build.sh ... とするところを sudo ./build.sh -r ... とオプション設定することで、node-eye リカバリーイメージを書き込めるようになります。

sudo ./build.sh -r BOARD UBOOT KERNEL DTB USERLAND [RECOVERY] [RECOVERY_DTB] [RECOVERY_BOOTSCR] [BOOTSCR]

この内容で作成したインストールディスクイメージを使用すると、mmcblk2p3(リカバリーイメージ用パーティション)にリカバリーイメージが設置されます。

このインストールディスクイメージ作成ツールにつきまして、正式版は2月末リリースを予定しております。

以上です。

> インストールディスクイメージ作成ツールを修正し、node-eye リカバリーイメージに対応するようにしました。

ご対応いただき誠にありがとうございます。
お陰様で設置準備と導入までのプロセスをかなりシンプルにできそうです。

週明けにビルド作業があるため、ご対応いただいた新機能も試してみようと思うのですが、
その前に1点確認させてください。

> sudo ./build.sh -r BOARD UBOOT KERNEL DTB USERLAND [RECOVERY] [RECOVERY_DTB] [RECOVERY_BOOTSCR] [BOOTSCR]

[RECOVERY_DTB]の部分は、Webサーバに格納する場合と同じアーカイブの形(uImage.recovery.dtb.zip)でよいのでしょうか?

at_syunya.ohshio

2024年3月1日 15時56分

大塩です。

> > sudo ./build.sh -r BOARD UBOOT KERNEL DTB USERLAND [RECOVERY] [RECOVERY_DTB] [RECOVERY_BOOTSCR] [BOOTSCR]
>
> [RECOVERY_DTB]の部分は、Webサーバに格納する場合と同じアーカイブの形(uImage.recovery.dtb.zip)でよいのでしょうか?

node-eye マニュアルで armadillo_iotg_g3.dtb.recovery を uImage.recovery.dtb.zip にしていますが、この zip にする前のファイル armadillo_iotg_g3.dtb.recovery を指定してください。

以上です。

at_syunya.ohshio

2024年3月1日 16時35分

大塩です。

追記となりますが、RECOVERY_BOOTSCR が必要となりますので
以下を参考に作成して同様に書き込むと良いです。

以下は、node-eye を用いて リカバリーイメージを書き込んだ際、/dev/mmcblk2p3 パーティションに生成される boot.ser の例です。

setenv ne_main_boot echo nemainboot
setenv bootstate boot_state
setenv bootstatepart 1
setenv loadboot_state fatload mmc ${mmcdev}:${bootstatepart} ${loadaddr} ${bootstate};
setenv recoverypart 3
 
# recovery boot memory map (uboot text start from 0x9D80 0000)
#| start addr  | usage  | size |
#|-------------+--------+------|
#| 0x8800 0000 | uImage | 120M |
#| 0x8F00 0000 | fdt    | 2M   |
#| 0x8F20 0000 | initrd | 14M  |(unused)
 
setenv setrecovery echo Setting up recovery env... \; setenv mmcpart ${recoverypart} \; setenv image ${image}.recovery \; setenv fdt_addr 0x8F000000 \;setenv fdt_file ${fdt_file}.recovery \; setenv initrd_addr 0x8F200000 \; setenv loadaddr 0x88000000 ;
 
if run loadboot_state; then
 echo Compare boot_state...
else
 echo WARNNING: boot_state file not found. Generating boot_state file...
 # 0x2c302c30  means "0,0," in hex
 mw.l ${loadaddr} 0x2c302c30
 #TODO: calc MD5 checksum in ascii and write boot_state
 fatwrite mmc ${mmcdev}:${bootstatepart} ${loadaddr} ${bootstate} 0x4
fi
 
#GET value of try
kernel_try=1
mw ${fdt_addr} 0x30 #write "0 (=0x30)" for compare
if cmp.b ${fdt_addr} ${loadaddr} 1; then
 kernel_try=0
fi
 
#GET value of success
kernel_success=1
mw ${fdt_addr} 0x30 #write "0 (=0x30)" for compare
setexpr success_addr ${loadaddr} + 2
if cmp.b ${fdt_addr} ${success_addr} 1; then
 kernel_success=0
fi
 
echo DEBUG:KERNEL_TRY is ${kernel_try}
echo DEBUG:KERNEL_SUCCESS is ${kernel_success}
 
# Selection MAIN or RECOVERY kernel image
#| try | success | stete                                     |
#|-----+---------+-------------------------------------------|
#|   0 |       0 | First time boot; try=1,   main boot       |
#|   1 |       1 | Successfully boot before; main boot       |
#|   1 |       0 | Failed boot before;       recovery boot   |
#|   0 |       1 | Invalid "boot_state";     recovery boot   |
 
if itest ${kernel_success} == ${kernel_try}; then
 if itest ${kernel_try} == 0; then
  echo First time boot after update
  run loadboot_state
  mw.b ${loadaddr} 0x31 # 0x31 means ascii "1"
  fatwrite mmc ${mmcdev}:${bootstatepart} ${loadaddr} ${bootstate} ${filesize}
 fi
 echo *MAIN KERNEL BOOT*
 # MAIN KERNEL BOOT routine has fall through below.
else
 echo *RECOVERY KERNEL BOOT*
#TODO: increace fdtaddr and initrdaddr before loading recovery (big) kernel
 run setrecovery
fi
 
#MAIN BOOTCMD
mmc dev ${mmcdev};
if mmc rescan; then
 if run loadimage; then
   run mmcboot;
 fi
   echo WARNNING: MAIN KERNEL NOT FOUND
   echo *RECOVERY KERNEL BOOT*
   run setrecovery
fi
 
mmc dev ${mmcdev};
if mmc rescan; then
 if run loadimage; then
   run mmcboot;
 fi
fi
 
echo "No kernel found"

以上です。