量産用インストールディスクの作成

本章では、開発を経て完成したソフトウェア含むArmadilloを量産するためにインストールディスクを作成する手順について説明します。 作成したインストールディスクを製造担当者に渡すことで、簡単かつミスも少なくArmadilloを量産することが可能です。

8.1. インストールディスクとは

インストールディスクイメージをmicroSDに書き込んだものがインストールディスクです。 インストールディスクイメージには、インストール先のArmadilloに書き込む任意のルートファイルシステム及びブートローダーと、イメージ書き換え用のスクリプトが組み込まれます。 SDブートでインストールディスクから起動することで、自動的にイメージ書き換えスクリプトが動作し、eMMC内のイメージを予めインストールディスクイメージに組み込んだ任意のOSやブートローダに書き換えることができます。

インストールディスクには2つの種類があります。

  1. 初期化インストールディスク

    これを用いてインストールを実行することで、対象のArmadilloのeMMC内のイメージを標準イメージに書き換えることができます。 主にArmadilloを初期化する際に使用します。 アットマークテクノが提供しているイメージですが、ユーザが同等のイメージを作成することも可能です。

  2. クローンインストールディスク

    開発完了後のArmadilloを複製する為にユーザが作成するインストールディスクです。 インストールディスクイメージには、開発完了後のルートファイルシステム、コンテナイメージやブートローダなどを組み込みます。

以下の手順ではクローンインストールディスクを作成し、製造の準備を行ないます。

[注記]

本ドキュメントでは紹介しませんが、初期化インストールディスクは、Armadilloが起動しなくなった場合などにeMMC内のイメージを標準イメージに書き換えるために使用されます。 詳細はArmadillo-IoT ゲートウェイ G4 製品マニュアルの「 Armadilloのソフトウェアの初期化」を参照してください。

8.2. インストールディスクを作成する準備を行なう

インストールディスク作成前にいくつかの前準備が必要なことがあります。 以下に必要な前準備とその手順について紹介しますので、クローン元のArmadillo上で作業を実施してください。

8.2.1. Armadillo Base OSの更新

基本的にArmadillo Base OSは常に最新版を使用することを推奨します。 開発中にArmadillo Base OSの新しいバージョンがリリースされている場合もありますので、クローンインストールディスクを作成する前にArmadillo Base OSのバージョンを最新版にしてください。

8.2.1.1. /etc/swupdate_preserve_fileへの追記

ここではSWUpdateというアップデート機能を使用してArmadillo Base OSのアップデートを行ないますが、このアップデートを行なうと、/etc/swupdate_preserve_filesに記載の無いファイルは消えてしまいます。 Armadillo Base OSのルートファイルシステム上に消えてほしくないファイルを開発中に配置していた場合は、図8.1「任意のファイルパスを/etc/swupdate_preserve_filesに追記する」に示すコマンドを実行することで/etc/swupdate_preserve_filesにそのファイルが追記され、アップデート後も保持し続けるようになります。

一部のファイルやディレクトリは初めから/etc/swupdate_preserve_filesに記載されている他、 podman commit したコンテナイメージについてもアップデート後に引き継がれるので、本ドキュメントのサンプルアプリケーションの場合は実行する必要はありません。

[armadillo /]# persist_file -p <ファイルのパス>

図8.1 任意のファイルパスを/etc/swupdate_preserve_filesに追記する


8.2.1.2. アップデートの実行

Armadillo-IoT ゲートウェイ G4 Armadillo Base OSから「Armadillo-IoT ゲートウェイG4用 SWUイメージイメージファイル」のURLをコピーして、図8.2「Armadillo Base OSをアップデートする」に示すコマンドを実行することでArmadillo Base OSを最新版にアップデートできます。

[armadillo /]# swupdate -d '-u https://armadillo.atmark-techno.com/files/downloads/armadillo-iot-g4/image/baseos-x2-[VERSION].swu'

図8.2 Armadillo Base OSをアップデートする


正常に実行された場合は自動的に再起動します。

8.2.2. SWUpdateの初期設定

これまでに一度もSWUpdateによるアップデートを行なっていない場合、「SWUpdateによる初回アップデート」の手順にしたがって初回アップデートを実行してください。

Armadillo Base OS搭載製品は、USBメモリにアップデートイメージを配置してArmadilloに接続することで、SWUpdateによるアップデートが行われます。 一度もSWUpdateを実行していない個体に関しては、第三者が作ったアップデートイメージであっても受け付けてしまいます。 そのため、初回アップデートを行なっていないArmadilloを量産して出荷することはとても危険です。

SWUpdateによる初回アップデートでは、自分以外が作成したアップデートイメージを受け付けなくするように設定します。

初回SWUpdate時に作成した認証鍵は、出荷後のリモートアップデートなどに使用できるため削除しないよう注意してください。

8.2.3. パスワードの確認と変更

Armadilloの各ユーザの初回ログイン時に、ログインパスワードを設定しました。 開発中はログインしやすいような単純なパスワードにしていることがよくあるので、製品に適用しないようにこのタイミングで強固なパスワードに変更しておきましょう。

[armadillo /]# passwd 1
Changing password for root
New password: 2
Retype password: 3
passwd: password for root changed by root

[armadillo /]# passwd atmark 4
Changing password for atmark
New password: 5
Retype password: 6
passwd: password for atmark changed by root

[armadillo /]# persist_file /etc/shadow 7

図8.3 パスワードを変更する


1

rootユーザのパスワードを変更します。

2

新しいrootユーザ用パスワードを入力します。

3

再度新しいrootユーザ用パスワードを入力します。

4

atmarkユーザのパスワードを変更します。

5

新しいatmarkユーザ用パスワードを入力します。

6

再度新しいatmarkユーザ用パスワードを入力します。

7

パスワードの変更を永続化させます。

8.2.4. 開発中のみ使用していたコンテナイメージの削除

開発中に使用していて運用時には不要なコンテナ及びコンテナイメージは、インストールディスク作成前に削除しておくべきです。

図8.4「作成済みコンテナ一覧を表示する」に示すコマンドを実行することで作成したコンテナの一覧を取得できます。

[armadillo /]# podman ps -a
CONTAINER ID  IMAGE                            COMMAND     CREATED        STATUS                    PORTS  NAMES
3ca118e9473b  docker.io/library/alpine:latest  /bin/sh     3 seconds ago  Exited (0) 3 seconds ago         vibrant_easley
9c908ab45ed8  localhost/abos-dev-guide:v1.0.0  /bin/bash   3 minutes ago  Exited (0) 5 months ago          sample_container

図8.4 作成済みコンテナ一覧を表示する


基本的に運用時におけるコンテナは/etc/atmark/containers/*.confファイルによって自動的に作成されますので、図8.4「作成済みコンテナ一覧を表示する」のコマンドによって取得したコンテナは全て削除して問題無いはずです。

[armadillo /]# podman rm sample_container 1
[armadillo /]# podman rm 3ca118e9473b 2
[armadillo /]# podman ps -a
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES
3

図8.5 コンテナを削除する


1

コンテナの名前で削除するコンテナを指定しています。

2

コンテナのIDで削除するコンテナを指定しています。

3

何も表示されず、全てのコンテナが削除されたことを確認します。

図8.6「コンテナイメージ一覧を表示する」に示すコマンドを実行することでコンテナイメージの一覧を取得できます。 readonly領域に保存されているコンテナイメージが1つでもある場合は、 R/O 列が表示されます。 R/O 列が表示されない場合は、全てのコンテナイメージの R/Ofalse であることを意味しています。

[armadillo /]# podman images
REPOSITORY                 TAG         IMAGE ID      CREATED       SIZE        R/O
docker.io/library/alpine   latest      6e30ab57aeee  2 weeks ago   5.56 MB     false
docker.io/library/busybox  latest      3c19bafed223  5 days ago    1.64 MB     true
localhost/abos-dev-guide   v1.0.0      2394ea5f177f  5 hours ago   932 MB      false

図8.6 コンテナイメージ一覧を表示する


ここでは運用時に必要な localhost/abos-dev-guide:v1.0.0 を除いた、その他のコンテナイメージを削除します。

R/Ofalse のイメージは podman rmi コマンドで削除できます。

[armadillo /]# podman rmi docker.io/library/alpine
Untagged: docker.io/library/alpine:latest
Deleted: 6e30ab57aeeef1ebca8ac5a6ea05b5dd39d54990be94e7be18bb969a02d10a3f

図8.7 R/Oがfalseのイメージを削除する


R/Otrue のイメージは abos-ctrl podman-rw rmi コマンドで削除できます。

[armadillo /]# abos-ctrl podman-rw rmi docker.io/library/busybox:latest
Untagged: docker.io/library/busybox:latest
Deleted: 3c19bafed22355e11a608c4b613d87d06b9cdd37d378e6e0176cbc8e7144d5c6

図8.8 R/Oがtrueのイメージを削除する


8.2.5. 開発したコンテナイメージをtmpfsに移行する

開発中は「開発前の準備」で行なったように、podmanのデータは電源を切っても保持されるようにeMMCに保存していました。 開発中はこのままで問題ありませんが、運用する場合にはeMMCへの書き込みを最小限にする観点から、podmanのデータの保存先をtmpfsに変更しておくことを推奨します。

図8.9「podmanのデータの保存先をtmpfsに変更する」に示すコマンドを実行することで、eMMCに保存されている開発完了後のコンテナイメージをtmpfsモードでも読み取り専用で使用できるように変更できます。

[armadillo /]# abos-ctrl podman-storage --tmpfs
List of images configured on development storage:
REPOSITORY                TAG         IMAGE ID      CREATED       SIZE
localhost/abos-dev-guide  v1.0.0      2394ea5f177f  5 hours ago   932 MB

What should we do? ([C]opy (default), [N]othing, [D]elete)
C 1
Delete subvolume (no-commit): '/mnt/containers_storage'
Replacing development images to readonly storage succeeded
Switching back to tmpfs container storage.
Successfully reverted podman storage to tmpfs

[armadillo /]# abos-ctrl podman-rw image list 2
REPOSITORY                 TAG         IMAGE ID      CREATED       SIZE
localhost/abos-dev-guide   v1.0.0      2394ea5f177f  5 hours ago   932 MB

図8.9 podmanのデータの保存先をtmpfsに変更する


1

C を入力しEnterを押下します。

2

tmpfsモードでコンテナイメージが読み込めていることを確認します。

8.3. 開発したシステムをインストールディスクにする

Armadillo Base OSでは、 abos-ctrl make-installer コマンドを実行することで、現在起動しているルートファイルシステム及びブートローダーをそのままインストールディスクイメージとして出力し、microSDカードに書き込むことができます。

abos-ctrl make-installer コマンドを実行する前に、Armadilloがインターネットに接続されており、かつmicroSDカードが挿入されていることを確認してください。 microSDカード内のデータはインストールディスク作成時に上書きされて消えてしまうので、必要なデータは予めバックアップを取っておいてください。

[armadillo /]# abos-ctrl make-installer
An installer system is already available on SD card. Use it? [Y/n] 1

Would you like to create a windows partition?
That partition would only be used for customization script at the end of
install, leave at 0 to skip creating it.
Custom partition size (MB, [0] - 30026): 500 2
Checking and growing installer main partition
GPT data structures destroyed! You may now partition the disk using fdisk or
other utilities.
The operation has completed successfully.
Trying to install mkfs.exfat (exfatprogs) in memory from internet
fetch http://pc-gtr.atmark.tech/products/yakushima/99_www/download/alpine/v3.16/atmark/aarch64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.16/main/aarch64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.16/community/aarch64/APKINDEX.tar.gz
(1/1) Installing exfatprogs (1.1.3-r0)
Executing busybox-1.35.0-r14.trigger
OK: 159 MiB in 215 packages
exfatprogs version : 1.1.3
Creating exFAT filesystem(/dev/mmcblk1p2, cluster size=32768)

Writing volume boot record: done
Writing backup volume boot record: done
Fat table creation: done
Allocation bitmap creation: done
Upcase table creation: done
Writing root directory entry: done
Synchronizing...

exFAT format complete!
Resize device id 1 (/dev/mmcblk1p1) from 400.00MiB to max
Currently booted on /dev/mmcblk2p1
Copying boot image
Copying rootfs
314572800 bytes (315 MB, 300 MiB) copied, 11 s, 28.5 MB/s
300+0 records in
300+0 records out
314572800 bytes (315 MB, 300 MiB) copied, 11.0192 s, 28.5 MB/s
Copying /opt/firmware filesystem
Copying appfs
At subvol app/snapshots/volumes
At subvol app/snapshots/boot_volumes
At subvol app/snapshots/boot_containers_storage
Cleaning up and syncing changes to disk...
Installer updated successfully!

図8.10 開発完了後のシステムをインストールディスクイメージにする


1

Enterキーを押下します。

2

インストールディスク内にインストールログを保存したい場合など、自由に使用できる第2パーティションを指定したサイズ作成します。詳細は「インストール時に任意のシェルスクリプトを実行する」を参照してください。

「Installer updated successfully!」と表示されれば、正常にmicroSDカードにインストールディスクイメージを書き込むことができています。 ArmadilloからmicroSDカードを抜去してください。

[警告]

これまでに一度もSWUpdateによるアップデートを行なっていない場合、 abos-ctrl make-installer 実行時に以下のようなエラーメッセージが出力され実行に失敗します。

ERROR: Refusing to build installer image with public onetime swupdate certificate installed
ERROR: Please install initial_setup.swu (from mkswu --init) first

このメッセージが出力された場合は、「SWUpdateによる初回アップデート」の手順にしたがって初回アップデートを実行してください。 SWUpdateによる初回アップデートでは、自分以外が作成したアップデートイメージを受け付けなくするように設定します。

Armadillo Base OS搭載製品は、USBメモリにアップデートイメージを配置してArmadilloに接続することで、SWUpdateによるアップデートが行われます。 一度もSWUpdateを実行していない個体に関しては、第三者が作ったアップデートイメージであっても受け付けてしまいます。 そのため、初回アップデートを行なっていないArmadilloを量産して出荷することはとても危険です。

[注記]

セキュリティーの観点から、インストールディスクによるインストール実行時に以下のファイルを再生成しております:

  • /etc/machine-id (ランダムな個体識別番号)
  • /etc/abos_web/tls (ABOS-Web の https 鍵)
  • /etc/ssh/ssh_host_*key* (ssh サーバーの鍵。なければ生成しません)ABOS 3.19.1-at.3 以降

8.3.1. インストール時に任意のシェルスクリプトを実行する

作成したインストールディスクの所定の場所に、 installer_overrides.sh というファイル名でシェルスクリプトを配置することで、インストール処理の前後で任意の処理を行なうことができます。

installer_overrides.sh に記載された表8.1「インストール中に実行される関数」に示す3つの名前の関数のみが、それぞれ特定のタイミングで実行されます。

表8.1 インストール中に実行される関数

関数名 備考

preinstall

インストール中、eMMCのパーティションが分割される前に実行されます。

postinstall

send_log関数を除く全てのインストール処理の後に実行されます。

send_log

全てのインストール処理が完了した後に実行されます。指定した場所にインストールログを保存できます。


installer_overrides.sh を書くためのサンプルとして、 インストールディスクイメージの第1パーティション及び、「開発したシステムをインストールディスクにする」で作成したのであれば第2パーティション直下に installer_overrides.sh.sample を用意してあります。 このサンプルをコピーして編集するなどして、行ないたい処理を記述してください。

作成した installer_overrides.sh は、インストールディスクの第1パーティション(ラベル名は"rootfs_0")か、「開発したシステムをインストールディスクにする」で作成したのであれば第2パーティション(ラベル名は"INST_DATA")の直下に配置することで実行されます。 両方に配置した場合は、第2パーティションに配置した記述が適用されます。

[ティップ]

インストールディスクの第1パーティションはbtrfs、第2パーティションはexfatでフォーマットされているため、第2パーティションのみWindows PCでもマウントして読み書きすることができます。

製造担当者が installer_overrides.sh を記述する場合に、仮にWindows PCしか作業環境がない場合でも、第2パーティションを作成しておくことで作業を行なうことができるというメリットもあります。

これを利用することで、複数台のArmadilloに対してそれぞれに異なる固定IPアドレスを設定したり、各種クラウドへの接続鍵などを個体ごとに配置したりしたいなど、個体ごとに異なる設定を行なうなど柔軟な製造を行なうことも可能です。 詳しくは「インストール時に任意の処理を行なう」で紹介します。

8.4. インストールディスクの動作確認

作成したインストールディスクの動作確認は必ず行なってください。 開発に使用したArmadillo以外の個体が必要になります。 また、インストール先のArmadilloのeMMC内のデータは上書きされて消えるため、必要なデータは予めバックアップを取っておいてください。

まず、インストール先のArmadilloにインストールディスクイメージを書き込んだmicroSDカードを挿入してください。 その後、JP1をショートさせてから電源を入れます。 Armadilloがインストールディスクから起動し、自動的にインストールスクリプトが動作します。

U-Boot SPL 2020.04-at8 (May 26 2022 - 08:44:15 +0000)
DDRINFO: start DRAM init
DDRINFO: DRAM rate 4000MTS
DDRINFO:ddrphy calibration done
DDRINFO: ddrmix config done
Normal Boot
Trying to boot from BOOTROM
image offset 0x8000, pagesize 0x200, ivt offset 0x0
NOTICE:  BL31: v2.4(release):lf-5.10.y-1.0.0-0-gba76d337e
NOTICE:  BL31: Built : 03:47:11, Dec 21 2021
: (省略)
Requesting system poweroff
[   23.441711] imx2-wdt 30280000.watchdog: Device shutdown: Expect reboot!
[   23.449006] reboot: Power down

図8.11 インストールディスク使用時のログ


しばらくすると「reboot: Power down」と表示されるので、Armadilloの電源を切ります。 その後ArmadilloからmicroSDカードを抜き、JP1をオープンにします。 再度電源を投入することで、インストールは完了です。

実際にクローンしたArmadilloが想定した通りの動作をすることを確認してください。

動作確認の際には、クローンしたArmadilloの起動時に図8.12「インストールに失敗したArmadilloに出力されるメッセージ」に示す末尾3行のWARNINGメッセージが出力されないことを必ず確認してください。

armadillo login: root
Password:
Welcome to Alpine!

The Alpine Wiki contains a large amount of how-to guides and general
information about administrating Alpine systems.
See <http://wiki.alpinelinux.org/>.

:(省略)

You can change this message by editing /etc/motd.
WARNING: swupdate onetime public certificate is present, anyone can access this device
WARNING: Please install initial_setup.swu (from mkswu --init),
WARNING: or remove the first certificate from /etc/swupdate.pem

図8.12 インストールに失敗したArmadilloに出力されるメッセージ


上記のメッセージが出力された場合は、インストールディスクによるイメージ書き込みが正しくできていません。 「インストールディスクを作成する準備を行なう」からインストールディスクの作成をやり直してください。