開発の基本的な流れ

9.1. Armadilloへの接続

9.1.1. シリアルコンソール

Armadillo-IoT ゲートウェイ A6EではCON7 (USBコンソールインターフェース)をシリアルコンソールとして使用できます。シリアル通信設定等については、「シリアル通信ソフトウェア(minicom)の使用」を参照してください。

ログイン方法については、「ログイン」を参照してください。

9.1.2. ssh

Armadillo-IoT ゲートウェイ A6E にはopensshがインストールされていますが、デフォルトではSSHサーバーが起動していません。

SSHサーバーを自動的に起動するようにするためには、以下のコマンドを実行してください。

[armadillo:~]# rc-update add sshd
 * service sshd added to runlevel default
[armadillo ~]# persist_file /etc/runlevels/default/sshd
[ 2819.277066] EXT4-fs (mmcblk2p1): re-mounted. Opts: (null)
[armadillo ~]# reboot

上記の例では、再起動後も設定が反映されるように、 persist_file コマンドでeMMCに設定を保存しています。

9.2. overlayfsの扱い

Armadillo BaseOS ではルートファイルシステムに overlayfs を採用しています。

その為、ファイルを変更した後 Armadillo の電源を切ると変更内容は保持されません。 開発中などに rootfs の変更内容を保持するには、変更したファイルに対して persist_file コマンドを使用します。 persist_file コマンドの詳細は 「overlayfs と persist_file について」 参照してください。

開発以外の時は安全のため、ソフトウェアアップデートによる更新を実行してください。 アップデート手順に関しては 「Armadilloのソフトウェアをアップデートする」 を参照してください。

rootfs の内容を変更しても、ソフトウェアアップデートを実施した際に変更した内容が保持されない可能性があります。 ソフトウェアアップデート実施後も変更内容を保持する手順に関しては 「swupdate_preserve_files について」 を参照してください。

9.3. アプリケーション開発パターン

Armadillo-IoT ゲートウェイ A6E でアプリケーションコンテナを作成する手順は、以下のパターンに分類されます。

  • ゲートウェイコンテナを利用する
  • ゲートウェイコンテナを利用せず、一からコンテナを作成する

各パターンにおける詳細な手順は 「アプリケーション開発の流れ」 に記載しています。

9.3.1. ゲートウェイコンテナとは

Armadillo-IoT ゲートウェイ A6E には、ゲートウェイコンテナがプリインストールされています。 このコンテナを利用することで、インターフェースの操作やクラウドへのデータアップロードなどを簡単に行うことができます。

ゲートウェイコンテナを利用して実施できる内容は下記の通りです。

表9.1 利用できるインターフェース・機能

インターフェース機能

RS485 (ModbusRTU)

レジスタ読み出し

レジスタ書き込み

接点入力 2ch

ポーリング監視

エッジ検出

接点出力 2ch

指定レベル出力

アプリケーションLED

点灯/消灯操作

ユーザースイッチ

状態取得


表9.2 利用できるクラウドベンダー・サービス

クラウドベンダークラウドサービス

AWS

AWS IoT Core


インターフェースやクラウドサービスの選択はコンフィグ設定で行う事ができます。 また、センサーデータのログ出力やネットワーク断時のキャッシュ機能にも対応しています。

利用方法や仕様については、「ゲートウェイコンテナを動かす」 を参照してください。

9.4. アプリケーション開発の流れ

ここでは、 「アプリケーション開発パターン」 に記載した各パターンの手順を記載します。

9.4.1. ゲートウェイコンテナを利用する

ゲートウェイコンテナを利用してアプリケーションコンテナを作成するパターンですが、 以下のパターンに分類されます。

  • ゲートウェイコンテナを改変せず利用する
  • アプリケーションを改変する
  • ゲートウェイコンテナイメージを改変する

9.4.1.1. ゲートウェイコンテナを改変せず利用する

ゲートウェイコンテナを改変せず利用する場合は、コードを書く必要はありません。 各種設定を行うだけで、アプリケーションを動作させることができます。 設定、実行方法については 「ゲートウェイコンテナを動かす」 を参照してください。

9.4.1.2. アプリケーションを拡張する

操作するインターフェースを追加したい場合や、インターフェースの制御仕様を変更したい場合は、所定のディレクトリにソースコードを配置することで実現することができます。 詳細については 「ゲートウェイコンテナを拡張する」 を参照してください。

9.4.1.3. ゲートウェイコンテナイメージを改変する

基本的に、アットマークテクノではゲートウェイコンテナイメージの改変を推奨しておりません。もし改変を行う場合、以下の手順に沿って、対応することができます。 なお、手順中のコマンドで指定するコンテナ名は a6e-gw-container となります。

[重要項目]

ただし、ゲートウェイコンテナイメージの改変を行った場合、今後アットマークテクノが提供するゲートウェイコンテナのアップデートを そのまま適用することが出来なくなります。そのため、「ゲートウェイコンテナを拡張する」 に記載している方法をお勧めいたします。

  1. 「PodmanのデータをeMMCに保存する」 を実行

    このとき、起動しているコンテナがある場合は podman stop コマンドで停止します。(図10.16「コンテナを停止する実行例」)

  2. ゲートウェイコンテナのコンフィグファイルを修正する

    ゲートウェイコンテナは、コンテナ起動時にコンテナアプリケーションの起動スクリプトを実行するように設定されています。そのため、下記の通り sleep infinity コマンドを実行して待ち続けるだけの設定に変更します。 また、Armadillo Base OS ブート時に自動的に起動する設定となっているため、自動起動を無効にする設定も加えます。

    armadillo:~# cat /etc/atmark/containers/a6e-gw-container.conf
    : (省略)
    
    set_autostart no 1
    
    #set_command sh /usr/bin/gw-app.sh 2
    set_command sleep infinity 3

    1

    自動起動の無効化

    2

    起動スクリプト実行部分をコメントアウト

    3

    sleep infinity コマンドを実行するように修正

    設定後は persist_file コマンドで変更を保存してください。

    [armadillo ~]# persist_file -P /etc/atmark/containers/a6e-gw-container.conf
  3. 「実行中のコンテナに接続する」 の通り、コンテナを起動・接続する
  4. コンテナ内で開発を行う
  5. 「コンテナの変更を保存する」 を実行

9.4.2. ゲートウェイコンテナを利用せず、一からコンテナを作成する

ゲートウェイコンテナを利用せずに、新たに一からコンテナを作成することもできます。 次項より、その場合の手順を示します。

9.4.2.1. PodmanのデータをeMMCに保存する

デフォルトでは、Podmanのデータはtmpfsに保存されます。そのため、Armadillo を再起動するとデータは消えてしまいます。 この挙動は、Armadilloの運用時を想定したものです。

eMMCへの書き込みを最小限にする等の観点から、 Armadilloの運用時は、 Podmanのデータはtmpfsに保存するのが適切です。 eMMCへの保存が必要な場合のみ SWUpdate または abos-ctrl で読み取り専用のイメージを保存します。

Armadillo開発時のみ、 eMMCにPodmanのデータが保存されるようにすることを推奨します。

eMMCにPodmanのデータが保存されるようにするには、以下のコマンドを実行します。

[armadillo ~]# abos-ctrl podman-storage --disk
Creating configuration for persistent container storage
Create subvolume '/mnt/containers_storage'
[ 2145.288677] EXT4-fs (mmcblk2p1): re-mounted. Opts: (null)
[armadillo ~]# abos-ctrl podman-storage --status
Currently in disk mode, run with --tmpfs to switch
[警告]

podman のストレージはコンテナのイメージやランタイムのデータのみです。

コンテナのデータをボリュームに入れたら消えません。詳しくは 「コンテナの変更を保存する」 を参照してください。

9.4.2.2. ベースとなるコンテナを取得する

一からコンテナを作成する場合は、イメージの公開・共有サービスである Docker Hub からベースとなる OS を取得し、開発を行います。OS は alpine や debian 等があり、任意の環境でアプリケーションを作成することができます。目的に合わせて選択してください。

9.4.2.3. デバイスのアクセス権を与える

開発中のアプリケーションがデバイスを利用する場合は、コンテナにデバイスを渡す必要があります。

podman run コマンドに --device オプションでデバイスファイルを指定します。

[ティップ]

--privileged オプションを指定するとすべてのセキュリティーメカニズムが無効になる為、全てのデバイスが利用できるようになります。このオプションを利用することは、セキュリティー上問題がある為、デバッグ用途でのみご利用ください。

9.4.2.4. アプリケーションを作成する

「ゲートウェイコンテナを動かす」 を参考にして、オリジナルのアプリケーションを開発します。

9.4.2.5. コンテナやデータを保存する

ログやデータベース、自分のアプリケーションのデータを保存する場合にボリュームを使ってください。 実行中のコンテナイメージを保存するには podman commit コマンドで保存してください。 詳しい手順は 「コンテナの変更を保存する」 を参考にしてください。

9.5. アプリケーションコンテナの運用

「コンテナの運用」 を参考にしてください。

9.5.1. アプリケーションの自動起動

podman_start用の設定ファイル(/etc/atmark/containers/*.conf)を作成します。その後、 podman_start -a コマンドを実行するか、armadilloを再起動してコンテナが自動起動することを確認してください。コンテナの自動起動に関する詳しい説明は 「コンテナの自動起動」 を参考にしてください。

9.5.2. アプリケーションの送信

まず、コンテナをコンテナレジストリに送るか、 podman save コマンドを実行してアーカイブを作成します。

以下の例では ATDE に mkswu のキーを作成して、 docker.ioのイメージをこのまま使います。

手順の詳しい説明やオプションは 「Armadilloのソフトウェアをアップデートする」 を参考にしてください。

[ATDE ~]$ sudo apt update && sudo apt install mkswu
[ATDE ~]$ mkswu --init
: (省略)
[ATDE ~]$ cd mkswu
[ATDE ~/mkswu]$ cp /usr/share/mkswu/examples/pull_container_nginx.desc .
[ATDE ~/mkswu]$ cp -r /usr/share/mkswu/examples/nginx_start .
[ATDE ~/mkswu]$ vi pull_container_nginx.desc
swdesc_option version=1

swdesc_pull_container "docker.io/nginx:alpine"
swdesc_files --extra-os nginx_start
[ATDE ~/mkswu]$ mkswu -o initial_setup_container.swu \
        initial_setup.desc pull_container_nginx.desc

ここで作成した initial_setup_container.swu ファイルを USB メモリに配置して、 Armadillo-IoTゲートウェイ A6E に刺すとインストールされます。

インストールが終了して再起動すると docker.io/nginx:alpine のコンテナを 起動します。

9.5.3. インストール確認:初期化

購入状態でSWUをインストールできるか確認をするために、ソフトウェアの初期化を行います。

「Armadilloのソフトウェアの初期化」 を参照し、Armadillo Base OSを初期化してからアプリケーションをアップデートしてください。

9.5.4. アプリケーションのアップデート

アップデートを行う方法は以下の二通りです:

  1. podman runコマンドで、差分アップデートを行う

    ここでは例として、アプリケーションのコンテナをmyimage:1、アップデート後をmyimage:2とします。

    [armadillo ~]# podman run --name update myimage:1 sh -c "apk update && apk upgrade && apk cache --purge"
    [armadillo ~]# podman commit update myimage:2
    [armadillo ~]# podman rm update
    [armadillo ~]# podman_partial_image -b myimage:1 -o myimage2_update.tar myimage:2

    出来上がったmyimage2_update.tarは普通のコンテナと同じように扱うことができます。myimage:1が存在しない場合はエラーとなります。

    詳しいコンテナアップデートの手順は 「コンテナの自動作成やアップデート」 を参考にしてください。

    繰り返し差分アップデートをすると、イメージサイズが大きくなってしまいます。ストレージ容量が不足する場合は、次に示す手順でコンテナを新しく構築してください。

  2. コンテナを新しく構築する

    ベースとなるコンテナをアップデートして、そのコンテナに自分のアプリケーションを入れます。

    差分アップデートと異なり共有部分が無い為、コンテナ全体を送る必要があります。

自動的にイメージを作る方法は 「コンテナの自動作成やアップデート」 を参考にしてください。