開発の基本的な流れ

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

8.1.1. Armadilloへの接続

8.1.1.1. シリアルコンソール

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

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

8.1.1.2. ssh

Armadillo-IoT ゲートウェイ G4には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に設定を保存しています。

8.1.2. overlayfsの扱い

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

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

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

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

persist_file コマンドの概要を 図8.1「persist_file のヘルプ」 に示します。

[armadillo ~]# persist_file -h
Usage: /usr/bin/persist_file [options] file [more files...]

Mode selection:
  (none) single entry copy
  -d     delete file
  -l     list content of overlay
  -a     apk mode: pass any argument after that to apk on rootfs

Copy options:
  -r     recursive copy (note this also removes files!)
  -p     make the copy persist through baseos upgrade
         by adding entries to /etc/swupdate_preserve_files
  -P     same, but copy after upgrade (POST)

Delete options:
  -r    recursively delete files

Common options:
  -v     verbose

Note this directly manipulates overlayfs lower directories
so might need a reboot to take effect

図8.1 persist_file のヘルプ


  1. ファイルの保存・削除手順例

    [armadillo ~]# echo test > test
    [armadillo ~]# persist_file -rv /root
    '/root/test' -> '/mnt/root/test' 1
    '/root/.ash_history' -> '/mnt/root/.ash_history'
    [armadillo ~]# rm -f test
    [armadillo ~]# persist_file -rv /root
    removed '/mnt/root/test' 2
    removed '/mnt/root/.ash_history' 3
    '/root/.ash_history' -> '/mnt/root/.ash_history'

    図8.2 persist_file 保存・削除手順例


    1

    追加・変更したファイルを rootfs へコピーします。

    2

    -r を指定すると、ひとつ前の rm -f コマンドで削除したファイルがrootfsからも削除されますのでご注意ください。

    3

    すでに rootfs に存在するファイルも一度削除してからコピーしますので、このようなメッセージが表示されます。

  2. ソフトウェアアップデート後も変更を維持する手順例

    [armadillo ~]# vi /etc/conf.d/podman-atmark 1
    [armadillo ~]# persist_file -P /etc/conf.d/podman-atmark 2
    [armadillo ~]# tail -n 2 /etc/swupdate_preserve_files 3
    # persist_file 20211216
    POST /etc/conf.d/podman-atmark

    図8.3 persist_file ソフトウェアアップデート後も変更を維持する手順例


    1

    何らかのファイルの内容を変更します。

    2

    -P オプションを付与して persist_file を実行します。

    3

    swupdate_preserve_files に追加されたことを確認します。

  3. 変更ファイルの一覧表示例

    [armadillo ~]# mkdir dir
    [armadillo ~]# persist_file -l
    directory          /
    directory          /root
    opaque directory   /root/dir 1
    whiteout           /root/test 2
    regular file       /root/.ash_history
    directory          /etc
    regular file       /etc/resolv.conf
    directory          /var
    symbolic link      /var/lock
    : (省略)

    図8.4 persist_file 変更ファイルの一覧表示例


    1

    rootfs のファイルを見せないディレクトリは opaque directory と表示されます。

    2

    削除したファイルは whiteout と表示されます。

  4. パッケージをインストールする時はapkコマンドを使用してメモリ上にインストールできますが、 persist_file コマンドで rootfs に直接インストールすることも可能です。

    [armadillo ~]# persist_file -a add strace
    (1/3) Installing fts (1.2.7-r1)
    (2/3) Installing libelf (0.185-r0)
    (3/3) Installing strace (5.14-r0)
    Executing busybox-1.34.1-r3.trigger
    OK: 251 MiB in 188 packages
    Install succeeded, but might not work in the running system
    Please reboot if installed program does not work 1
    [armadillo ~]# strace ls
    : (省略)
    exit_group(0)                           = ?
    +++ exited with 0 +++

    図8.5 persist_file でのパッケージインストール手順例


    1

    この例では Armadillo を再起動せずにインストールしたコマンドを使用できましたが、Armadillo の再起動が必要となるパッケージもありますので、その場合は Armadillo を再起動してください。

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

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

eMMCへの書き込みを最小限にする等の観点から、 Armadilloの運用時は、 Podmanのデータはtmpfsに保存するのが適切です。 Armadillo開発時のみ、 eMMCにPodmanのデータが保存されるようにすることを推奨します。

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

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

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

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

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

ベースとなるOSを取得します。alpineやdebian等、任意の環境でアプリケーションを作成することができます。

ベースとなる OS はイメージの公開・共有サービスである Docker Hub から取得することができます。目的に合わせて選択してください。

マルチメディアや機械学習を行うアプリケーションを作成する場合は、アットマークテクノが配布しているdebianコンテナがおすすめです。

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

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

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

[ティップ]

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

8.1.6. データを保存する

アプリケーションからデータを保存する場合は、eMMCに保存する必要があります。コンテナ自体のデータは基本的にRAMに保存されているか書き込み不可であるため、再起動すると消えてしまいます。

保存するデータの性質によって、保存先を選択してください。

  1. /var/app/volumes/: アップデートした場合はコピーされません。ログやデータベースなど、アプリケーションが作成し続けるようなデータの保存に向いています。
  2. /var/app/rollback/volumes/: アップデートした場合はコピーされます。SWUpdateなどで、アプリケーションと一緒にアップデートするようなデータの保存に向いています。
[ティップ]

不具合が発生したなどの理由でコンテナを前のバージョンに戻(ロールバック)した場合、/var/app/rollback/volumes/のデータの前のバージョンに戻ります。その為、アプリケーションのバージョンに依存するようなデータは、/var/app/rollback/volumes/に保存しておくと管理が容易になります。

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

「アプリケーションをコンテナで実行する」を参考にして、オリジナルのアプリケーションを開発します。

8.1.8. コンテナを保存する

コンテナが完成したら、 podman commit コマンドを実行してPodman内のストレージに保存します。詳しい手順は「コンテナの変更を保存する」を参考にしてください。

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

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

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

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

8.2.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]$ vi pull_container_nginx.desc
swdesc_pull_container "docker.io/nginx:alpine" --version container_nginx 1
swdesc_files --version extra_os.nginx 1 \
        nginx_start
[ATDE ~/mkswu]$ mkswu -o initial_setup_container.swu \
        initial_setup.desc pull_container_nginx.desc

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

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

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

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

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

8.2.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. コンテナを新しく構築する

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

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

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

8.3. VPU や NPU を使用する

VPU や NPU などを使うアプリケーションを ATDE 上で開発する場合や、Armadillo Base OS 上のコンテナ内で動作させる場合、ライブラリを ATDE 上でビルドする必要があります。 ここではその手順について説明します。

8.3.1. ATDEにクロスコンパイル用ライブラリをインストールする

ライブラリのビルドツールを実行する準備として、gitのユーザ名とメールアドレスの設定を行い、 ビルドツールである at-imxlibpackage をインストールします。

[ATDE ~]$ git config --global user.name "Your name"
[ATDE ~]$ git config --global user.email your@mail.tld
[ATDE ~]$ sudo apt update
[ATDE ~]$ sudo apt install at-imxlibpackage

図8.6 ビルドツール実行前の準備


その後、ビルドツールを実行します。

実行中にライセンスへの同意を求められます。内容を確認の上、同意する場合は y を入力して処理を進めてください。

[ATDE ~]$ mkdir at-imxlibpackage
[ATDE ~]$ cd at-imxlibpackage
[ATDE ~/at-imxlibpackage]$ make-imxlibpkg

図8.7 ビルドツールの実行


実行が完了すると、ATDE にクロスコンパイル用のライブラリがインストールされます。

8.3.2. Armadillo へ書き込むためのライブラリイメージを作成する

以下に示す製品では、出荷状態でライブラリイメージが Armadillo に書き込まれています。

表8.1 ライブラリイメージ書き込み済みの製品

名称 型番

Armadillo-IoTゲートウェイ G4 LANモデル開発セット

AGX4500-C00D0

Armadillo-IoTゲートウェイ G4 LANモデル量産用

AGX4500-C00Z

Armadillo-IoTゲートウェイ G4 LANモデル量産ボード

AGX4500-U00Z


ライブラリをアップデートする手順を説明します。

Armadillo Base OS 上のコンテナ内から利用できるイメージを作成します。

[ATDE ~]$ cd at-imxlibpackage
[ATDE ~/at-imxlibpackage]$ make-imxlibimage

図8.8 ライブラリイメージ作成ツールの実行


VPU を使用しない場合は、--without-vpu オプションを付けてください。

[ATDE ~]$ cd at-imxlibpackage
[ATDE ~/at-imxlibpackage]$ make-imxlibimage --without-vpu

図8.9 ライブラリイメージ作成ツールの実行 (VPUが不要の場合)


実行が完了すると imx_lib.img というファイルが生成されます。

8.3.3. Armadillo にライブラリイメージを書き込む

Armadillo Base OS 上で、「Armadillo へ書き込むためのライブラリイメージを作成する」で作成した imx_lib.img を eMMC の /dev/mmcblk2p4 パーティションに書き込みます。

次のコマンドは、 imx_lib.img が /tmp にある場合の実行例です。

[armadillo ~]$ umount /opt/firmware
[armadillo ~]$ dd if=/tmp/imx_lib.img of=/dev/mmcblk2p4 bs=1M conv=fsync
23+1 records in
23+1 records out
24965120 bytes (25 MB, 24 MiB) copied, 0.357741 s, 69.8 MB/s

図8.10 ライブラリイメージを書き込む


書き込みが完了した後、/opt/firmware にマウントします。

[armadillo ~]$ mount /opt/firmware

図8.11 ライブラリパーティションのマウント


8.3.4. コンテナ内からライブラリを使用するための準備

コンテナ内からライブラリを使用するためには、コンテナ作成時にライブラリの場所を明示する必要があります。

--volume オプションにファームウェアが書き込まれているディレクトリ(/opt/firmware)を、--env オプションにライブラリのパスを指定します。次の例では、コンテナイメージに Debian(bullseye) を利用しています。

[armadillo ~]$ podman run -it --name=container_name \
--volume=/opt/firmware:/opt/firmware \ 1
--env=LD_LIBRARY_PATH=/opt/firmware/usr/lib/aarch64-linux-gnu \ 2
docker.io/debian:bullseye /bin/bash

図8.12 コンテナ作成時に /opt/firmware を渡す例


1

--volume に /opt/firmware を指定します。

2

--env に LD_LIBRARY_PATH を指定し、コンテナ内のアプリケーションからライブラリをリンクできるようにします。

次に、コンテナにログインし、/opt/firmware/usr/lib/aarch64-linux-gnu/imx-mm へのシンボリックリンクを /usr/lib/aarch64-linux-gnu/ に作成します。

[armadillo ~]$ podman exec -it container_name /bin/bash
[conteiner ~]# ln -s /opt/firmware/usr/lib/aarch64-linux-gnu/imx-mm /usr/lib/aarch64-linux-gnu

図8.13 imx-mm へのシンボリックリンクを作成する


以上で、コンテナからライブラリを使用できるようになります。