量産用SWUイメージの作成

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

9.1. SWUイメージとは

Armadillo Base OSは、SWUpdateというアップデート機能を持っており、Armadillo内のLinuxカーネルイメージやユーザーランドなどを容易に書き換えることが可能です。 SWUイメージは、SWUpdateを行なうために必要なアップデート先のイメージなどが組み込まれたパッケージファイルを指します。

SWUイメージをArmadilloに適用する方法として、SWUイメージが書き込まれたUSBメモリやSDカードをArmadilloに挿入する方法や、ネットワーク経由でSWUイメージを取得する方法などがあります。 詳しくはArmadillo-IoT ゲートウェイ G4 製品マニュアルの「Armadilloのソフトウェアをアップデートする」を参照してください。 今回の例ではUSBメモリを用いた方法で進めていきます。

9.2. SWUpdateで量産を行なう際の流れ

アットマークテクノから出荷された量産向けのArmadilloは通常、標準イメージが初めから書き込まれています。 これをSWUpdateによってアップデートする形で、ユーザー製品の量産用のイメージを書き込みます。

SWUpdateを用いて量産時にイメージ書き込みを行なう際の、一般的な作業の流れは以下の通りです。

  1. 初回アップデート用SWUイメージの作成
  2. 書き込むイメージの準備
  3. descファイルの記述
  4. SWUイメージの作成
  5. SWUpdateのテスト

各手順については、以下で順番に説明します。

9.3. 初回アップデート用SWUイメージの作成

まず初めに、SWUpdateの初回アップデートの準備を行ないます。

一度もSWUpdateを実行していないArmadilloは、第三者が作ったSWUイメージであっても受け付けてアップデートを実行してしまいます。 そのため、初回アップデートを行なっていないArmadilloを使用した製品を量産して出荷することはとても危険です。 SWUpdateによる初回アップデートでは、Armadillo内に専用の認証鍵を配置し、自分が作成したSWUイメージ以外を受け付けなくするように設定しますので、必ず実行してください。

初回アップデート用SWUイメージの作成手順については、「SWUpdateによる初回アップデート」を参照して「2. mkswu の初期設定」までを実行してください。 今回は量産時に初回アップデートとソフトウェア書き込みを1度のSWUpdateで行なうため、今の段階ではinitial_setup.swuを生成した後にSWUpdateを実行する必要はありません。

9.4. 書き込むイメージの準備

次に、開発したソフトウェアをSWUイメージにしていきます。

SWUイメージはATDE上で作成するので、SWUイメージに組み込むファイルをATDE内に配置しておいてください。

以下では6章サンプルアプリケーションの作成で作成したソフトウェアをArmadilloに組み込むことを例として考えます。 最低限以下の2つをArmadilloに書き込むことで、起動時にアプリケーションを含むコンテナが自動的に実行されます。

  1. abos-dev-guide-v1.0.0.tar(動かしたいアプリケーションを含むコンテナイメージ)
  2. sample_container.conf(コンテナ自動実行用confファイル)

ここでは、これらのファイルをATDEに/home/atmark/mkswu/abos-dev-guideディレクトリを作成して配置しておきます。

[ATDE ~/mkswu/abos-dev-guide]$ ls
abos-dev-guide-v1.0.0.tar  sample_container.conf

図9.1 Armadilloに書き込みたいソフトウェアをATDEに配置


9.5. descファイルの記述

descファイルの記述方法などの詳細については、Armadillo-IoT ゲートウェイ G4 製品マニュアルの「mkswu の desc ファイル」を参照してください。

SWUpdate実行時に、「書き込むイメージの準備」で挙げたファイルをArmadilloに書き込むようなSWUイメージを生成します。

SWUイメージを作成するためには、SWUpdate時に実行する処理等を示したdescファイルを記述し、そのdescファイルを入力として mkswu コマンドを実行することで、SWUイメージが出来上がります。

本書のサンプルアプリケーションを例とすると、Armadillo-IoT ゲートウェイ G4においては以下のようなabos-dev-guide.descファイルを作成します。

[ATDE ~/mkswu/abos-dev-guide]$ cat abos-dev-guide.desc
swdesc_option component=abos-dev-container
swdesc_option version=1
swdesc_option POST_ACTION=poweroff 1

starting_cmd="cd /sys/class/leds/led1 && echo timer > trigger && echo 111 | tee delay_on > delay_off"
success_cmd="cd /sys/class/leds/led1 && echo none > trigger && cat max_brightness > brightness"
fail_cmd="cd /sys/class/leds/led1 && echo heartbeat > trigger"

swdesc_option NOTIFY_STARTING_CMD="$starting_cmd" 2
swdesc_option NOTIFY_SUCCESS_CMD="$success_cmd" 3
swdesc_option NOTIFY_FAIL_CMD="$fail_cmd" 4

swdesc_embed_container "abos-dev-guide-v1.0.0.tar" 5
swdesc_files --extra-os --dest /etc/atmark/containers/ "sample_container.conf" 6

図9.2 descファイルの記述例(Armadillo-IoT ゲートウェイ G4の場合)


1

SWUpdate完了後に電源を切るように設定します。

2

SWUpdate中にLED3を点滅させるように設定します。

3

SWUpdate成功時にLED3を点灯させるように設定します。

4

SWUpdate失敗時にLED3を周期的な2回の短点灯させるように設定します。

5

コンテナイメージファイルをSWUイメージに組み込み、Armadilloに転送します。

6

コンテナ自動起動用confファイルをArmadilloに転送します。

Armadillo-IoT ゲートウェイ A6Eの場合は、初めからSWUpdateの実行時にLEDが点滅する設定がされており、descファイルでLEDの設定を行なう必要がないため、以下のようなabos-dev-guide.descファイルとなります。

[ATDE ~/mkswu/abos-dev-guide]$ cat abos-dev-guide.desc
swdesc_option component=abos-dev-container
swdesc_option version=1
swdesc_option POST_ACTION=poweroff 1

swdesc_embed_container "abos-dev-guide-v1.0.0.tar" 2
swdesc_files --extra-os --dest /etc/atmark/containers/ "sample_container.conf" 3

図9.3 descファイルの記述例(Armadillo-IoT ゲートウェイ A6Eの場合)


1

SWUpdate完了後に電源を切るように設定します。

2

コンテナイメージファイルをSWUイメージに組み込み、Armadilloに転送します。

3

コンテナ自動起動用confファイルをArmadilloに転送します。

9.5.1. イメージ書き込み時にログを残したい場合

SWUpdateによるイメージ書き込み時にログを残したい場合には、abos-dev-guide.descを修正します。 前述の通り、Armadillo-IoT ゲートウェイ A6Eにおいては、初めからSWUpdateの実行時にLEDが点滅する設定がされており、descファイルでLEDの設定を行なう必要がないため、descファイルの記述も若干異なりますので、それぞれの記述例を以下に示します。

[ATDE ~/mkswu/abos-dev-guide]$ cat abos-dev-guide.desc
swdesc_option component=abos-dev-container
swdesc_option version=1
swdesc_option POST_ACTION=poweroff

starting_cmd="cd /sys/class/leds/led1 && echo timer > trigger && echo 111 | tee delay_on > delay_off"
success_cmd="mount -o rw,remount /dev/sda1 && 1
             cp /var/log/messages /mnt/messages.\$(date +%Y%m%d-%H%M%S).log && 2
             cd /sys/class/leds/led1 && echo none > trigger && cat max_brightness > brightness"
fail_cmd="cd /sys/class/leds/led1 && echo heartbeat > trigger"

swdesc_option NOTIFY_STARTING_CMD="$starting_cmd"
swdesc_option NOTIFY_SUCCESS_CMD="$success_cmd"
swdesc_option NOTIFY_FAIL_CMD="$fail_cmd"

swdesc_embed_container "abos-dev-guide-v1.0.0.tar"
swdesc_files --extra-os --dest /etc/atmark/containers/ "sample_container.conf"

図9.4 ログを残す際のdescファイルの記述例(Armadillo-IoT ゲートウェイ G4の場合)


1

USBメモリはreadonlyでマウントされているため、書き込みを許可して再マウントします。

2

/var/log/messagesをUSBメモリに保存します。

[ATDE ~/mkswu/abos-dev-guide]$ cat abos-dev-guide.desc
swdesc_option component=abos-dev-container
swdesc_option version=1
swdesc_option POST_ACTION=poweroff

success_cmd="mount -o rw,remount /dev/sda1 && 1
             cp /var/log/messages /mnt/messages.\$(date +%Y%m%d-%H%M%S).log && 2
             cd /sys/class/leds/sys && echo none > trigger && cat max_brightness > brightness" 3

swdesc_option NOTIFY_SUCCESS_CMD="$success_cmd"

swdesc_embed_container "abos-dev-guide-v1.0.0.tar"
swdesc_files --extra-os --dest /etc/atmark/containers/ "sample_container.conf"

図9.5 ログを残す際のdescファイルの記述例(Armadillo-IoT ゲートウェイ A6Eの場合)


1

USBメモリはreadonlyでマウントされているため、書き込みを許可して再マウントします。

2

/var/log/messagesをUSBメモリに保存します。

3

SWUpdate成功時にLED3を点灯させるように設定します。

上記の例では、SWUpdate成功時にログをUSBメモリ内に保存します。 失敗時にはログは保存されませんが、自動でpoweroffすることもないので、その場でシリアルインターフェース経由で原因を調査することができます。

9.6. SWUイメージの作成

「descファイルの記述」で作成したdescファイルと、initial_setup.descファイルからSWUイメージを生成し、USBメモリに書き込みます。

descファイルからSWUイメージを生成するには、 mkswu コマンドを実行します。 図9.6「mkswuコマンドの実行」は、initial_setup.descとabos-dev-guide.descからabos-dev-guide_setup.swuを生成をする例です。

[ATDE ~/mkswu/abos-dev-guide]$ mkswu -o abos-dev-guide_setup.swu \
../initial_setup.desc abos-dev-guide.desc

../initial_setup.desc を組み込みました。
abos-dev-guide.desc を組み込みました。
abos-dev-guide_setup.swu を作成しました。

図9.6 mkswuコマンドの実行


このように、複数のdescファイルをまとめてひとつのSWUイメージを作成することが可能です。 SWUpdate時には mkswu コマンドで指定した順番に実行されるので、図9.6「mkswuコマンドの実行」の例では、initial_setupの処理の後にabos-dev-guideの処理が実行されます。

生成されたabos-dev-guide_setup.swuをUSBメモリに書き込みます。 コマンド実行例を図9.7「各イメージをUSBメモリに配置」に示します。 書き込み先であるUSBメモリは/media/atmark/USBDRIVEにマウントされているものとします。

[ATDE ~/mkswu/abos-dev-guide]$ cp abos-dev-guide_setup.swu /media/atmark/USBDRIVE/

図9.7 各イメージをUSBメモリに配置


USBメモリをアンマウントした後に、ATDEからUSBメモリを取り外します。

[ATDE ~/]$ sudo umount /media/atmark/USBDRIVE
// 完了後にATDEからUSBメモリを取り外す

図9.8 USBメモリをアンマウント


9.7. SWUpdateの実行とテスト

ここまでの手順で作成したSWUイメージを実際に量産工程で使用する前に、誤ったイメージを書きこんでいないか、書き込んだイメージが正しく動作するかなどを確認するための十分なテストを必ず実施してください。 そのために一度初期状態のArmadilloを1台用意し、それに作成したSWUイメージを用いてSWUpdateを実際に実行してみることで、動作確認をしてみます。

9.7.1. SWUpdateの実行

標準イメージが書き込まれた初期状態のArmadillo-IoT ゲートウェイ G4を1台用意し、実際にSWUpdateを実行してみます。

Armadilloに電源ケーブルとSWUイメージが書き込まれたUSBメモリを接続します。

[注記]

量産時に行なう処理によっては他にも接続すべきものがある場合があります。 例えば、SWUpdate中にネットワーク経由でファイルを取得する処理がある場合にネットワークに接続するためにEthernetケーブルを接続しておく必要がある、シリアルインターフェースからのログを残す為にmicroUSBケーブルを接続する必要があるなど、実際の量産時の動きに合わせて必要なものを接続しておいてください。

USBメモリと電源ケーブルを接続し、電源を投入すると自動で起動してSWUpdateが開始されます。

「descファイルの記述」で紹介したdescファイルをもとに作成されたSWUイメージでは、SWUpdateの進捗によってLED3の状態が変化します。

SWUpdateの進捗とLED3の状態の対応表を表9.1「SWUpdateの進捗とLED3の状態の対応表」に示します。

表9.1 SWUpdateの進捗とLED3の状態の対応表

SWUpdateの進捗 LED3の状態

電源投入〜SWUpdate開始前

点灯

SWUpdate中

等間隔の点滅

SWUpdate成功

消灯(Armadilloの電源OFF)

SWUpdate失敗

周期的な2回の短点灯


SWUpdateが成功した場合、Armadilloの電源がOFFになりLED3が消灯します。 ArmadilloからUSBメモリを抜去してください。

SWUpdateが失敗した場合、LED3は周期的な2回の短点灯状態になり、電源は自動的にOFFになりません。 シリアルインターフェース経由でArmadilloを操作し、SWUpdateの実行ログから失敗原因を調査・修正して、再度お試しください。

9.7.2. SWUpdate後のテスト

SWUpdate後のArmadilloが正しく動作するか、実際に動かして確認してみます。

本ドキュメントの例では、HDMIモニタとUSBカメラを接続する必要があるので、電源投入前に接続しておきます。 ここはシステムによって異なりますが、可能であれば本番環境になるべく近い形でのテストをお勧めします。

再度電源を投入して、期待したアプリケーションが動作することを確認してください。

ここまで完了したならば、量産用のSWUイメージは完成です。