応用編

目次

6.1. persist_file について
6.2. コンテナ
6.2.1. Podman - コンテナ仮想化ソフトウェアとは
6.2.2. コンテナの基本的な操作
6.2.3. コンテナとコンテナに関連するデータを削除する
6.2.4. コンテナ起動設定ファイルを作成する
6.2.5. アットマークテクノが提供するイメージを使う
6.2.6. alpine のコンテナイメージをインストールする
6.2.7. コンテナのネットワークを扱う
6.2.8. コンテナ内にサーバを構築する
6.2.9. 画面表示を行う
6.2.10. パワーマネジメント機能を使う
6.2.11. コンテナからのpoweroff及びreboot
6.2.12. 異常検知
6.2.13. NPU を扱う
6.3. swupdate がエラーする場合の対処
6.4. mkswu の .desc ファイルを編集する
6.4.1. インストールバージョンを指定する
6.4.2. Armadillo へファイルを転送する
6.4.3. Armadillo 上で任意のコマンドを実行する
6.4.4. Armadillo にファイルを転送し、そのファイルをコマンド内で使用する
6.4.5. 起動中の Armadillo で任意のコマンドを実行する
6.4.6. Armadillo にコンテナイメージを転送する
6.4.7. Armadillo のブートローダーを更新する
6.4.8. SWU イメージの設定関連
6.4.9. Armadillo 上のコンテナイメージと自動起動用confファイルを削除する
6.4.10. SWUpdate 実行中/完了後の挙動を指定する
6.4.11. desc ファイル設定例
6.5. swupdate_preserve_files について
6.6. SWU イメージの内容の確認
6.7. SWUpdate と暗号化について
6.8. Web UI から Armadillo をセットアップする (ABOS Web)
6.8.1. ABOS Web ではできないこと
6.8.2. ABOS Web の設定機能一覧と設定手順
6.8.3. コンテナ管理
6.8.4. SWUインストール
6.8.5. 時刻設定
6.8.6. アプリケーション向けのインターフェース (Rest API)
6.8.7. カスタマイズ
6.9. ABOSDE から ABOS Web の機能を使用する
6.9.1. Armadillo の SWU バージョンを取得する
6.9.2. Armadillo のコンテナの情報を取得する
6.9.3. Armadillo のコンテナを起動・停止する
6.9.4. Armadillo のコンテナのログを取得する
6.9.5. Armadillo に SWU をインストールする
6.10. VPU や NPU を使用する
6.10.1. Armadillo へ書き込むためのライブラリイメージを作成する
6.10.2. Armadillo にライブラリイメージを書き込む
6.10.3. ライブラリイメージのバージョンを確認する
6.10.4. コンテナ内からライブラリを使用するための準備
6.11. マルチメディアデータを扱う
6.11.1. GStreamer - マルチメディアフレームワーク
6.11.2. GStreamer 実行用コンテナを作成する
6.11.3. GStreamer パイプラインの実行例
6.11.4. 動画を再生する
6.11.5. ストリーミングデータを再生する
6.11.6. USB カメラからの映像を表示する
6.11.7. USBカメラからの映像を録画する
6.11.8. Video Processing Unit(VPU)
6.12. デモアプリケーションを実行する
6.12.1. コンテナを作成する
6.12.2. デモアプリケーションランチャを起動する
6.12.3. mediaplayer
6.12.4. video recoder
6.12.5. led switch tester
6.12.6. rtc tester
6.12.7. object detection demo
6.12.8. pose estimation demo
6.12.9. image segmentation demo
6.12.10. super resolution demo
6.12.11. hand estimation demo
6.12.12. screw detection demo
6.13. ssh 経由で Armadillo Base OS にアクセスする
6.14. コマンドラインからネットワーク設定をする
6.14.1. 接続可能なネットワーク
6.14.2. IP アドレスの確認方法
6.14.3. ネットワークの設定方法
6.14.4. nmcli の基本的な使い方
6.14.5. 有線 LAN
6.15. ストレージの操作
6.15.1. ストレージ内にアクセスする
6.15.2. ストレージを安全に取り外す
6.15.3. ストレージのパーティション変更とフォーマット
6.16. ボタンやキーを扱う
6.16.1. SW1 の短押しと長押しの対応
6.16.2. USB キーボードの対応
6.16.3. Armadillo 起動時にのみボタンに反応する方法
6.17. 動作中の Armadillo の温度を測定する
6.17.1. 温度測定の重要性
6.17.2. atmark-thermal-profiler をインストールする
6.17.3. atmark-thermal-profiler を実行・停止する
6.17.4. atmark-thermal-profiler が出力するログファイルを確認する
6.17.5. 温度測定結果の分析
6.17.6. Armadillo Twin から Armadillo の温度を確認する
6.17.7. 温度センサーの仕様
6.18. Armadillo Base OS をアップデートする
6.19. ロールバック状態を確認する
6.20. Armadillo 起動時にコンテナの外でスクリプトを実行する
6.21. u-boot の環境変数の設定
6.22. SDブートの活用
6.22.1. ブートディスクの作成
6.22.2. SDブートの実行
6.23. Armadilloのソフトウェアをビルドする
6.23.1. ブートローダーをビルドする
6.23.2. Linux カーネルをビルドする
6.23.3. Alpine Linux ルートファイルシステムをビルドする
6.23.4. ビルドしたルートファイルシステムの SBOM を作成する
6.24. eMMC のデータリテンション
6.24.1. データリテンションの設定
6.24.2. より詳しくデータリテンションの統計情報を確認するには
6.24.3. 実装仕様に関する技術情報
6.25. Linuxカーネルがクラッシュしたときにメモリの状態を保存する
6.25.1. Kdumpを利用する準備
6.25.2. Kdumpの動作確認
6.25.3. vmcoreの確認
6.26. 動作ログ
6.26.1. 動作ログについて
6.26.2. 動作ログを取り出す
6.26.3. ログファイルのフォーマット
6.26.4. ログ用パーティションについて
6.27. viエディタを使用する
6.27.1. viの起動
6.27.2. 文字の入力
6.27.3. カーソルの移動
6.27.4. 文字の削除
6.27.5. 保存と終了
6.28. オプション品
6.28.1. Armadillo-X2 オプションケース(金属製)
6.28.2. Armadillo-X2、G4 ケースモデル VESA規格固定用プレート

本章では、ここまでの内容で紹介しきれなかった、より細かな Armadillo の設定方法や、開発に役立つヒントなどを紹介します。

各トピックを羅列していますので、目次の節タイトルからやりたいことを探して辞書的にご使用ください。

6.1. persist_file について

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

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

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

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

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

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

Mode selection:
  (none) single entry copy
  -d, --delete   delete file
  -l, --list     list content of overlay
  -a, --apk      apk mode: pass any argument after that to apk on rootfs
  -R, --revert   revert change: only delete from overlay, making it
                 look like the file was reverted back to original state

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

Delete options:
  -r, --recurse  recursively delete files

Common options:
  -v, --verbose  verbose mode for all underlying commands

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

図6.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'

    図6.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

    図6.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
    : (省略)

    図6.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 +++

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


    1

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

6.2. コンテナ

Armadillo Base OS において、ユーザーアプリケーションは基本的にコンテナ内で実行されます。 3章開発編で紹介した開発手順では、基本的に SWUpadate を使用してコンテナを生成・実行していました。

以下では、より自由度の高いコンテナの操作のためにコマンドラインからの操作方法について紹介します。

6.2.1. Podman - コンテナ仮想化ソフトウェアとは

コンテナとはホスト OS 上に展開される仮想的なユーザ空間のことです。 コンテナを使用することで複数の Armadillo-X2 でも同一の環境がすぐに再現できます。 ゲスト OS を必要としない仮想化であるため、アプリケーションの起動が素早いという特徴があります。

Podman とはこのようなコンテナを管理するためのソフトウェアであり、使用方法は コンテナ管理ソフトウェアの 1 つである Docker と互換性があります。

6.2.2. コンテナの基本的な操作

この章では、コンテナ仮想化ソフトウェアの 1 つである Podman の基本的な使い方について説明します。 Armadillo-X2 で実行させたいアプリケーションとその実行環境自体を 1 つの Podman イメージとして扱うことで、 複数の Armadillo-X2 がある場合でも、全てのボード上で同一の環境を再現させることが可能となります。

この章全体を通して、イメージの公開・共有サービスである Docker Hub から取得した、Alpine Linux のイメージを 使って説明します。

6.2.2.1. イメージからコンテナを作成する

イメージからコンテナを作成するためには、podman_start コマンドを実行します。 podman や docker にすでに詳しいかたは podman run コマンドでも実行できますが、ここでは 「コンテナ起動設定ファイルを作成する」 で紹介するコンテナの自動起動の準備も重ねて podman_start を使います。 イメージは Docker Hub から自動的に取得されます。 ここでは、簡単な例として "ls /" コマンドを実行するコンテナを作成します。

[armadillo ~]# vi /etc/atmark/containers/my_container.conf 1
set_image docker.io/alpine
set_command ls /
[armadillo ~]# podman pull docker.io/alpine 2
Trying to pull docker.io/library/alpine:latest...
Getting image source signatures
:(省略)
Writing manifest to image destination
Storing signatures
a6215f271958c760a2975a6765016044115dbae4b90f414eba3a448a6a26b4f6
[armadillo ~]# podman_start my_container 3
Starting 'my_container'
b141e899b5ef7c9ec5434bda8f6a83d3e6bfc94f74bfb5dcef2a22041c71fdbf
[armadillo ~]# podman logs my_container 4
bin
dev
:(省略)
usr
var
[armadillo ~]#

図6.6 コンテナを作成する実行例


1

コンテナのコンフィグを作成します。このファイルでは、コンテナのイメージやコマンド、デバイスへのアクセス権限を設定します。詳しい設定の説明には 「コンテナ起動設定ファイルを作成する」 を参照ください。

2

コンテナのイメージを取得します。イメージが Armadillo に置いてない場合は「Error: docker.io/alpine: image not known」の様なエラーで失敗します。

3

コンテナを起動します。これは Armadillo 起動時に自動的に起動されるコンテナと同じものになります。自動起動が不要な場合には set_autostart no で無効化できます。

4

podman logs コマンドで出力を確認します。

"ls /" を実行するだけの "my_container" という名前のコンテナが作成されました。 コンテナが作成されると同時に "ls /" が実行され、その結果がログに残ります。 ここで表示されているのは、コンテナ内部の "/" ディレクトリのフォルダの一覧です。

[警告]

コンフィグファイルの直接な変更と podman pull によるコンテナの取得はデフォルト状態ではメモリ上でしか保存されません。

ファイルは persist_file で必ず保存し、コンテナイメージは abos-ctrl podman-storage --disk で podman のストレージを eMMC に切り替えるか abos-ctrl podman-rw で一時的に eMMC に保存してください。

運用中の Armadillo には直接に変更をせず、 SWUpdate でアップデートしてください。

コンフィグファイルを保存して、 set_autostart no を設定しない場合は自動起動します。

[ティップ]

podman_start でコンテナが正しく起動できない場合は podman_start -v <my_container>podman run のコマンドを確認し、 podman logs <my_container> で出力を確認してください。

6.2.2.2. イメージ一覧を表示する

コンテナを作成するためのイメージは、イメージ一覧を表示する podman images コマンドで確認できます。

[armadillo ~]# podman images
REPOSITORY                TAG     IMAGE ID      CREATED      SIZE
docker.io/library/alpine  latest  9c74a18b2325  2 weeks ago  4.09 MB

図6.7 イメージ一覧の表示実行例


podman images コマンドの詳細は --help オプションで確認できます。

[armadillo ~]# podman images --help

図6.8 podman images --help の実行例


6.2.2.3. コンテナ一覧を表示する

作成済みコンテナ一覧を表示するためには podman ps コマンドを実行します。

[armadillo ~]# podman ps -a
CONTAINER ID  IMAGE                            COMMAND    CREATED         STATUS                    PORTS    NAMES
d6de5881b5fb  docker.io/library/alpine:latest  ls /       12 minutes ago  Exited (0) 11 minutes ago          my_container

図6.9 コンテナ一覧の表示実行例


一覧表示により、コンテナ名やコンテナ ID を確認することができます。-a オプションを付けない場合は、動作中のコンテナのみ表示されます。 podman ps コマンドの詳細は --help オプションで確認できます。

[armadillo ~]# podman ps --help

図6.10 podman ps --help の実行例


6.2.2.4. コンテナを起動する

作成済みのコンテナを起動するためには podman start コマンドを実行します。

[armadillo ~]# podman start my_container
podman start my_container
[ 3119.081068] IPv6: ADDRCONF(NETDEV_CHANGE): vethe172e161: link becomes ready
[ 3119.088214] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[ 3119.094812] cni-podman0: port 1(vethe172e161) entered blocking state
[ 3119.101231] cni-podman0: port 1(vethe172e161) entered disabled state
[ 3119.107745] device vethe172e161 entered promiscuous mode
[ 3119.113185] cni-podman0: port 1(vethe172e161) entered blocking state
[ 3119.119546] cni-podman0: port 1(vethe172e161) entered forwarding state
my_container
[ 3119.620731] cni-podman0: port 1(vethe172e161) entered disabled state
[ 3119.627696] device vethe172e161 left promiscuous mode
[ 3119.632762] cni-podman0: port 1(vethe172e161) entered disabled state

図6.11 コンテナを起動する実行例


-a オプションを与えると、コンテナ内で実行されたアプリケーションの出力を確認できます。

[armadillo ~]# podman start -a my_container
[ 3150.303962] IPv6: ADDRCONF(NETDEV_CHANGE): vetha9ef8f8e: link becomes ready
[ 3150.311106] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[ 3150.317703] cni-podman0: port 1(vetha9ef8f8e) entered blocking state
[ 3150.324139] cni-podman0: port 1(vetha9ef8f8e) entered disabled state
[ 3150.330687] device vetha9ef8f8e entered promiscuous mode
[ 3150.336085] cni-podman0: port 1(vetha9ef8f8e) entered blocking state
[ 3150.342443] cni-podman0: port 1(vetha9ef8f8e) entered forwarding state
bin    etc    lib    mnt    proc   run    srv    tmp    var
dev    home   media  opt    root   sbin   sys    usr
[ 3150.804164] cni-podman0: port 1(vetha9ef8f8e) entered disabled state
[ 3150.811249] device vetha9ef8f8e left promiscuous mode
[ 3150.816349] cni-podman0: port 1(vetha9ef8f8e) entered disabled state

図6.12 コンテナを起動する実行例(a オプション付与)


ここで起動している my_container は、起動時に "ls /" を実行するようになっているので、その結果が出力されます。 podman start コマンドの詳細は --help オプションで確認できます。

[armadillo ~]# podman start --help

図6.13 podman start --help 実行例


6.2.2.5. コンテナを停止する

動作中のコンテナを停止するためには podman stop コマンドを実行します。

[armadillo ~]# podman stop my_container
my_container

図6.14 コンテナを停止する実行例


podman stop コマンドの詳細は --help オプションで確認できます。

[armadillo ~]# podman stop --help

図6.15 podman stop --help 実行例


6.2.2.6. コンテナの変更を保存する

コンテナに対して変更が行われた状態で、そのままコンテナを停止してしまうと変更が失なわれてしまいます。

変更を保存するには二つの方法があります。

  1. podman commit コマンドで保存する。

    [armadillo ~]# podman commit my_container image_name:latest
    Getting image source signatures
    Copying blob f4ff586c6680 skipped: already exists
    Copying blob 3ae0874b0177 skipped: already exists
    Copying blob ea59ffe27343 done
    Copying config 9ca3c55246 done
    Writing manifest to image destination
    Storing signatures
    9ca3c55246eaac267a71731bad6bfe4b0124afcdd2b80c4f730c46aae17a88f3

    図6.16 my_containerを保存する例


    podman commitで保存する度に、変更が行なわれた差分が保存されます。 繰り返し差分を保存すると、イメージサイズが大きくなってしまいます。 ストレージ容量が不足する場合は、ベースとなるOSのイメージから作り直してください。

  2. 「電源を切っても保持されるディレクトリ(ユーザーデータディレクトリ)」を使用する。

    podman_startadd_volumes コマンドでコンテナに Armadillo Base OS のディレクトリをコンテナで使うことができます。

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

    1. /var/app/volumes/myvolume: アップデートした場合はコピーされません。 ログやデータベースなど、アプリケーションが作成し続けるようなデータの保存に向いています。
    2. myvolume/var/app/rollback/volumes/myvolume: アップデートの際にコピーしてアップデートを行うので、アップデート中でも安全に使いつづけます。 アプリケーションと一緒にアップデートするようなデータの保存に向いています。

6.2.2.7. コンテナの自動作成やアップデート

podman run, podman commitでコンテナを作成できますが、定期的にアップデートをする際には コンテナの作成やアップデートを自動化できると便利です。

これを実現するために、Dockerfileとpodman buildを使います。この手順はArmadilloで実行可能です。

  1. イメージを docker.io のイメージから作りなおします

    [armadillo ~/podman-build]# cat Dockerfile
    FROM docker.io/arm64v8/alpine:latest
    
    # update & install dependencies (example: usbutils)
    RUN apk upgrade && apk add usbutils && rm -f /var/cache/apk/*
    
    # copy our application and set it to run on start
    COPY my_application /my_application
    ENTRYPOINT /my_application
    
    [armadillo ~/podman-build]# podman build -t my_image:1 -t my_image:latest .
    STEP 1: FROM docker.io/arm64v8/alpine:latest
    STEP 2: RUN apk upgrade && apk add usbutils && rm -f /var/cache/apk/*
    --> 234bf79175e
    STEP 3: COPY my_application /my_application
    --> 05ab31bb278
    STEP 4: ENTRYPOINT /my_application
    STEP 5: COMMIT my_image:latest
    --> 590e3ba6d55
    Successfully tagged localhost/my_image:1
    Successfully tagged localhost/my_image:latest
    590e3ba6d55f3e29bdef158d7283e9c4f7515567b2d3f978cfab2510dc02376b
    
    [armadillo ~/podman-build]# podman save my_image:latest -o my_image_1.tar

    図6.17 podman buildの実行例


  2. イメージを前のバージョンからアップデートします

    [armadillo ~/podman-build-update]# cat Dockerfile
    FROM localhost/my_image:latest
    
    # update OS packages
    RUN apk upgrade --no-cache
    
    # update application
    COPY my_application /my_application
    [armadillo ~/podman-build-update]# podman build -t my_image:2 -t my_image:latest .
    STEP 1: FROM localhost/my_image:latest
    STEP 2: RUN apk upgrade --no-cache
    --> cf1dc0d7296
    STEP 3: COPY my_application /my_application
    STEP 4: COMMIT my_image:latest
    --> 9e9d9366072
    Successfully tagged localhost/my_image:2
    Successfully tagged localhost/my_image:latest
    9e9d9366072751007b2e70544d76c46b95a7a5a02df658ef0fa3f7dcccf8850a
    
    [armadillo ~/podman-build-update]# podman save -o my_image_2.tar my_image:2

    図6.18 podman buildでのアップデートの実行例


    この場合、 podman_partial_image コマンドを使って、差分だけをインストールすることもできます。

    [armadillo ~/podman-build-update]# podman_partial_image -b my_image:1 \
            -o my_image_2_partial.tar my_image:2
    
    [armadillo ~/podman-build-update]# ls -lh
    -rw-r--r-- 1 root root   88 Dec 21 15:24 Dockerfile
    -rw-r--r-- 1 root root 9.4M Dec 21 15:26 my_image_1.tar
    -rw-r--r-- 1 root root 9.4M Dec 21 15:26 my_image_2.tar
    -rw-r--r-- 1 root root  51K Dec 21 15:26 my_image_2_partial.tar

作成した .tar アーカイブは 「mkswu の .desc ファイルを編集する」swdesc_embed_containerswdesc_usb_container で使えます。

6.2.2.8. コンテナを削除する

作成済みコンテナを削除する場合は podman rm コマンドを実行します。

[armadillo ~]# podman rm my_container
d6de5881b5fb973227b84d1d74abf269ac3183aad7e18b7a9d85208632641d94
[armadillo ~]# podman ps -a
CONTAINER ID  IMAGE                            COMMAND    CREATED         STATUS                    PORTS    NAMES

図6.19 コンテナを削除する実行例


podman ps コマンドの出力結果より、コンテナが削除されていることが確認できます。 podman rm コマンドの詳細は --help オプションで確認できます。

  1. podman rm --help 実行例
[armadillo ~]# podman rm --help

6.2.2.9. イメージを削除する

podmanのイメージを削除するには podman rmi コマンドを実行します。 イメージを削除するためには、そのイメージから作成したコンテナを先に削除しておく必要があります。 podman rmi コマンドにはイメージ ID を指定する必要があるため、podman images コマンドで確認します。

[armadillo ~]# podman rm my_container
[armadillo ~]# podman images
REPOSITORY                TAG        IMAGE ID      CREATED      SIZE
docker.io/library/alpine  latest     02480aeb44d7  2 weeks ago  5.62 MB
[armadillo ~]# podman rmi 02480aeb44d7
Untagged: docker.io/library/alpine:latest
Deleted: 02480aeb44d78f1a44b8791af7edf7d6e1b18707397a1dfb3ff4f21c5ce4a44f
[armadillo ~]# podman images
REPOSITORY                TAG        IMAGE ID      CREATED      SIZE

図6.20 イメージを削除する実行例


podman images コマンドの出力結果より、コンテナが削除されていることが確認できます。 podman rmi コマンドの詳細は --help オプションで確認できます。

[armadillo ~]# podman rmi --help

図6.21 podman rmi --help 実行例


[ティップ]

SWU で転送されたイメージは podman images で Read-Only として表示されますので、 podman rmi を実行するとエラーとなります。 その場合は abos-ctrl podman-rw rmi をご使用ください。 abos-ctrl podman-rw については 「イメージを eMMC に保存する」 を参照してください。

[armadillo ~]# podman images
REPOSITORY                TAG        IMAGE ID      CREATED      SIZE       R/O
docker.io/library/alpine  latest     02480aeb44d7  2 weeks ago  5.62 MB    true
[armadillo ~]# podman rmi docker.io/alpine
Error: cannot remove read-only image "02480aeb44d78f1a44b8791af7edf7d6e1b18707397a1dfb3ff4f21c5ce4a44f"
[armadillo ~]# abos-ctrl podman-rw rmi docker.io/alpine
Untagged: docker.io/library/alpine:latest
Deleted: 02480aeb44d78f1a44b8791af7edf7d6e1b18707397a1dfb3ff4f21c5ce4a44f
[armadillo ~]# podman images
REPOSITORY                TAG        IMAGE ID      CREATED      SIZE

図6.22 Read-Onlyのイメージを削除する実行例


6.2.2.10. 実行中のコンテナに接続する

実行中のコンテナに接続し、コンテナ内で指定したコマンドを実行するには podman exec コマンドを実行します。 podman exec コマンドでコンテナ内部のシェルを起動すると、コンテナ内部を操作できるようになります。ここでは、sleep infinity コマンドを 実行して待ち続けるだけのコンテナを作成し、そのコンテナに対して podman exec コマンドでシェルを起動する例を示します。

[armadillo ~]# vi /etc/atmark/containers/sleep_container.conf
set_image docker.io/alpine
set_command sleep infinity
[armadillo ~]# podman_start sleep_container
Starting 'test'
f62e7a666d7156d261905c8406c72fc271534fa29e69771c76f4f6660a2da41a
[armadillo ~]# podman exec -it sleep_container sh
[container ~]# ps
PID   USER     TIME  COMMAND
    1 root      0:00 /run/podman-init -- sleep infinity
    2 root      0:00 sleep infinity
    3 root      0:00 sh
    4 root      0:00 ps

図6.23 コンテナ内部のシェルを起動する実行例


podman_start コマンドでコンテナを作成し、その後作成したコンテナ内で sh を実行しています。 sh を実行すると、コンテナ内のプロンプトが表示されコンテナ内部を操作できるようになります。 上記ではコンテナ内で、ps コマンドを実行しています。コンテナ作成時に実行した sleeppodman exec で実行した sh がプロセスとして存在していることが確認できます。

コンテナ内のシェルから抜ける時は exit コマンドを実行します。

[container ~]# exit

図6.24 コンテナ内部のシェルから抜ける実行例


podman exec コマンドから抜けても、コンテナがまだ実行中です。コンテナを停止したい場合は podman stop sleep_containerpodman kill sleep_container で停止して podman rm sleep_container でそのコンテナを削除してください。

podman exec コマンドの詳細は --help オプションで確認できます。

[armadillo ~]# podman exec --help

図6.25 podman exec --help 実行例


6.2.2.11. コンテナ間で通信をする

複数のコンテナを実行している環境で、それらのコンテナ間で通信を行う方法を示します。 これにより、例えば SQL サーバを実行しているコンテナに対し別のコンテナから接続するといった 使い方ができます。

コンテナには作成した時点でローカル IP アドレスが割り当てられるので、コンテナの名前かその IP アドレスで通信を行うことができます。

準備として、2 つのコンテナを作成します。

[armadillo ~]# vi /etc/atmark/containers/my_container_1.conf
set_image docker.io/alpine
set_command sleep infinity
[armadillo ~]# vi /etc/atmark/containers/my_container_2.conf
set_image docker.io/alpine
set_command sleep infinity
[armadillo ~]# podman_start my_container_1 my_container_2
Starting 'my_container_1'
cbe0802f4e2d2fec88f4e300dabeba3b48865359dc02cbd99375b1b38c2c28eb
Starting 'my_container_2'
5e645f5e40fc096ad0bea323a00bebebbda4bd825a5e8d12103f752d8868692e

図6.26 コンテナを作成する実行例


コンテナに割り当てられた IP アドレスを確認するには podman inspect コマンドを実行します。

[armadillo ~]# podman inspect --format='{{.NetworkSettings.IPAddress}}' my_container_1
10.88.0.108
[armadillo ~]# podman inspect --format='{{.NetworkSettings.IPAddress}}' my_container_2
10.88.0.109

図6.27 コンテナの IP アドレスを確認する実行例


これらの IP アドレスを使って、一方のコンテナからもう一方のコンテナへ対し ping コマンドで疎通確認を行うことができます。

[armadillo ~]# podman exec -it my_container_1 sh
[container ~]# ping -c 2 my_container_2
PING my_container_2 (10.88.0.109): 56 data bytes
64 bytes from 10.88.0.109: seq=0 ttl=42 time=0.144 ms
64 bytes from 10.88.0.109: seq=1 ttl=42 time=0.210 ms

--- my_container_2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.144/0.177/0.210 ms
[container ~]# ping -c 2 10.88.0.109
PING 10.88.0.109 (10.88.0.109): 56 data bytes
64 bytes from 10.88.0.109: seq=0 ttl=42 time=0.140 ms
64 bytes from 10.88.0.109: seq=1 ttl=42 time=0.138 ms

--- 10.88.0.109 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.138/0.139/0.140 ms

図6.28 ping コマンドによるコンテナ間の疎通確認実行例


このように、my_container_1(10.88.0.108) から my_container_2(10.88.0.109) への通信が確認できます。

6.2.2.12. podでコンテナのネットワークネームスペースを共有する

podman_startpod 機能を使うことができます。

pod を使うことで、複数のコンテナが同じネットワークネームスペースを共有することができます。 同じ pod の中のコンテナが IP の場合 localhost で、 unix socket の場合 abstract path で相互に接続することができます。

[armadillo ~]# cat /etc/atmark/containers/mypod.conf
set_type pod
add_ports 80:80

[armadillo ~]# cat /etc/atmark/containers/nginx.conf
set_image docker.io/library/nginx:alpine
set_readonly no
set_pod mypod

[armadillo ~]# podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED      STATUS          PORTS               NAMES
0cdb0597b610  localhost/podman-pause:4.3.1-1683096588               2 hours ago  Up 2 hours ago  0.0.0.0:80->80/tcp  5ba7d996f673-infra
3292e5e714a2  docker.io/library/nginx:alpine  nginx -g daemon o...  2 hours ago  Up 2 hours ago  0.0.0.0:80->80/tcp  nginx

図6.29 podを使うコンテナを自動起動するための設定例


コンテナと同じく、 /etc/atmark/containers/[NAME].conf ファイルを作って、 set_type pod を設定することで pod を作成します。

pod を使う時にコンテナの設定ファイルに set_pod [NAME] の設定を追加します。

ネットワークネームスペースは pod を作成するときに必要なため、 ports, networkip の設定は pod のコンフィグファイルに入れなければなりません。

必要であれば、他の podman pod create のオプションを add_args で設定することができます。

.conf ファイルで使用できる各種パラメータについては、「コンテナ起動設定ファイルを作成する」を参照してください。

6.2.2.13. networkの作成

podman_start で podman の network も作成ことができます。

デフォルトの 10.88.0.0/16 が使えない場合、あるいはコンテナ同士で接続できないようにしたい場合は使ってください。

[armadillo ~]# cat /etc/atmark/containers/mynetwork.conf
set_type network
set_subnet 192.168.100.0/24

[armadillo ~]# cat /etc/atmark/containers/nginx.conf
set_image docker.io/library/nginx:alpine
add_ports 80:80
set_ip 192.168.100.10
set_network mynetwork

[armadillo ~]# podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED      STATUS          PORTS               NAMES
3292e5e714a2  docker.io/library/nginx:alpine  nginx -g daemon o...  2 hours ago  Up 2 hours ago  0.0.0.0:80->80/tcp  nginx

図6.30 networkを使うコンテナを自動起動するための設定例


コンテナと同じく、 /etc/atmark/containers/[NAME].conf ファイルを作って、 set_type network を設定することで network を作成します。

そのネットワークを使う時にコンテナの設定ファイルに set_network [NAME] の設定をいれます。

ネットワークのサブネットは set_subnet [SUBNET] で設定します。 この設定は set_type network の後しか使えませんので、set_type はファイルの最初のところに使ってください

他の podman network create のオプションが必要であれば、 add_args で設定することができます。

.conf ファイルで使用できる各種パラメータについては、「コンテナ起動設定ファイルを作成する」を参照してください。

6.2.2.14. コンテナからのコンテナ管理

podman では REST API による管理アクセスも可能です。

自分のコンテナから他のコンテナの管理が必要な場合に、ホストの podman サービスを有効にして、 コンテナに /run/podman をボリュームマウントすれば podman --remote で管理できます。

[ティップ]

コンテナの設定によって podman の socket へのパスが自動設定されない場合もあります。 podman --remote でエラーが発生した場合に CONTAINER_HOST=unix:/path/to/podman.sock で socket へのパスを設定してください。

Armadillo のホスト側の udev rules からコンテナを起動する場合は podman_start 等を直接実行すると udev の子プロセス管理によってコンテナが停止されますので、その場合はサービスを有効にし、 podman_start --create <container> コマンドまたは set_autostart create の設定でコンテナを生成した上 podman --remote start <container> で起動してください。

6.2.2.15. リモートリポジトリにコンテナを送信する

  1. イメージをリモートリポジトリに送信する:

    [armadillo ~]$ podman image push <localimage> docker://<registry>/<remoteimage>:<tag>
  2. set_pull always を設定しないかぎり、SWUpdateでダウンロードの命令を送らないとアップデートを行いません。

    (mkswuについては「Armadillo のソフトウェアをアップデートする」を参考にしてください)

    [ATDE ~/mkswu]$ cp /usr/share/mkswu/examples/pull_container_nginx.desc .
    [ATDE ~/mkswu]$ cp -r /usr/share/mkswu/examples/nginx_start .
    [ATDE ~/mkswu]$ cat pull_container_nginx.desc
    swdesc_option version=1
    
    swdesc_pull_container "docker.io/nginx:alpine"
    swdesc_files --extra-os nginx_start
    [ATDE ~/mkswu]$ mkswu pull_container_nginx.desc
    Enter pass phrase for /home/atmark/mkswu/swupdate.key:
    pull_container_nginx.swu を作成しました。

6.2.2.16. イメージを eMMC に保存する

Armadillo Base OS のデフォルトでは、Podman のデータは tmpfs に保存されます。

起動時にコンテナを起動するにはイメージを eMMC に書き込む必要があります。 開発が終わって運用の場合は 「イメージを SWUpdate で転送する」 でコンテナのイメージを転送します。この場合は読み取り専用の app パーティションのサブボリュームに展開します。

開発の時に以下の abos-ctrl podman-rwabos-ctrl podman-storage --disk のコマンドを使って直接にイメージを編集することができます。

[ティップ]

ここで紹介する内容はコンテナのイメージの管理の説明です。データベース等のコンテナから書き込みが必要な場合には 「コンテナの変更を保存する」 にあるボリュームの説明を参照してください。

  • abos-ctrl podman-rw

abos-ctrl podman-rw を使えば、read-only になっているイメージを扱う事ができます。

[armadillo ~]# podman images
REPOSITORY                 TAG         IMAGE ID      CREATED            SIZE        R/O
[armadillo ~]# mount /dev/sda1 /mnt
[armadillo ~]# abos-ctrl podman-rw load -i /mnt/at-debian-image.tar
Getting image source signatures
Copying blob 63c098a71e7b done
Copying blob 837e73dd4d20 done
Copying blob a25086e65f63 done
Copying config b5a30f8581 done
Writing manifest to image destination
Storing signatures
Loaded image(s): localhost/at-debian-image:latest
[armadillo ~]# podman image list
REPOSITORY                 TAG         IMAGE ID      CREATED      SIZE        R/O
localhost/at-debian-image  latest      b5a30f8581cc  2 hours ago  233 MB      true

図6.31 abos-ctrl podman-rw の実行例


  • abos-ctrl podman-storage

abos-ctrl podman-storage はメモリとディスクの切り替えの他に、読み書きストレージから読み取り専用ストレージへのコピーもできます。

[armadillo ~]# podman pull docker.io/alpine 1
Trying to pull docker.io/library/alpine:latest...
Getting image source signatures
Copying blob f97344484467 done
Copying config 3d81c46cd8 done
Writing manifest to image destination
Storing signatures
3d81c46cd8756ddb6db9ec36fa06a6fb71c287fb265232ba516739dc67a5f07d
[armadillo ~]# abos-ctrl podman-storage 2
List of images configured on development storage:
REPOSITORY                TAG         IMAGE ID      CREATED     SIZE
docker.io/library/alpine  latest      3d81c46cd875  3 days ago  5.56 MB

What should we do? ([C]opy (default), [N]othing, [D]elete)
copy 3
Create a snapshot of '/mnt/boot_1/containers_storage' in '/mnt/new_storage'
Getting image source signatures
Copying blob 8ec3165d6e61 done
Copying config 4a49b68e7c done
Writing manifest to image destination
Storing signatures
Delete subvolume (no-commit): '/mnt/new_storage'
Merging development images to readonly storage succeeded
Feel free to adjust the result with abos-ctrl podman-rw commands

Now freeing up original data...
Podman is in tmpfs mode 4
[armadillo ~]# podman image list 5
REPOSITORY                TAG         IMAGE ID      CREATED     SIZE        R/O
docker.io/library/alpine  latest      3d81c46cd875  3 days ago  5.56 MB     true

図6.32 abos-ctrl podman-storage のイメージコピー例


1

イメージを書き込み可能ストレージに取得します。

2

abos-ctrl podman-storage をオプション無しで実行します。

3

書き込み可能ストレージにイメージがある場合に対応を聞かれます。今回はコピー(copy)します。

4

abos-ctrl podman-storage にオプションを指定しなかったので、ストレージが tmpfs のままになります。すでに --disk で切り替えた場合にディスクのままでも可能です。

5

コピーの確認します。イメージが読み取り専用(R/O, Read only)になりました。

[ティップ]

podman が壊れやすいので、デフォルトの「abos-ctrl podman-storage --tmpfs」で運用することを推奨しますが、tmpfs の容量が小さくてイメージの操作には向いてません。

開発時には「abos-ctrl podman-storage --disk」の状態で作業を行い、運用時には「abos-ctrl podman-storage --tmpfs」に戻してください。 戻る際に「copy」を選択肢する場合は一時的なストレージをそのまま使いつづけますので、すべての変更が残ります。

[警告]

SWUpdate でアップデートをインストールする際には、/var/lib/containers/storage_readonly ディレクトリの不要になったイメージを自動的に削除します。

自動起動させる予定がなくても、「コンテナ起動設定ファイルを作成する」 を参考にして、 /etc/atmark/containers/*.conf を使ってください。 set_autostart no を設定することで自動実行されません。

6.2.2.17. イメージを SWUpdate で転送する

  1. イメージをファイルに保存する:

    [armadillo ~]$ podman image save -o <myimage>.tar <localimage>
  2. ファイルをSWUpdateのイメージに入れる。

    二つのやり方があります:

    1. swuイメージ内に組み込む

      [ATDE ~/mkswu]$ cp /usr/share/mkswu/examples/embed_container_nginx.desc .
      [ATDE ~/mkswu]$ cp -r /usr/share/mkswu/examples/nginx_start .
      [ATDE ~/mkswu]$ cat embed_container_nginx.desc
      swdesc_option version=1
      
      swdesc_embed_container "nginx_alpine.tar"
      swdesc_files --extra-os nginx_start
      [ATDE ~/mkswu]$ podman pull --arch arm64 docker.io/nginx:alpine
      [ATDE ~/mkswu]$ podman run --rm docker.io/nginx:alpine uname -m
      aarch64
      [ATDE ~/mkswu]$ podman save docker.io/nginx:alpine > nginx_alpine.tar
      [ATDE ~/mkswu]$ mkswu embed_container_nginx.desc
      Enter pass phrase for /home/atmark/mkswu/swupdate.key:
      embed_container_nginx.swu を作成しました
    2. USBドライブに保存する

      [ATDE ~/mkswu]$ cp /usr/share/mkswu/examples/usb_container_nginx.desc .
      [ATDE ~/mkswu]$ cp -r /usr/share/mkswu/examples/nginx_start .
      [ATDE ~/mkswu]$ cat usb_container_nginx.desc
      swdesc_option version=1
      
      swdesc_usb_container "nginx_alpine.tar"
      swdesc_files --extra-os nginx_start
      [ATDE ~/mkswu]$ podman pull --arch arm64 docker.io/nginx:alpine
      [ATDE ~/mkswu]$ podman run --rm docker.io/nginx:alpine uname -m
      aarch64
      [ATDE ~/mkswu]$ podman save docker.io/nginx:alpine > nginx_alpine.tar
      [ATDE ~/mkswu]$ mkswu -o usb_container_nginx.swu usb_container_nginx.desc
      Enter pass phrase for /home/atmark/mkswu/swupdate.key:
      以下のファイルをUSBメモリにコピーしてください:
      '/home/atmark/mkswu/usb_container_nginx.swu'
      '/home/atmark/mkswu/nginx_alpine.tar'
      '/home/atmark/mkswu/.usb_container_nginx/nginx_alpine.tar.sig'
      
      usb_container_nginx.swu を作成しました。

6.2.2.18. 開発時に有用な—privilegedオプション

コンテナに、全権限と全てのデバイスへのアクセスを許可するオプション --privileged があります。このオプションを利用すると、コンテナに与えるべき最小の権限を洗い出す必要が無いため、開発時に有用です。

実運用の際、このオプションを利用することはセキュリティー上問題がある為、開発時にのみご利用ください。コンテナに必要な最低限の権限を与えることをおすすめします。

6.2.3. コンテナとコンテナに関連するデータを削除する

[警告]

全てのコンテナとコンテナイメージ、コンテナに関するデータが削除されるため、充分に注意して使用してください。

6.2.3.1. VSCode から実行する

VSCode 上で ABOSDE(Armadillo Base OS Development Environment) から、 Armadillo のコンテナイメージを全て削除する SWU イメージを作成することができます。

VSCode の左ペインの [COMMON PROJECT COMMAND] から [Generate Container Clear Swu] を実行すると、SWU イメージが作成されます。 SWU イメージは ~/mkswu/container_clear.swu に保存されます。

この SWU イメージを 「SWU イメージのインストール」 を参照して Armadillo へインストールしてください。

images/common-images/vscode_container_clear.png

図6.33 Armadillo 上のコンテナイメージを削除する


6.2.3.2. コマンドラインから実行する

abos-ctrl container-clear を使用すると、コンテナ、コンテナイメージ、コンテナに関するデータを削除することができます。

abos-ctrl container-clear は以下の通り動作します。

  • 以下のファイル、ディレクトリ配下のファイルを削除

    • /var/app/rollback/volumes/
    • /var/app/volumes/
    • /etc/atmark/containers/*.conf
  • 以下のファイルで container を含む行を削除

    • /etc/sw-versions
    • /etc/swupdate.watch
[armadillo ~]# abos-ctrl container-clear
This command will remove all containers and related data.
 - The following file and directories will be removed:
   - /var/app/rollback/volumes/
   - /var/app/volumes/
   - /etc/atmark/containers/*.conf
 - Lines containing the word "container" will be deleted from the following files:
   - /etc/sw-versions
   - /etc/swupdate.watch
Continue? [y/N]
y
Remove all container data succeeded

図6.34 abos-ctrl container-clear 実行例


6.2.4. コンテナ起動設定ファイルを作成する

Armadillo Base OSでは、/etc/atmark/containers/*.confファイルに指定されているコンテナがブート時に自動的に起動します。 nginx.confの記載例を以下に示します。

[armadillo ~]# cat /etc/atmark/containers/nginx.conf
set_image docker.io/library/nginx:alpine
set_readonly no
add_ports 80:80

図6.35 コンテナを自動起動するための設定例


.conf ファイルは以下のパラメータを設定できます。

6.2.4.1. コンテナイメージの選択

set_image [イメージ名]

イメージの名前を設定できます。

: set_image docker.io/debian:latest, set_image localhost/myimage

イメージをrootfsとして扱う場合に --rootfs オプションで指定できます。

: set_image --rootfs /var/app/volumes/debian

6.2.4.2. ポート転送

add_ports [ホストポート]:[コンテナポート]

設定したポートで外部からコンテナへのアクセスが可能となります。

デフォルトはTCPで、UDPも /udp を付けて使えます。スペースで分けて複数のポートを設定することができます。

以下の例では、ポート80、443(web)、UDPの69(tftp)にアクセスすることができ、コンテナのポート22(ssh)にはポート2222からアクセスすることができます。

: add_ports 80:80 443:443 2222:22 69:69/udp

[警告]

pod を使う場合、このオプションはpodの設定にしないと有効になりませんのでご注意ください。

6.2.4.3. デバイスファイル作成

add_devices [ホストパス]:[コンテナパス]

コンテナでデバイスを作成して、使用可能となります。

コンテナパスを設定しない場合はホストと同じパスを使います。

複数のデバイスを作成したい場合はスペースで分けて設定してください。

: add_devices /dev/galcore /dev/v4l/by-id/usb-046d_HD_Pro_Webcam_C920_78DA8CAF-video-index0:/dev/video3

ホストパスに「:」を含む場合は add_device "[ホストパス]" "[コンテナパス]" で追加できます。

: add_device "/dev/v4l/by-path/platform-xhci-hcd.1.auto-usb-0:1.1:1.0-video-index1" "/dev/video3"

コンテナパスに「:」を含むようなパスは設定できません。

6.2.4.4. ボリュームマウント

add_volumes [ホストパス]:[コンテナパス]:[オプション]

指定するパスをコンテナ内でマウントして、データの保存や共有することができます。

ホストパスは以下のどちらかを指定してください。

  • /var/app/rollback/volumes/<folder><folder>:

    アップデートの際に新しくコピー(snapshot)した場合、コピー先のみ変更しますので、 アップデート中でもこのデータを使うことができます。 途中で電源が落ちた場合でも、このデータに影響はありません。

    SWUpdateでアップデートするデータに向いています。

  • /var/app/volumes/<folder>: appパーティションに書きます。

    アップデートの際にコピーされませんので、アップデート中の新たな変更は 更新されたコンテナ内のアプリケーションで見れます。

    ログやデータベースに向いています。

  • /tmp/<folder>: 複数のコンテナでメモリファイルシステムを共有したい場合に使ってください。
  • /opt/firmware: 学習能力に必要なファムウェアライブラリーのパス。

コンテナパスを設定しない場合はホストパスと同じパスを使います。

オプションは podman run--volume のオプションになりますので、 ro (read-only), nodev, nosuid, noexec, shared, slave 等を設定できます。

add_volumes /var/app/volumes/database:/database: ロールバックされないデータを/databaseで保存します。

: add_volumes assets:/assets:ro,nodev,nosuid /opt/firmware: アプリケーションのデータを/assetsで読み取り、/opt/firmwareのファームウェアを使えます。

「:」はホスト側のパスとコンテナのパスを別ける意味があるため、ファイル名やデバイス名に「:」を使うことはできません。

[ティップ]

複数のコンテナでマウントコマンドを実行することがあれば、shared のフラグで起動後のマウントを共有することができます。

[armadillo ~]# cat /etc/atmark/containers/mounter.conf
set_image docker.io/alpine
add_args -ti
add_volumes /tmp/mnt:/mnt:shared 1
add_args --cap-add SYS_ADMIN
add_device /dev/sda1
[armadillo ~]# cat /etc/atmark/containers/client.conf
set_image docker.io/alpine
add_volumes /tmp/mnt:/mnt:slave 2
add_args -ti
[armadillo ~]# podman exec mounter mount /dev/sda1 /mnt 3
[armadillo ~]# podman exec client ls /mnt 4
file_on_usb

図6.36 ボリュームを shared でサブマウントを共有する例


1

マウントを行うコンテナに shared の設定とマウント権限 (SYS_ADMIN) を与えます。

2

マウントを使うコンテナに slave だけを設定すれば一方にしか共有されません。

3

USB デバイスをマウントします。

4

マウントされたことを確認します。

6.2.4.5. ホットプラグデバイスの追加

add_hotplugs [デバイスタイプ]

コンテナ起動後に挿抜を行なっても認識される(ホットプラグ)デバイスを設定できます。

通常、コンテナ内からデバイスを扱うためには、あらかじめ Armadillo 本体に当該のデバイスを接続した状態で、コンテナを起動する必要がありますが、 add_hotplugs を使用することでホットプラグに対応できます。

: add_hotplugs input

add_hotplugs に指定できる主要な文字列とデバイスファイルの対応について、表6.1「add_hotplugsオプションに指定できる主要な文字列」に示します。

表6.1 add_hotplugsオプションに指定できる主要な文字列

文字列引数の説明対象のデバイスファイル

input

マウスやキーボードなどの入力デバイス

/dev/input/mouse0, /dev/input/event0 など

video4linux

USB カメラなどの video4linux デバイスファイル

/dev/video0 など

sd

USB メモリなどの SCSI ディスクデバイスファイル

/dev/sda1 など


表6.1「add_hotplugsオプションに指定できる主要な文字列」に示した文字列の他にも、/proc/devicesの数字から始まる行に記載されている文字列を指定することができます。 図6.37「/proc/devicesの内容例」に示す状態の場合、デバイスタイプを示す文字列としては、各行の先頭の数字を除いた mempty などを指定できることがわかります。

[armadillo ~]# cat /proc/devices
Character devices:
  1 mem
  2 pty
  3 ttyp
  4 /dev/vc/0
  4 tty
  4 ttyS
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  7 vcs
 10 misc
 13 input
 29 fb
 81 video4linux
: (省略)

図6.37 /proc/devicesの内容例


デバイスタイプと実際のデバイスファイルの対応については、 カーネルドキュメント: devices.txt(Github) を参照してください。

複数のデバイスタイプを指定したい場合はスペースで分けて設定してください。

: add_hotplugs input video4linux sd

6.2.4.6. 個体識別情報の環境変数の追加

add_armadillo_env

アットマークテクノが設定した個体識別情報をコンテナの環境変数として追加することができます。

: add_armadillo_env

add_armadillo_env を設定することで追加されるコンテナの環境変数について、表6.2「add_armadillo_envで追加される環境変数」に示します。

表6.2 add_armadillo_envで追加される環境変数

環境変数環境変数の説明表示例

AT_ABOS_VERSION

ABOSのバージョン

3.18.4-at.5

AT_LAN_MAC1

アットマークテクノが設定したLAN1(eth0)のMACアドレス

00:11:0C:12:34:56

AT_PRODUCT_NAME

製品名

Armadillo-X2

AT_SERIAL_NUMBER

個体番号

00C900010001


表6.2「add_armadillo_envで追加される環境変数」に示した環境変数をコンテナ上で確認する場合、図6.38「add_armadillo_envで設定した環境変数の確認方法」に示すコマンドを実行してください。ここでは、個体番号の環境変数を例に示します。

[container ~]# echo $AT_SERIAL_NUMBER
00C900010001

図6.38 add_armadillo_envで設定した環境変数の確認方法


お客様が独自の環境変数をコンテナに追加する場合は図5.4「個体番号の環境変数をconfファイルに追記」を参考にconfファイルを編集してください。

6.2.4.7. pod の選択

set_pod [ポッド名]

「podでコンテナのネットワークネームスペースを共有する」で作成した pod の名前を入れてコンテナを pod 内で起動します。

: set_pod mypod

6.2.4.8. ネットワークの選択

set_network [ネットワーク名]

この設定に「networkの作成」で作成したネットワーク以外に nonehost の特殊な設定も選べます。

none の場合、コンテナに localhost しかないネームスペースに入ります。

host の場合はOSのネームスペースをそのまま使います。

: set_network mynetwork

6.2.4.9. IP アドレスの設定

set_ip [アドレス]

コンテナの IP アドレスを設定することができます。

: set_ip 10.88.0.100

[ティップ]

コンテナ間の接続が目的であれば、podを使ってlocalhostかpodの名前でアクセスすることができます。

6.2.4.10. 読み取り専用設定

set_readonly yes

コンテナ内からのファイルシステムへの書き込み許可を設定します。

デフォルトで書き込み可能となっています。

コンテナ内からのファイルシステムへの書き込みを禁止することで、 tmpfs として使うメモリの消費を明示的に抑えることができますが、 アプリケーションによっては読み込み専用のファイルシステムでは動作しない可能性もあります。

6.2.4.11. イメージの自動ダウンロード設定

set_pull [設定]

この設定を missing にすると、イメージが見つからない場合にイメージを自動的にダウンロードします。

always にすると、イメージがすでにダウンロード済みでも起動前に必ず更新の確認を取ります。

デフォルトでは never で、イメージが見つからない場合にエラーを表示します。

set_pull missingset_pull always

6.2.4.12. コンテナのリスタート設定

set_restart [設定]

コンテナが停止した時にリスタートさせます。

podman killpodman stop で停止する場合、この設定と関係なくリスタートしません。

デフォルトで on-failure になっています。

: set_restart alwaysset_restart no

6.2.4.13. 信号を受信するサービスの無効化

set_init no

コンテナのメインプロセスが PID 1 で起動していますが、その場合のデフォルトの信号の扱いが変わります: SIGTERM などのデフォルトハンドラが無効です。

そのため、init 以外のコマンドを set_command で設定する場合は podman-init のプロセスを PID 1 として立ち上げて、設定したコマンドをその子プロセスとして起動します。

: set_init no

6.2.4.14. 自動起動の無効化

set_autostart no または set_autostart create

Armadillo の起動時にコンテナを自動起動しないように設定できます。

create を指定した場合はコンテナは生成されており、podman start <name> で起動させることができます。

no を指定した場合は podman_start <name> で起動させることができます。

[ティップ]

コンフィグに記載していないイメージはアップデートの際に削除されますので、そういったイメージに対して設定してください。

6.2.4.15. 実行コマンドの設定

set_command [コマンド]

コンテナを起動するときのコマンド。設定されなかった場合、コンテナイメージのデフォルトを使います。

: set_command /bin/sh -c "echo bad example"

6.2.4.16. podman run に引数を渡す設定

add_args [引数]

ここまでで説明した設定項目以外の設定を行いたい場合は、この設定で podman run に直接引数を渡すことができます。

add_args --cap-add=SYS_TTY_CONFIG --env=XDG_RUNTIME_DIR=/run/xdg_home

6.2.5. アットマークテクノが提供するイメージを使う

アットマークテクノは、動作確認環境として使用できる Debian ベースのイメージを提供しています。 ここでは以下の 3 つの手順について説明します。

  • ABOSDE からインストールする方法
  • Docker ファイルからイメージをビルドする方法
  • すでにビルド済みのイメージを使う方法

6.2.5.1. ABOSDE からインストールする

「VSCode を使用して Armadillo のセットアップを行う」を参照して、 Armadillo のセットアッププロジェクトを作成しておいてください。

VSCode の左ペインの [my_project] から [Generate at-debian-image container setup swu] を実行してください。

images/common-images/armadillo_setup_vscode_at_debian_image_container_setup.png

図6.39 at-debian-image のコンテナイメージをインストールする SWU ファイルを作成する


作成した SWU ファイルは container_setup/at-debian-image/at-debian-image.swu に保存されています。 この SWU イメージを 「SWU イメージのインストール」 を参照して Armadillo へインストールしてください。

6.2.5.2. Docker ファイルからイメージをビルドする

Armadillo-X2 コンテナ から 「Debian [VERSION] サンプル Dockerfile」 ファイル (at-debian-image-dockerfile-[VERSION].tar.gz) をダウンロードします。 その後 podman build コマンドを実行します。

[armadillo ~]# tar xzf at-debian-image-dockerfile-[VERSION].tar.gz
[armadillo ~]# cd at-debian-image-dockerfile-[VERSION]
[armadillo ~]# abos-ctrl podman-storage --disk
[armadillo ~]# podman build -t at-debian-image:latest .
:
: (省略)
:
[armadillo ~]# podman images
REPOSITORY                 TAG         IMAGE ID      CREATED             SIZE
localhost/at-debian-image  latest      c8e8d2d55456  About a minute ago  233 MB
docker.io/library/debian   bullseye    723b4a01cd2a  18 hours ago        123 MB

図6.40 Docker ファイルによるイメージのビルドの実行例


podman images コマンドにより at-debian-image がビルドされたことが確認できます。 library/debian イメージはベースとなっている Debian イメージです。

6.2.5.3. ビルド済みのイメージを使用する

Armadillo-X2 コンテナ から 「Debian [VERSION] サンプルコンテナイメージ」 ファイル (at-debian-image-[VERSION].tar) をダウンロードします。 その後 podman load コマンドを実行します。

[armadillo ~]# podman load -i at-debian-image-[VERSION].tar
:
: (省略)
:
[armadillo ~]# podman images
REPOSITORY                 TAG         IMAGE ID      CREATED       SIZE
localhost/at-debian-image  [VERSION]   93a4ec873ac5  17 hours ago  233 MB
localhost/at-debian-image  latest      93a4ec873ac5  17 hours ago  233 MB

図6.41 ビルド済みイメージを load する実行例


podman images コマンドにより at-debian-image がビルドされたことが確認できます。

6.2.6. alpine のコンテナイメージをインストールする

alpine のコンテナイメージは、 ABOSDE を用いてインストールすることが可能です。 「VSCode を使用して Armadillo のセットアップを行う」を参照して、 Armadillo のセットアッププロジェクトを作成しておいてください。

VSCode の左ペインの [my_project] から [Generate alpine container setup swu] を実行してください。

images/common-images/armadillo_setup_vscode_alpine_container_setup.png

図6.42 alpine のコンテナイメージをインストールする SWU ファイルを作成する


作成した SWU ファイルは container_setup/alpine/alpine.swu に保存されています。 この SWU イメージを 「SWU イメージのインストール」 を参照して Armadillo へインストールしてください。

6.2.7. コンテナのネットワークを扱う

この章では、コンテナ内のネットワークを扱う方法について示します。

6.2.7.1. コンテナの IP アドレスを確認する

基本的にコンテナの IP アドレスは Podman イメージからコンテナを作成したときに自動的に割り振られます。 コンテナに割り振られている IP アドレスはホスト OS 側からは podman inspect コマンドを用いて、以下のように確認することができます。

[armadillo ~]# vi /etc/atmark/containers/net_example.conf
set_image docker.io/alpine
set_command sleep infinity
[armadillo ~]# podman_start net_example
Starting 'net_example'
48ae479af65445674323567c17c5418dd4624292351e061bd2bd8a0add4cf150
[armadillo ~]# podman inspect --format '{{ .NetworkSettings.IPAddress }}' net_example
10.88.0.17

図6.43 コンテナの IP アドレス確認例


コンテナ内の ip コマンドを用いて確認することもできます。

[armadillo ~]# podman exec net_example ip addr show eth0
3: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 10.88.0.17/16 brd 10.88.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::40e5:98ff:feec:4b17/64 scope link
       valid_lft forever preferred_lft forever

図6.44 ip コマンドを用いたコンテナの IP アドレス確認例


6.2.7.2. コンテナに固定 IP アドレスを設定する

[警告]

podman はデフォルトで 10.88.0.0/16 を使います。

他に使用しているIPアドレスと被った場合等はコンテナに別のIPアドレスを設定してください。

コンテナに固定 IP アドレスを設定するためには、最初にユーザ定義のネットワークを作成する必要があります。 以下に 192.168.1.0/24 にユーザ定義のネットワークを作成する例を示します。

[armadillo ~]# vi /etc/atmark/containers/my_network.conf
set_type network
set_subnet 192.168.1.0/24
[armadillo ~]# podman_start my_network
Creating network 'my_network'
my_network

図6.45 ユーザ定義のネットワーク作成例


コンテナを作成する際に、上記で作成したネットワークと設定したい IP アドレスを渡すことで、 コンテナの IP アドレスを固定することができます。 以下の例では、IPアドレスを 192.168.1.10 に固定します。

[armadillo ~]# vi /etc/atmark/containers/network_example.conf
set_image docker.io/alpine
set_command sleep infinity
set_network my_network
set_ip 192.168.1.10
[armadillo ~]# podman_start network_example
Starting 'network_example'
3ea8c9031bf833228908bd73d8929b1d543b189b436c218e0634e0d39409e100

図6.46 IP アドレス固定のコンテナ作成例


コンテナの IP アドレスが、192.168.1.10 に設定されていることが確認できます。

[armadillo ~]# podman inspect --format '{{ .NetworkSettings.Networks.my_network.IPAddress }}' network_example
192.168.1.10

図6.47 コンテナの IP アドレス確認例


6.2.8. コンテナ内にサーバを構築する

この章では、コンテナ内で様々なサーバを構築する方法について示します。 この章で取り上げているサーバは alpine の apk コマンドでインストールすることが可能です。

6.2.8.1. HTTP サーバを構築する

ここでは、HTTP サーバとして Apache と lighttpd の 2 種類を使用する場合について説明します。

  • Apache を使用する

alpine イメージからコンテナを作成し、そのコンテナ内に Apache をインストールします。 コンテナ作成の際に、ホスト OS の 8080 番ポートをコンテナ内の 80 番ポートに転送する指定を行っています。

[armadillo ~]# vi /etc/atmark/containers/apache_example.conf
set_image docker.io/alpine
set_command sleep infinity
add_ports 8080:80
[armadillo ~]# podman_start apache_example
Starting 'apache_example'
ea0a1ed9c2fe170a6db02e480300467510f4e844900efb35c7a24cc1a8653af2
[armadillo ~]# podman exec -it apache_example sh
[container ~]# apk upgrade && apk add apache2
[container ~]# httpd
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.0.2. Set the 'ServerName' directive globally to suppress this message

図6.48 コンテナに Apache をインストールする例


他の PC などの Web ブラウザから、ホスト OS の IP アドレスの 8080 番ポートに接続すると、 動作確認用ページが表示されます。 デフォルトでは、/var/www/localhost/htdocs ディレクトリにファイルを置くことで Web ブラウザから閲覧できます。 Apache の詳細な設定は、/etc/apache2 ディレクトリにある設定ファイルを編集することで変更可能です。

  • lighttpd を使用する

alpine イメージからコンテナを作成し、そのコンテナ内に lighttpd をインストールします。 コンテナ作成の際に、ホスト OS の 8080 番ポートをコンテナ内の 80 番ポートに転送する指定を行っています。

[armadillo ~]# vi /etc/atmark/containers/lighttpd_example.conf
set_image docker.io/alpine
set_command sleep infinity
add_ports 8080:80
[armadillo ~]# podman_start lighttpd_example
Starting 'lighttpd_example'
fd7ea338d09c5e8962654ed54bba17fb6a9ed4fca1b344e350bbf8f943d2f12b
[armadillo ~]# podman exec -it lighttpd_example sh
[container ~]# apk upgrade && apk add lighttpd
[container ~]# echo "<html><body>It works!</body></html>" > /var/www/localhost/htdocs/index.html
[container ~]# lighttpd -f /etc/lighttpd/lighttpd.conf

図6.49 コンテナに lighttpd をインストールする例


lighttpd はデフォルトでは動作確認用ページが用意されていないため、上記の手順では簡単なページを /var/www/localhost/htdocs ディレクトリの下に配置しています。 他の PC などの Web ブラウザから、ホスト OS の IP アドレスの 8080 番ポートに接続すると表示されます。 lighttpd の詳細な設定は、/etc/lighttpd ディレクトリにある設定ファイルを編集することで変更可能です。

6.2.8.2. FTP サーバを構築する

ここでは、FTP サーバとして vsftp を使用する場合について説明します。 alpine イメージからコンテナを作成し、そのコンテナ内に vsftpd をインストールします。 コンテナ作成の際に、FTP 通信で使用するポートについてホスト OS 側からコンテナ内のポートに転送する指定と、 コンテナ内の環境変数として PASV_ADDRESS にホスト OS 側の IP アドレスの指定を行っています。

[armadillo ~]# vi /etc/atmark/containers/ftp_example.conf
set_image docker.io/alpine
set_command sleep infinity
add_ports 21:21 21100-21110:21100-21110
add_args --env=PASV_ADDRESS=<ホストの IP アドレス>
[armadillo ~]# podman_start ftp_example
Starting 'ftp_example'
efcf1ba752c2db9ae1a33ac11af3be71d95ac7b737ce9734730ebca602e57796
[armadillo ~]# podman exec -it ftp_example sh
[container ~]# apk upgrade && apk add vsftpd

図6.50 コンテナに vsftpd をインストールする例


コンテナ内にユーザアカウントを作成し、このユーザで ftp ログインできるようにします。

[container ~]# adduser atmark
Changing password for atmark
New password: (パスワードを入力)
Retype password: (パスワードを入力)
passwd: password for atmark changed by root

図6.51 ユーザを追加する例


作成したユーザで ftp ログインできるように、vsftpd の設定ファイルを編集します。

[container ~]# sed -i -e 's/anonymous_enable=YES/#anonymous_enable=YES/g' /etc/vsftpd/vsftpd.conf
[container ~]# sed -i -e 's/#local_enable=YES/local_enable=YES/g' /etc/vsftpd/vsftpd.conf
[container ~]# sed -i -e 's/#write_enable=YES/write_enable=YES/g' /etc/vsftpd/vsftpd.conf
[container ~]# echo "pasv_enable=YES" >> /etc/vsftpd/vsftpd.conf
[container ~]# echo "pasv_min_port=21100" >> /etc/vsftpd/vsftpd.conf
[container ~]# echo "pasv_max_port=21110" >> /etc/vsftpd/vsftpd.conf
[container ~]# echo "pasv_address=$PASV_ADDRESS" >> /etc/vsftpd/vsftpd.conf

図6.52 設定ファイルの編集例


編集した設定ファイルを指定して vftpd を起動することにより、ftp 接続可能となります。 ftp ログイン時のアカウントは前述の手順で作成したものを使用します。

[container ~]# vsftpd /etc/vsftpd/vsftpd.conf

図6.53 vsftpd の起動例


6.2.8.3. Samba サーバを構築する

ここでは、Samba サーバの構築方法について説明します。 alpine イメージからコンテナを作成し、そのコンテナ内に samba をインストールします。 コンテナ作成の際に、samba で使用するポートについてホスト OS 側からコンテナ内のポートに転送する指定を行っています。

[armadillo ~]# vi /etc/atmark/containers/smb_example.conf
set_image docker.io/alpine
set_command sleep infinity
add_ports 139:139 445:445
[armadillo ~]# podman_start smb_example
Starting 'smb_example'
6d81c01fe27b5a92ee6ea69de2f9a8dbb569d420c2f5f630ece1966c81824a1f
[armadillo ~]# podman exec -it smb_example sh
[container ~]# apk upgrade && apk add samba

図6.54 コンテナに samba をインストールする例


コンテナ内にユーザアカウントを作成し、このユーザで samba にログインできるようにします。

[container ~]# adduser atmark
Changing password for atmark
New password: (パスワードを入力)
Retype password: (パスワードを入力)
passwd: password for atmark changed by root
[container ~]# pdbedit -a atmark
new password: (パスワードを入力)
retype new password: (パスワードを入力)

図6.55 ユーザを追加する例


samba を起動すると、前述の手順で作成したユーザアカウントで他の PC などからログインすることができます。

[container ~]# smbd

図6.56 samba の起動例


共有するディレクトリの指定などの詳細設定は /etc/samba/smb.conf ファイルを編集することで変更可能です。

6.2.8.4. SQL サーバを構築する

ここでは、RDMS として sqlite を使用する場合について説明します。 alpine イメージからコンテナを作成し、そのコンテナ内に sqlite をインストールします。

[armadillo ~]# vi /etc/atmark/containers/sqlite_example.conf
set_image docker.io/alpine
set_command sleep infinity
add_volumes /var/app/volumes/sqlite_db:/db
[armadillo ~]# podman_start sqlite_example
Starting 'sqlite_example'
114c5f1dbb7e81293dcb8fbe0c600b861626375b14cfe4023761acaa84fdcad1
[armadillo ~]# podman exec -it sqlite_example sh
[container ~]# apk upgrade && apk add sqlite

図6.57 コンテナに sqlite をインストールする例


コンテナ内に入り、sqlite3 コマンドを実行すると sqlite のプロンプトが表示され データベースの操作ができるようになります。

[container ~]# sqlite3 /db/mydb.sqlite
SQLite version 3.34.1 2021-01-20 14:10:07
Enter ".help" for usage hints.
sqlite>

図6.58 sqlite の実行例


6.2.9. 画面表示を行う

この章では、コンテナ内で動作するアプリケーションから Armadillo-X2 に接続されたディスプレイに 出力を行う方法について示します。

6.2.9.1. Wayland を扱う

コンテナ内から、Wayland のコンポジタである weston を起動し画面表示を行う例を示します。 ここではアットマークテクノが提供するイメージからコンテナを作成します。 このイメージに関しては 「アットマークテクノが提供するイメージを使う」 を参照してください。

[armadillo ~]# vi /etc/atmark/containers/wayland_example.conf
set_image localhost/at-debian-image:latest
add_args --env=XDG_RUNTIME_DIR=/tmp 1
add_devices /dev/dri /dev/galcore /dev/tty7 2
add_devices /dev/input 3
add_volumes /run/udev:/run/udev:ro 4
add_volumes /opt/firmware:/opt/firmware:ro 5
add_args --cap-add=SYS_TTY_CONFIG 6
set_command weston --tty 7 7
[armadillo ~]# podman_start wayland_example
Starting 'wayland_example'
654fe87422f85e8835b00761071347bafa632f969645db5fa835c88e2a55e2cc

図6.59 Wayland を扱うためのコンテナ作成例


1

weston の実行に必要な環境変数を設定します。

2

画面描画に必要なデバイスを設定します。

3

キーボードやマウスなどを使用可能にするためのデバイスを設定します。

4

ホスト OS 側の /run/udev をコンテナ内からマウントするように設定します。

5

ホスト OS 側の /opt/firmware をコンテナ内からマウントするように設定します。

6

tty を操作するための権限を設定します。

7

weston を起動します。ここで設定する tty は add_devices の tty7 を使います。

次に、以下のように weston を起動します。オプションである --tty に設定する値は、 コンテナ作成時に渡した tty の数字にします。

[armadillo ~]# podman logs wayland_example
Date: 2021-11-21 UTC
[23:46:52.823] weston 9.0.0
               https://wayland.freedesktop.org
               Bug reports to: https://gitlab.freedesktop.org/wayland/weston/issues/
               Build: lf-5.10.35-2.0.0-rc2-0-g230e9bc+
[23:46:52.825] Command line: weston --tty=7
[23:46:52.825] OS: Linux, 5.10.52-1-at, #2-Alpine SMP PREEMPT Thu Nov 18 09:10:13 UTC 2021, aarch64
[23:46:52.826] Using config file '/etc/xdg/weston/weston.ini'
[23:46:52.829] Output repaint window is 16 ms maximum.
[23:46:52.831] Loading module '/usr/lib/aarch64-linux-gnu/libweston-9/drm-backend.so'
[23:46:52.897] initializing drm backend
[23:46:52.897] logind: not running in a systemd session
[23:46:52.897] logind: cannot setup systemd-logind helper (-2), using legacy fallback
[23:46:52.902] using /dev/dri/card1
[23:46:52.902] DRM: supports atomic modesetting
[23:46:52.902] DRM: does not support GBM modifiers
[23:46:52.902] DRM: supports picture aspect ratio
[23:46:52.903] Loading module '/usr/lib/aarch64-linux-gnu/libweston-9/g2d-renderer.so'
[23:46:52.982] event1  - gpio-keys: is tagged by udev as: Keyboard
[23:46:52.983] event1  - gpio-keys: device is a keyboard
[23:46:52.986] event0  - audio-hdmi HDMI Jack: is tagged by udev as: Switch
[23:46:53.027] event0  - not using input device '/dev/input/event0'
[23:46:53.066] libinput: configuring device "gpio-keys".
[23:46:53.067] DRM: head 'LVDS-1' found, connector 39 is connected, EDID make 'unknown', model 'unknown', serial 'unknown'
[23:46:53.067] DRM: head 'HDMI-A-1' found, connector 40 is disconnected.
[23:46:53.067] Registered plugin API 'weston_drm_output_api_v1' of size 24
[23:46:53.067] Compositor capabilities:
               arbitrary surface rotation: yes
               screen capture uses y-flip: yes
               presentation clock: CLOCK_MONOTONIC, id 1
               presentation clock resolution: 0.000000001 s
[23:46:53.070] Loading module '/usr/lib/aarch64-linux-gnu/weston/desktop-shell.so'
[23:46:53.073] launching '/usr/libexec/weston-keyboard'
[23:46:53.079] Loading module '/usr/lib/aarch64-linux-gnu/libweston-9/xwayland.so'
[23:46:53.210] Registered plugin API 'weston_xwayland_v1' of size 32
[23:46:53.210] Registered plugin API 'weston_xwayland_surface_v1' of size 16
[23:46:53.210] xserver listening on display :0
[23:46:53.211] launching '/usr/libexec/weston-desktop-shell'
[armadillo ~]# podman exec -ti wayland_example bash
[container ~]# weston-terminal

図6.60 コンテナ内で weston を起動したログの出力とアプリケーションの実行例


Armadillo-X2 に接続しているディスプレイ上に、デスクトップ画面が表示されます。

  • weston の設定

アットマークテクノが提供するイメージでは、weston の設定ファイルは /etc/xdg/weston/weston.ini に配置してあります。

[container ~]# cat /etc/xdg/weston/weston.ini
[core]
idle-time=0
use-g2d=1
xwayland=true
repaint-window=16

[shell]
panel-position=none

[output]
name=HDMI-A-1
mode=1920x1080 1

[output]
name=LVDS-1
mode=off

図6.61 weston.ini


1

この行でHDMIモニタに出力する画像の解像度指定を行うことができます。初期値は1920x1080です。

[ティップ]

weston.ini で解像度を指定しない場合や、指定した解像度にモニタが対応していない場合は、モニタが対応している別な解像度に自動的に切り替わります。 その場合、意図しない解像度で描画されることがあります。 GUIアプリケーションの描画の乱れにつながる場合がありますので、予め使用するモニタに合わせて解像度を指定しておくことをお勧めします。

[ティップ]

設定ファイルを更新するにはコンテナイメージを新しく保存することもできますが、 ボリュームを使ってこのファイルだけを更新することができます。

[armadillo ~]# vi /etc/atmark/containers/wayland_example.conf
...
add_volumes weston_conf:/etc/xdg/weston 1
[armadillo ~]# mkdir /var/app/rollback/volumes/weston_conf
[armadillo ~]# cp weston.ini /var/app/rollback/volumes/weston_conf/ 2
[armadillo ~]# podman_start wayland_example 3
Starting 'wayland_example'
654fe87422f85e8835b00761071347bafa632f969645db5fa835c88e2a55e2cc
7a1e74510b14012110bfc4daf6f56cb0554378f513bc77554016b616e7452d58
[armadillo ~]# persist_file -v /etc/atmark/containers/wayland_example.conf 4
'/etc/atmark/containers/wayland_example.conf' -> '/mnt/etc/atmark/containers/wayland_example.conf'

図6.62 weston.ini をボリュームで渡す実行例


1

コンフィグファイルにボリュームを追加します。 weston_conf は相対パスなので /var/app/rollback/volumes/weston_conf がマウントされます。ボリュームの選択については 「コンテナの変更を保存する」 を参照ください。

2

コンフィグをコピーします。

3

コンテナを再起動させます。

4

動作確認ができた後にコンフィグファイルを保存します。

  • weston の運用

コンテナの管理として、一つのコンテナで一つのアプリケーションを動かす事を推奨します。

一つのコンテナでwestonを起動して、 XDG_RUNTIME_DIRを共有することで別のコンテナでwestonを使用する アプリケーションを起動させることは以下のコンフィグで可能です。

[armadillo ~]# vi /etc/atmark/containers/weston.conf 1
set_image localhost/at-debian-image:latest
add_devices /dev/dri /dev/galcore /dev/input /dev/tty7
add_volumes /run/udev:/run/udev:ro /opt/firmware:/opt/firmware:ro
add_volumes /tmp/xdg_home:/run/xdg_home
add_args --env=XDG_RUNTIME_DIR=/run/xdg_home 2
add_args --cap-add=SYS_TTY_CONFIG
set_command weston --tty=7
[armadillo ~]# vi /etc/atmark/containers/detect_object.conf 3
set_image localhost/at-debian-image:latest
add_devices /dev/galcore /dev/video3
add_volumes /opt/firmware:/opt/firmware:ro /tmp/xdg_home:/run/xdg_home
set_restart always 4
add_args --env=XDG_RUNTIME_DIR=/run/xdg_home
set_command /root/start_detect_object.sh
[armadillo ~]# podman_start weston 5
[armadillo ~]# podman_start detect_object 6

1

westonの設定ファイルを作成します。

2

XDG_RUNTIME_DIR を volume で共有して、同じディレクトリを使います。

3

例としてdetect_objectという名前のクライアントの設定ファイルを作成します。ここでは任意の名前を設定できます。

4

アプリケーションによっては、westonが異常終了した時にエラーを出力しない場合があるため、set_restart always にします。

5 6

確認のためコンテナを手動で起動します。

  • ユーザを指定して weston を起動する

アットマークテクノが提供するイメージ at-debian-image にはデフォルトで atmark ユーザが存在しています。 at-weston-launch コマンドを使うと、 root ユーザではなく atmark ユーザで weston を起動することができます。

[armadillo ~]# vi /etc/atmark/containers/weston.conf 1
set_image localhost/at-debian-image:latest
add_devices /dev/dri /dev/galcore /dev/input /dev/tty7 2
add_volumes /run/udev:/run/udev:ro /opt/firmware:/opt/firmware:ro
add_volumes /tmp/xdg_home:/run/xdg_home
add_args --env=XDG_RUNTIME_DIR=/run/xdg_home
add_args --cap-add=SYS_TTY_CONFIG
set_command at-weston-launch --tty /dev/tty7 --user atmark 3
[armadillo ~]# podman_start weston 4

1

westonの設定ファイルを作成します。

2

使用する tty として /dev/tty7 を追加します。

3

at-weston-launch コマンドのオプションとして使用する tty とユーザ名を渡します。

4

確認のためコンテナを手動で起動します。

--tty と --user を指定しなかった場合は、デフォルトで /dev/tty7 と atmark ユーザが使われます。

  • スクリーンショットを保存する

weston を起動する際に、--debug オプションを渡すと weston-screenshooter コマンドでスクリーンショットを 保存することができます。

[armadillo ~]# vi /etc/atmark/containers/weston.conf 1
set_image localhost/at-debian-image:latest
add_devices /dev/dri /dev/galcore /dev/input /dev/tty7
add_volumes /run/udev:/run/udev:ro /opt/firmware:/opt/firmware:ro
add_volumes /tmp/xdg_home:/run/xdg_home
add_args --env=XDG_RUNTIME_DIR=/run/xdg_home
add_args --cap-add=SYS_TTY_CONFIG
set_command weston --tty=7 --debug 2
[armadillo ~]# podman_start weston 3
[armadillo ~]# podman exec -it weston /bin/bash 4
[container ~]# weston-screenshooter 5
[container ~]# ls
wayland-screenshot-[date].png 6

1

westonの設定ファイルを作成します。

2

--debug オプションを渡します。

3

確認のためコンテナを手動で起動します。

4

起動した weston コンテナ内で /bin/bash を起動してログインします。

5

weston-screenshooter コマンドを実行します。

6

カレントディレクトリ内に wayland-screenshot-[date].png というファイル名で保存されます。

[警告]

--debug オプションは開発時にのみ使用してください。正式運用時の使用は非推奨です。

[ティップ]

Armadillo-X2 にキーボードを接続している場合は、--debug オプションを渡さなくても Windows キー + s を押下することによりスクリーンショットを保存することができます。 この場合、スクリーンショットはコンテナ内の /proc/[weston の PID]/cwd 下に保存されます。

6.2.9.2. X Window System を扱う

コンテナ内から、X Window System を起動し画面表示を行う例を示します。 ここではアットマークテクノが提供するイメージからコンテナを作成します。 このイメージに関しては 「アットマークテクノが提供するイメージを使う」 を参照してください。

[armadillo ~]# vi /etc/atmark/containers/x_example.conf
set_image at-debian-image
set_command sleep infinity
add_devices /dev/tty7 1
add_devices /dev/fb0 2
add_devices /dev/input 3
add_volumes /run/udev:/run/udev:ro 4
add_args --cap-add=SYS_ADMIN 5
[armadillo ~]# podman start x_example
Starting 'x_example'
26847e21bd519f99466af32fdf0d809e2216d3e8ddf05c185e5428fe46e6a09b

図6.63 X Window System を扱うためのコンテナ起動例


1

X Window System に必要な tty を設定します。どこからも使われていない tty とします。

2

画面描画先となるフレームバッファを設定します。

3

キーボードやマウスなどを使用可能にするためのデバイスを設定します。

4

ホスト OS 側の /run/udev をコンテナ内からマウントするように設定します。

5

X Window System の動作に必要な権限を設定します。

次に、以下のように X Window System を起動します。 オプションである vt に設定する値は、コンテナ作成時に渡した tty の数字にします。

[armadillo ~]# podman exec -ti x_example bash
[container ~]# apt install xorg
[container ~]# X vt7 -retro

X.Org X Server 1.20.11
X Protocol Version 11, Revision 0
Build Operating System: linux Debian
Current Operating System: Linux 25297ceb226c 5.10.52-1-at #2-Alpine SMP PREEMPT Thu Nov 18 09:10:13 UTC 2021 aarch64
Kernel command line: console=ttymxc1,115200 root=/dev/mmcblk2p1 rootwait ro
Build Date: 13 April 2021  04:07:31PM
xorg-server 2:1.20.11-1 (https://www.debian.org/support)
Current version of pixman: 0.40.0
        Before reporting problems, check http://wiki.x.org
        to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
        (++) from command line, (!!) notice, (II) informational,
        (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.0.log", Time: Sun Nov 21 23:51:18 2021
(==) Using system config directory "/usr/share/X11/xorg.conf.d"

図6.64 コンテナ内で X Window System を起動する実行例


Armadillo-X2 に接続しているディスプレイ上に、デスクトップ画面が表示されます。

6.2.9.3. フレームバッファに直接描画する

コンテナ内で動作するアプリケーションからフレームバッファに直接描画するためには、Podman のイメージからコンテナを作成する際にホスト OS 側の デバイスファイル /dev/fbN を渡す必要があります。以下は、/dev/fb0 を渡して alpine イメージからコンテナを作成する例です。

[armadillo ~]# vi /etc/atmark/containers/fb_example.conf
set_image docker.io/alpine
set_command sleep infinity
add_devices /dev/fb0
[armadillo ~]# podman_start fb_example
Starting 'fb_example'
e8a874e922d047d5935350cd7411682dbbeb90fa828cef94af36acfb6d77476e

図6.65 フレームバッファに直接描画するためのコンテナ作成例


コンテナ内に入って、ランダムデータをフレームバッファに描画する例を以下に示します。 これにより、接続しているディスプレイ上の表示が変化します。

[armadillo ~]# podman exec -it fb_example sh
[container ~]# cat /dev/urandom > /dev/fb0
cat: write error: No space left on device

図6.66 フレームバッファに直接描画する実行例


6.2.9.4. タッチパネルを扱う

タッチパネルが組み込まれているディスプレイを接続している環境で、 コンテナ内からタッチイベントを取得するためには、Podman のイメージからコンテナを作成する際に ホスト OS 側の /dev/input を渡す必要があります。

[armadillo ~]# vi /etc/atmark/containers/touch_example.conf
set_image docker.io/alpine
set_command sleep infinity
add_devices /dev/input
[armadillo ~]# podman_start touch_example
Starting 'touch_example'
cde71165076a413d198864899b64ff9c5fecdae222d9ee6646e189b5e976d94a

図6.67 タッチパネルを扱うためのコンテナ作成例


Wayland などの GUI 環境と組み合わせて使うことで、タッチパネルを利用した GUI アプリケーションの操作が可能となります。

6.2.9.5. VPU を扱う

Armadillo-X2 で採用している i.MX 8M Plus には、動画のエンコード/デコード処理に特化した演算ユニットである VPU (Video Processing Unit) が搭載されています。 VPU を活用することでシステム全体のパフォーマンスを落とすことなく、動画のエンコード/デコード処理を行うことができます。 コンテナ内で動作するアプリケーションから VPU を扱うためには、コンテナ作成時にデバイスとして、 /dev/mxc_hantro と /dev/mxc_hantro_vc8000e および /dev/ion を渡す必要があります。 ここではアットマークテクノが提供するイメージからコンテナを作成します。 このイメージに関しては 「アットマークテクノが提供するイメージを使う」 を参照してください。

[armadillo ~]# vi /etc/atmark/containers/vpu_example.conf
set_image at-debian-image
set_command sleep infinity
add_devices /dev/mxc_hantro /dev/mxc_hantro_vc8000e
add_devices /dev/ion
[armadillo ~]# podman_start vpu_example
Starting 'vpu_example'
2aeea66c6f54abddc7d4dbdca915b279acd6962ce0c06b36c7173ec36f1c88ee
[armadillo ~]# podman exec -it vpu_example /bin/bash
[container ~]# ls /dev/mxc_hantro /dev/mxc_hantro_vc8000e /dev/ion
/dev/ion  /dev/mxc_hantro  /dev/mxc_hantro_vc8000e

図6.68 VPU を扱うためのコンテナ作成例


weston と GStreamer がインストール済みのイメージと組み合わせて使うことで、 VPU を使用して動画のエンコード/デコードを行うことができます。

[armadillo ~]# vi /etc/atmark/containers/gst_example.conf
set_image at-debian-image
set_command sleep infinity
add_devices /dev/dri /dev/galcore
add_devices /dev/mxc_hantro /dev/mxc_hantro_vc8000e
add_devices /dev/ion /dev/video3
add_devices /dev/input /dev/tty7
add_volumes /run/udev:/run/udev:ro
add_volumes /opt/firmware:/opt/firmware:ro
add_args --cap-add=SYS_TTY_CONFIG
[armadillo ~]# podman_start gst_example
Starting 'gst_example'
1332389d3c7004b623cee4227545c62aefd17b363c9a0a494d7bb217341c38ae

図6.69 weston と GStreamer を扱うためのコンテナ作成例


このようにして作成したコンテナにログインすると、 GStreamer で VPU を使用した動画のエンコード/デコードが行なえます。

[armadillo ~]# podman exec -ti gst_example bash
[container ~]# apt install gstreamer1.0-imx libgstreamer-imx gstreamer1.0-plugins-bad \
libgstreamer-plugins-bad1.0-0 gstreamer1.0-plugins-base libgstreamer-plugins-base1.0-0 \
gstreamer1.0-plugins-good libgstreamer1.0-0 gstreamer1.0-tools gstreamer1.0-imx-tools
[container ~]# weston --tty=7 &
[container ~]# gst-launch-1.0 filesrc location=<ファイル名> ! qtdemux ! h264parse ! vpudec ! queue ! waylandsink

図6.70 GStreamer によるデコード実行例


USB カメラも組み合わせると、カメラからの映像をエンコードしてファイルに保存することも可能です。

[container ~]# gst-launch-1.0 -e v4l2src device=/dev/video3 ! video/x-raw,width=640,height=480,framerate=30/1 ! queue ! vpuenc_h264 ! h264parse ! queue ! qtmux ! filesink location=./output.mp4

図6.71 GStreamer によるエンコード実行例


上記を実行することで、USB カメラからの映像が H.264 にエンコードされてファイルに保存されます。この例ではカメラデバイスを /dev/video3 としていますが、 環境によって異なりますので適切なものを設定してください。

6.2.10. パワーマネジメント機能を使う

この章では、コンテナ内からパワーマネジメント機能を使う方法について示します。

6.2.10.1. サスペンド状態にする

パワーマネジメント機能を使ってサスペンド状態にするには、Podman のイメージからコンテナを作成する際に ホスト OS 側の /sys ディレクトリを渡す必要があります。 以下は、/sys を渡して alpine イメージからコンテナを作成する例です。ここで渡された /sys ディレクトリは コンテナ内の /sys にマウントされます。

[armadillo ~]# vi /etc/atmark/containers/pm_example.conf
set_image docker.io/alpine
set_command sleep infinity
add_volumes /sys
[armadillo ~]# podman_start pm_example
Starting 'pm_example'
ab656f08a6cba2dc5919dbc32f8a6209782ba04baa0c6c21232a52046a21337e

図6.72 パワーマネジメント機能を使うためのコンテナ作成例


コンテナ内から、/sys/power/state に次の文字列を書き込むことにより、サスペンド状態にすることができます。

表6.3 対応するパワーマネジメント状態

パワーマネジメント状態 文字列 説明

Suspend-to-RAM

mem

最も消費電力を抑えることができる

Suspend-to-Idle

freeze

最も短時間で復帰することができる


[armadillo ~]# podman exec -it pm_example sh
[container ~]# echo mem > /sys/power/state

図6.73 サスペンド状態にする実行例


6.2.10.2. 起床要因を有効化する

サスペンド状態から起床要因として、利用可能なデバイスを以下に示します。

UART2 (console)
起床要因
データ受信
有効化
[container ~]# echo enabled > /sys/bus/platform/drivers/imx-uart/30890000.serial/tty/ttymxc1/power/wakeup
USB
起床要因
USBデバイスの挿抜
有効化
[container ~]# echo enabled > /sys/bus/platform/devices/32f10100.usb/power/wakeup
RTC(i.MX8MP)
起床要因
アラーム割り込み
実行例
[armadillo ~]# vi /etc/atmark/containers/rtc_pm_example.conf
set_image docker.io/alpine
set_command sleep infinity
add_volumes /sys
add_devices /dev/rtc0
[armadillo ~]# podman_start rtc_pm_example
Starting 'rtc_pm_example'
8fbef3edda3b7fcea5b1f8cbf960cf469b7e82c4d1ecd35477076e81fc24e39f
[armadillo ~]# podman exec -ti rtc_pm_example sh
[container ~]# apk add util-linux
[container ~]# rtcwake -m mem -s 5
: (省略)
[  572.720300] printk: Suspending console(s) (use no_console_suspend to debug)
<ここで5秒を待つ>
[  573.010663] Disabling non-boot CPUs ...
...

図6.74 サスペンド状態にする実行例、rtcで起こす


[警告]

RV-8803-C7は、毎分 0 秒にしかアラーム割り込みを発生させることができません。 0 時 0 分 30 秒の時に、1 秒後にアラームが鳴るように設定しても、 実際にアラーム割り込みが発生するのは 0 時 1 分 0 秒となります。

ユーザースイッチ
起床要因
ユーザースイッチ押下
有効化
[armadillo ~]# vi /boot/overlays.txt 1
fdt_overlays=armadillo_iotg_g4-sw1-wakeup.dtbo

[armadillo ~]# persist_file -vp /boot/overlays.txt 2
'/boot/overlays.txt' -> '/mnt/boot/overlays.txt'
Added "/boot/overlays.txt" to /etc/swupdate_preserve_files

[armadillo ~]# reboot 3
: (省略)
Applying fdt overlay: armadillo_iotg_g4-sw1-wakeup.dtbo 4
: (省略)

[armadillo ~]# cat /sys/devices/platform/gpio-keys/power/wakeup 5
enabled

1

/boot/overlays.txt ファイルに「armadillo_iotg_g4-sw1-wakeup.dtbo」を追加します。 ファイルが存在しない場合は新規に作成してください。 このファイルの詳細については 「DT overlay によるカスタマイズ」 を参照してください。

2

/boot/overlays.txt を保存し、アップデートの場合でも保存します。

3

overlay の実行のために再起動します。

4

シリアルコンソールの場合に、u-bootによるメッセージを確認できます。

5

Linux からも確認できます。

SMS 受信(LTE モデルのみ)
起床要因
SMS 受信

6.2.10.3. パワーマネジメントの仕様

Armadillo-X2のパワーマネジメント機能は、LinuxのSPM(System Power Management)およびDPM(Device Power Management)を利用しています。パワーマネジメント状態を省電力モードに遷移させることにより、Armadillo-X2の消費電力を抑えることができます。

パワーマネジメント状態を省電力モードに遷移させると、アプリケーションの実行は一時停止し、Linuxカーネルはサスペンド状態となります。起床要因が発生すると、Linuxカーネルのリジューム処理が行われた後、アプリケーションの実行を再開します。

sysfsファイル
  • /sys/power/state

Armadillo-X2が対応するパワーマネジメント状態と、/sys/power/stateに書き込む文字列の対応を次に示します。

表6.4 対応するパワーマネジメント状態

パワーマネジメント状態 文字列 説明

Suspend-to-RAM

mem

Suspend-to-Idleよりも消費電力を抑えることができる

Suspend-to-Idle

freeze

suspend-to-ramよりも短時間で復帰することができる


起床要因として利用可能なデバイスは次の通りです。

USBコンソールインターフェース(CON6)
起床要因
データ受信
有効化
[armadillo ~]# echo enabled > /sys/class/tty/ttymxc1/power/wakeup
USBインターフェース(CON4)
起床要因
USBデバイスの挿抜
有効化
[armadillo ~]# echo enabled > /sys/devices/platform/soc@0/32f10100.usb/power/wakeup
[armadillo ~]# echo enabled > /sys/bus/usb/devices/usb1/power/wakeup
RTC(SNVS_HP Real Time Counter)
起床要因
アラーム割り込み
有効化
デフォルトで有効化されています
RTC(RV-8803-C7)
起床要因
アラーム割り込み
有効化
デフォルトで有効化されています

6.2.11. コンテナからのpoweroff及びreboot

Armadillo Base OSはbusybox initでshutdownとrebootを対応します。

busybox initでPID 1にsignalを送ることでshutdownやrebootとなります。 コンテナからsignalを送るように、pid namespaceを共有する必要がありますが、共有されたらkillで実行できます。

[armadillo ~]# vi /etc/atmark/containers/shutdown_example.conf
set_image docker.io/alpine
set_command sleep infinity
add_args --pid=host
[armadillo ~]# podman_start shutdown_example
Starting 'shutdown_example'
c8e3b9b418fc72395db9f3c22b1eb69eb41eaaf790d3b7151047ef066cc4c8ff
[armadillo ~]# podman exec -ti shutdown_example sh
[container ~]# kill -USR2 1  (poweroff)
[container ~]# kill -TERM 1  (reboot)

図6.75 コンテナからshutdownを行う


6.2.12. 異常検知

この章では、コンテナ内で動作しているアプリケーションに何らかの異常が発生し停止してしまった際に、 ソフトウェアウォッチドックタイマーを使って、システムを再起動する方法について示します。

6.2.12.1. ソフトウェアウォッチドッグタイマーを扱う

コンテナ内で動作するアプリケーションからソフトウェアウォッチドックタイマーを扱うためには、Podman のイメージからコンテナを作成する際にホスト OS 側の デバイスファイル /dev/watchdogN を渡す必要があります。以下は、/dev/watchdog0 を渡して alpine イメージからコンテナを作成する例です。

[armadillo ~]# vi /etc/atmark/containers/watchdog_example.conf
set_image docker.io/alpine
set_command sleep infinity
add_devices /dev/watchdog0
[armadillo ~]# podman_start watchdog_example
Starting 'watchdog_example'
a5d329cca49d60423ce4155d72a119b8049a03dbd1d0277817a253e96dce7bc7

図6.76 ソフトフェアウォッチドッグタイマーを使うためのコンテナ作成例


ソフトウェアウォッチドックタイマーは、プログラム内からデバイスファイル /dev/watchdog0 を open した時点で起動します。 コンテナ内に入ってソフトウェアウォッチドックタイマーを echo コマンドで起動する例を以下に示します。

[armadillo ~]# podman exec -it watchdog_example sh
[container ~]# echo > /dev/watchdog0

図6.77 コンテナ内からソフトウェアウォッチドッグタイマーを起動する実行例


ソフトウェアウォッチドックタイマーを起動した後、/dev/watchdog0 に任意の文字を書き込むことで ソフトウェアウォッチドッグタイマーをリセットすることができます。 60 秒間任意の文字の書き込みがない場合は、システムが再起動します。

[armadillo ~]# podman exec -it watchdog_example sh
[container ~]# echo a > /dev/watchdog0

図6.78 ソフトウェアウォッチドッグタイマーをリセットする実行例


ソフトウェアウォッチドックタイマーを停止したい場合は、/dev/watchdog0 に V を書き込みます。

[armadillo ~]# podman exec -it watchdog_example sh
[container ~]# echo V > /dev/watchdog0

図6.79 ソフトウェアウォッチドッグタイマーを停止する実行例


6.2.13. NPU を扱う

Armadillo-X2 で採用している i.MX 8M Plus には、機械学習に特化した演算処理ユニットである NPU (Neural Processor Unit) が搭載されています。 NPU を活用することで、顔認識や物体認識などの推論処理を高速に行うことができます。

コンテナ内で動作するアプリケーションから NPU を扱うためには、 アットマークテクノが提供するコンテナイメージである at-debian-image を使用する必要があります。また、コンテナ作成時にデバイスとして、/dev/galcore を渡す必要があります。 以下は、/dev/galcore を渡して at-debian-image からコンテナを作成する例です。 このイメージに関しては 「アットマークテクノが提供するイメージを使う」 を参照してください。

[armadillo ~]# vi /etc/atmark/containers/npu_example.conf
set_image at-debian-image
set_command sleep infinity
add_devices /dev/galcore
add_volumes /opt/firmware:/opt/firmware:ro
[armadillo ~]# podman_start npu_example
Starting 'npu_example'
cf27a327d19d8bc37e3722fe6101c7d52fbf984351056e1c0ca4e89ff041cfbb
[armadillo ~]# podman exec -it npu_example sh
[container ~]# ls /dev/galcore
/dev/galcore

図6.80 NPU を扱うためのコンテナ作成例


[注記]

i.MX 8M Plus に搭載されている NPU は INT8 で量子化された学習済みモデルを高速に推論するように設計されています。 INT8 で量子化されていないモデルの場合、正常に推論できない、または推論実行速度の低下が発生する場合があります。

具体的な機械学習アプリケーションの開発方法については、NXP Semiconductors の公式サイトを参照してください。

アットマークテクノからも機械学習に関する開発ガイドを公開していますので、そちらも参照してください。 Armadillo Base OS 開発ガイド

6.2.13.1. ONNX Runtime を使う

ONNX Runtime は 学習済みの ONNX モデルを使って推論を行うためのソフトウェアです。[13] Armadillo-X2 では、NPU を使って ONNX Runtime を実行することができます。

  • ONNX Runtime をインストールする

at-debian-image から作成したコンテナであれば、apt install でインストールすることができます。

[armadillo ~]# vi /etc/atmark/containers/onnxruntime_example.conf
set_image at-debian-image
set_command sleep infinity
add_devices /dev/galcore
add_volumes /opt/firmware:/opt/firmware:ro
[armadillo ~]# podman_start onnxruntime_example
Starting 'onnxruntime_example'
3aaefa9bdc4d7423385ee249b022ed4056a40cd66ce52b9d3eb8363379907d00
[armadillo ~]# podman exec -ti onnxruntime_example bash
[container ~]# apt install onnxruntime onnxruntime-dev onnxruntime-tools python3-onnxruntime

図6.81 ONNX Runtime をインストールする例


  • python から ONNX Runtime を使う

python から ONNX Runtime を使うためには onnxruntime モジュールを import します。 また、NPU を使うために InferenceSession オブジェクトを作成する際に、Providers として 「VsiNpuExecutionProvider」を指定します。

[container ~]# python3
>>> import onnxruntime
: (省略)
>>> sess = onnxruntime.InferenceSession('model.onnx', providers=['VsiNpuExecutionProvider'])

図6.82 python から ONNX Runtime を使う例


以上により、python から ONNX Runtime を使うことができます。

6.2.13.2. TensorFlow Lite を使う

TensorFlow Lite からも NPU を使って高速に推論を行うことができます。

  • TensorFlow Lite をインストールする

at-debian-image から作成したコンテナであれば、apt install でインストールすることができます。

[armadillo ~]# vi /etc/atmark/containers/tflite_example.conf
set_image docker.io/alpine
set_command sleep infinity
add_devices /dev/galcore
add_volumes /opt/firmware:/opt/firmware:ro
[armadillo ~]# podman_start tflite_example
Starting 'tflite_example'
1b7cc807b7f2857a406528f295040c817e24572f7c8abf7e6a32a62fc4f3793b
[armadillo ~]# podman exec -ti tflite_example bash
[container ~]# apt install tensorflow-lite tensorflow-lite-dev python3-tflite-runtime \
tim-vx tensorflow-lite-vx-delegate

図6.83 TensorFlow Lite をインストールする例


  • python から TensorFlow Lite を使う

python から TensorFlow Lite を使うためには Interpreter モジュールを import します。 python から TensorFlow Lite を使う場合は特別な設定をしなくても、自動的に NPU が使われます。

[container ~]# python3
>>> from tflite_runtime.interpreter import Interpreter
: (省略)
>>> interpreter = Interpreter('model.tflite')

図6.84 python から TensorFlow Lite を使う例


以上により、python から TensorFlow Lite を使うことができます。

[警告]

tflite-runtime パッケージと、ライブラリイメージ(imx_lib)のバージョンの組み合わせによっては、使用する delegate と ライブラリの整合性が取れずに TensorFlow Liteを用いたアプリケーションが正しく動作しない場合があります。

バージョン 2.6.0-1 以降の tflite-runtime パッケージを使用する際には、必ずバージョン 2.2.0 以降のライブラリイメージ(imx_lib)を使用してください。

ライブラリイメージのアップデート方法については「VPU や NPU を使用する」を参照してください。

それぞれのバージョンと動作の関係を表6.5「ライブラリと tflite-runtime のバージョンと NPU を用いたアプリケーションの動作の関係」に示します。

表6.5 ライブラリと tflite-runtime のバージョンと NPU を用いたアプリケーションの動作の関係

                   tflite-runtime のバージョンが 2.6.0-1 以降 tflite-runtime のバージョンが 2.6.0-1 未満

ライブラリのバージョンが確認できる(2.2.0 以降)

VX delegateで動作

NNAPI delegate で動作

ライブラリのバージョンが確認できない(2.2.0 未満)

正しく動作しない場合あり

NNAPI delegate で動作


ライブラリのバージョン確認手順については、「ライブラリイメージのバージョンを確認する」を参照してください。

tflite-runtime パッケージのバージョンは、コンテナ内で以下のコマンドを実行することで確認できます。

[container ~]# dpkg -l python3-tflite-runtime
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                   Version      Architecture Description
+++-======================-============-============-===============================================
ii  python3-tflite-runtime 2.6.0-1      arm64        deep learning framework for on-device inference

図6.85 tflite-runtime のバージョンを確認する


推奨はしませんが、 tflite-runtime のバージョンを 2.6.0-1 未満に下げたい場合は表6.6「2.6.0-1 未満の TensorFlow Lite 関連 deb パッケージ」に示す deb パッケージを全てコンテナ内にダウンロードして、図6.86「tflite-runtime のバージョンを下げる」のコマンドを実行してください。


[container ~]# ls ./*.deb 1
python3-tflite-runtime_2.4.0-1_arm64.deb
python3-tflite-runtime-dbgsym_2.4.0-1_arm64.deb
tensorflow-lite_2.4.0-1_arm64.deb
tensorflow-lite-dev_2.4.0-1_arm64.deb
[container ~]# apt purge \
tensorflow-lite \
tensorflow-lite-dev \
tensorflow-lite-vx-delegate \
tensorflow-lite-vx-delegate-dev \
python3-tflite-runtime \
tim-vx \
tim-vx-dev 2
[container ~]# apt install ./*.deb 3

図6.86 tflite-runtime のバージョンを下げる


1

カレントディレクトリに表6.6「2.6.0-1 未満の TensorFlow Lite 関連 deb パッケージ」の deb パッケージのみ存在していることを確認します。

2

2.6.0-1 以上のインストールされているパッケージを削除します。

3

ダウンロードした deb パッケージをインストールします。

6.2.13.3. Arm NN を使う

[警告]

Arm NN はコンテナイメージ at-debian-image のバージョン 1.0.6 以降では、動作非対応となります。 現在利用中の at-debian-image のバージョンは以下のコマンドで確認できます。

[armadillo ~]# podman inspect --format='{{.Config.Labels.version}}' localhost/at-debian-image
1.0.6

図6.87 at-debian-image のバージョンを確認する


Arm NN とは TensorFlow Lite および ONNX のモデル形式をサポートしている推論用ソフトウェアです。 Arm NN からも NPU を使って高速に推論を行うことができます。

  • Arm NN をインストールする

at-debian-image から作成したコンテナであれば、apt install でインストールすることができます。

[armadillo ~]# vi /etc/atmark/containers/armnn_example.conf
set_image docker.io/alpine
set_command sleep infinity
add_devices /dev/galcore
add_volumes /opt/firmware:/opt/firmware:ro
[armadillo ~]# podman_start armnn_example
Starting 'armnn_example'
18892fb9fc82f36a6de1bb9036af6e76ee552cf66e1537d70666319bb35af1e1
[armadillo ~]# podman exec -ti armnn_example bash
[container ~]# apt install libarmnn22 libarmnn-dev python3-pyarmnn armnn-examples

図6.88 Arm NN をインストールする例


  • python から Arm NN を使う

python から TensorFlow Lite を使うためには pyarmnn モジュールを import します。 また、NPU を使うために BackendId として「VsiNpu」を指定して、Optimize オブジェクトを作成します。

[container ~]# python3
>>> import pyarmnn as ann
: (省略)
>>> options = ann.CreationOptions()
>>> runtime = ann.IRuntime(options)
>>> parser = ann.ITfLiteParser()
>>> network = parser.CreateNetworkFromBinaryFile('model.tflite')
>>> preferred_backends = []
>>> preferred_backends.append(ann.BackendId('VsiNpu'))
>>> opt_network, _ = ann.Optimize(network, preferred_backends, runtime.GetDeviceSpec(), ann.OptimizerOptions())
>>> net_id, _ = runtime.LoadNetwork(opt_network)

図6.89 python から Arm NN を使う例


以上により、python から Arm NN を使うことができます。

6.3. swupdate がエラーする場合の対処

SWU イメージのインストール動作は、「SWU イメージとは」で述べたように swupdate が実行します。 mkswu で作成した SWU イメージの内容が適切でなかったり、あるいは、ストレージの空き容量が不足していたりするなど、いくつかの理由で swupdate のインストール動作が失敗することがあります。 インストールに失敗すると、swupdate は /var/log/messages にエラーメッセージのログを残しますので、エラーメッセージを見ると、エラーの内容・原因が分かります。

エラーの原因ごとに、エラーメッセージとエラーの内容および対処方法を記した FAQ ページ (https://armadillo.atmark-techno.com/faq/swupdate-troubleshooting-abos) を公開しています。 SWU イメージのインストールに失敗して対処法が分からないときは、この FAQ ページをご覧ください。

6.4. mkswu の .desc ファイルを編集する

mkswu で SWU イメージを生成するためには、 desc ファイルを正しく作成する必要があります。 以下では、 desc ファイルの記法について紹介します。

6.4.1. インストールバージョンを指定する

swdesc_option component=<component>
swdesc_option version=<version>
か
swdesc_xxx --version <component> <version> [options]
  • <component>は以下のどれかにしてください (デフォルトでは .desc ファイルのファイル名を使います)

    1. base_os: rootfs (Armadillo Base OS)を最初から書き込む時に使います。現在のファイルシステムは保存されていない。

      この場合、/etc/swupdate_preserve_filesに載ってるファイルのみをコピーして新しいbase OSを展開します。

      このcomponentがないと現在のrootfsのすべてがコピーされます。

    2. extra_os.<文字列>: rootfsの変更を行う時に使います。<文字列> には任意の文字列を指定します。

      rootfsを変更を行う時に使います。 swdesc_* コマンドに --extra-os オプションを追加すると、 component に自動的に extra_os. を足します。

    3. <文字列> (コンテナの名前などの任意の文字列): rootfsの変更がないときに使います。

      このcomponentを使うとrootfsの変更ができませんのでご注意ください。

  • アップデートを行う際にこのバージョンと現在のバージョンを比べてアップデートの判断を行います。

    <component> がまだインストールされてなかった時や <version> が上がる時にインストールします。

    デフォルトではダウングレードはできませんが、 --install-if=different オプションを追加することで <version> が変わる際にインストール可能になります。

    アップデートの一部をインストールすることもありますので、複数の component で管理し、いくつかの古いバージョンに対応するアップデートも作成可能です。

6.4.2. Armadillo へファイルを転送する

  • swdesc_tarswdesc_files でファイルを転送します。

    swdesc_tar [--dest <dest>] <tar_file>
    swdesc_files [--dest <dest>] [--basedir <basedir>] \
                 <file> [<more files>]

    swdesc_tar の場合、予め用意されてあるtarアーカイブをこのままデバイスで展開します。

    --dest <dest> で展開先を選ぶことができます。デフォルトは /--extra-os を含め、バージョンの component は base_osextra_os.* の場合)か /var/app/rollback/volumes/ (それ以外のcomponent)。 後者の場合は /var/app/volumes/var/app/rollback/volumes 以外は書けないので必要な場合に --extra-os を使ってください。

    swdesc_files の場合、mkswu がアーカイブを作ってくれますが同じ仕組みです。

    --basedir <basedir> でアーカイブ内のパスをどこで切るかを決めます。

    • 例えば、swdesc_files --extra-os --basedir /dir /dir/subdir/file ではデバイスに /subdir/file を作成します。
    • デフォルトは <file> から設定されます。ディレクトリであればそのまま basedir として使います。それ以外であれば親ディレクトリを使います。

6.4.3. Armadillo 上で任意のコマンドを実行する

  • swdesc_commandswdesc_script でコマンドを実行します。

    swdesc_command <command> [<more commands>]
    swdesc_script <script>

    アップデート先の環境でコマンドやスクリプトファイルを実行します。

    バージョンの component は base_osextra_os 以外の場合、 /var/app/volumes/var/app/rollback/volumes 以外は変更できないのでご注意ください。

    コマンドの実行が失敗した場合、アップデートも失敗します。

6.4.4. Armadillo にファイルを転送し、そのファイルをコマンド内で使用する

  • swdesc_exec でファイルを配り、コマンド内でそのファイルを使用します。

    swdesc_exec <file> <command>

    swdesc_command と同じくコマンドを実行しますが、<file> を先に転送してコマンド内で転送したファイル名を"$1"として使えます。

6.4.5. 起動中の Armadillo で任意のコマンドを実行する

  • swdesc_command_nochroot, swdesc_script_nochroot, swdesc_exec_nochroot で起動中のシステム上でコマンドを実行します。

    このコマンドは nochroot なしのバージョンと同じ使い方で、現在起動中のシステムに変更や確認が必要な場合にのみ使用してください。

    [警告]

    nochroot コマンドは確認を一切しないため、Armadillo が起動できない状態になる可能性もあります。充分にご注意ください。

    例が必要な場合は /usr/share/mkswu/examples/firmware_update.desc を参考にしてください。

6.4.6. Armadillo にコンテナイメージを転送する

6.4.7. Armadillo のブートローダーを更新する

  • swdesc_bootimx-boot を更新します。

    swdesc_boot <boot image>

    このコマンドだけはバージョンは自動的に設定されます。

6.4.8. SWU イメージの設定関連

コマンドの他には、設定変数もあります。以下の設定は /home/atmark/mkswu/mkswu.conf に設定できます。

  • DESCRIPTION="<text>": イメージの説明、ログに残ります。
  • PRIVKEY=<path>, PUBKEY=<path>: 署名鍵と証明書
  • PRIVKEY_PASS=<val>: 鍵のパスワード(自動用)

    openssl のPass Phraseをそのまま使いますので、pass:password, env:varfile:pathname のどれかを使えます。 passenv の場合他のプロセスに見られる恐れがありますのでfileをおすすめします。

  • ENCRYPT_KEYFILE=<path>: 暗号化の鍵

6.4.9. Armadillo 上のコンテナイメージと自動起動用confファイルを削除する

以下のオプションも mkswu.conf に設定できますが、.descファイルにも設定可能です。swdesc_option で指定することで、 誤った使い方をした場合 mkswu の段階でエラーを出力しますので、必要な場合は使用してください。

  • swdesc_option CONTAINER_CLEAR: インストールされたあるコンテナと /etc/atmark/containers/*.conf をすべて削除します。

    このオプションは簡単な初期化と考えてください。通常の運用では、不要になったイメージは自動的に削除されますので このオプションを設定する必要はありません。

6.4.10. SWUpdate 実行中/完了後の挙動を指定する

以下のオプションは Armadillo 上の /etc/atmark/baseos.conf に、例えば MKSWU_POST_ACTION=xxx として設定することができます。

その場合に swu に設定されなければ /etc の設定で実行されますので、 アットマークテクノが用意している Base OS のアップデートでも動作の変更は可能です。 swu に特定のオプションが設定された場合は設定されたオプションが優先されますので、一時的な変更も可能です。

  • swdesc_option POST_ACTION=container: コンテナのみのアップデート後に再起動を行いません。 コンテナの中身だけをアップデートする場合、Armadillo-X2を再起動せずにコンテナだけを再起動させます。
  • swdesc_option POST_ACTION=poweroff: アップデート後にシャットダウンを行います。
  • swdesc_option POST_ACTION=wait: アップデート後に自動的に再起動は行われず、次回起動時にアップデートが適用されます。
  • swdesc_option POST_ACTION=reboot: デフォルトの状態に戻します。アップデートの後に再起動します。
  • swdesc_option NOTIFY_STARTING_CMD="command", swdesc_option NOTIFY_SUCCESS_CMD="command", swdesc_option NOTIFY_FAIL_CMD="command": アップデートをインストール中、成功した場合と失敗した場合に実行されるコマンドです。

    コマンドを実行する事で、アプリケーションやユーザーにアップデートを知らせることができます。

    LEDで知らせる例を /usr/share/mkswu/examples/enable_notify_led.desc に用意してあります。

6.4.11. desc ファイル設定例

6.4.11.1. 例: sshdを有効にする

/usr/share/mkswu/examples/enable_sshd.desc を参考にします。

descファイルを編集する必要がありませんが自分の公開鍵を指定された場所に配置してください。

[ATDE ~/mkswu]$ cp -r /usr/share/mkswu/examples/enable_sshd* .
[ATDE ~/mkswu]$ cat enable_sshd.desc
swdesc_option component=extra_os.sshd version=1

# add your public key in enable_sshd/root/.ssh/authorized_keys
if [ -z "$SWDESC_TEST" ]; then
    grep -qE '^ssh-' enable_sshd/root/.ssh/authorized_keys \
        || error "Add your keys in enable_sshd/root/.ssh/authorized_keys"
fi
swdesc_files --dest /root enable_sshd/root 1

swdesc_command "ssh-keygen -A" \ 2
        "rc-update add sshd" 3
[ATDE ~/mkswu]$ cp ~/.ssh/id_rsa.pub \
                         enable_sshd/root/.ssh/authorized_keys 4
[ATDE ~/mkswu]$ mkswu enable_sshd.desc 5
Enter pass phrase for /home/atmark/mkswu/swupdate.key:
enable_sshd.swu を作成しました。

1

自分の公開鍵を転送します。デフォルトのオプションなので enable_sshd/root ディレクトリの中身をこのまま /root に転送されます。

2

再起動する度に新しいサーバーの鍵が変わらないように、アップデートの時に一回作成します。

3

サービスを有効にします。

4

自分の公開鍵を指定された場所に配置します。

5

イメージを作成します。パスワードは証明鍵のパスワードです。

6.4.11.2. 例: Armadillo Base OSアップデート

ここでは、「Armadilloのソフトウェアをビルドする」でメインシステム向けのビルドで作成したファイルを使用します。

/usr/share/mkswu/examples/OS_update.desc を参考にします。

[ATDE ~/mkswu]$ cp /usr/share/mkswu/examples/OS_update.desc update-[VERSION].desc
[ATDE ~/mkswu]$ vi update-[VERSION].desc
# uboot image can be generated with atmark imx-boot script
swdesc_uboot imx-boot_armadillo_x2 1

# base OS is a tar that will be extracted on a blank filesystem,
# after copying just a few key config files.
#
# OS updates are only installed if version is greater than previous update
# so if you install your own updates atmark-techno provided Armadillo Base OS
# updates might not get installed
swdesc_tar "baseos-x2-[VERSION].tar.zst" \ 2
           --version base_os [VERSION] 3
[ATDE ~/mkswu]$ mkswu update-[VERSION].desc 4
Enter pass phrase for /home/atmark/mkswu/swupdate.key:
update-[VERSION].swu を作成しました。

1

imx-bootでビルドしたイメージを使います。

2

build-rootfsでビルドしたイメージを使います。

3

バージョンが上がるときにしかインストールされませんので、現在の/etc/sw-versionsを確認して適切に設定してください。

4

イメージを作成します。パスワードは証明鍵の時のパスワードです。

6.4.11.3. 例: swupdate_preserve_files で Linux カーネル以外の Armadillo-X2 向けのイメージをインストールする方法

Armadillo-X2 向けのアップデートイメージに Linux カーネルが含まれています。

swupdate_preserve_files を使って、以下のコマンドでインストール後に現在のカーネルをコピーして更新させないようにします。

[armadillo ~]# echo 'POST /boot' >> /etc/swupdate_preserve_files
[armadillo ~]# echo 'POST /lib/modules' >> /etc/swupdate_preserve_files 1
[armadillo ~]# persist_file /etc/swupdate_preserve_files 2

1

swupdate_preserve_files/boot/lib/modules を保存するように追加します。

2

変更した設定ファイルを保存します

[ティップ]

/usr/share/mkswu/examples/kernel_update*.desc のように update_preserve_files.sh のヘルパーで、パスを自動的に /etc/swupdate_preserve_files に追加することができます。

[ATDE ~/mkswu]$ cat example.desc
swdesc_script "$SCRIPT_DIR/examples/update_preserve_files.sh" -- \ 1
        "POST /boot" \
        "POST /lib/modules"

1

スクリプトの内容確認する場合は /usr/share/mkswu/examples/update_preserve_files.sh を参照してください。

[ティップ]

Armadillo Base OS のカーネルを再び使用したい場合は同じスクリプトの --del オプションで行を削除することができます。

[ATDE ~/mkswu]$ cat example.desc
swdesc_script "$SCRIPT_DIR/examples/update_preserve_files.sh" -- \
        --del "POST /boot" "POST /lib/modules"

6.5. swupdate_preserve_files について

extra_os のアップデートで rootfs にファイルを配置することができますが、次の OS アップデートの際に削除される可能性があります。

デフォルトでは、 /etc/atmark と、 swupdatesshd やネットワークの設定を保存しますがそれ以外はコピーされてません。

そうでないファイルを更新する際には /etc/swupdate_preserve_files に記載します。「例: swupdate_preserve_files で Linux カーネル以外の Armadillo-X2 向けのイメージをインストールする方法」 を参考にしてください。

コピーのタイミングによって、以下のどれかを使用してください:

  1. 単にファイルを記載する

    この場合、アップデートする前にファイルをコピーします。 baseos のイメージと同じ swu にアップデートしたいファイルを記載していても、 このファイルが Armadillo Base OS に含まれないのであれば問題なくアップデートできます。

    : echo "/root/.profile" >> /etc/swupdate_preserve_files

  2. POST のキーワードの後に記載する

    この場合、アップデートの最後でコピーします。 Armadillo Base OS に含まれてるファイルであれば、インストール前にコピーしても保存されないのでコピーのタイミングをずらします。

    そのコピーが最後に行われるので、同じアップデートでファイルの変更ができません。アップデートを別けて、 baseos のイメージをインストールしてからこのファイルを更新することができます。

    : echo "POST /etc/conf.d/podman-atmark" >> /etc/swupdate_preserve_files

6.6. SWU イメージの内容の確認

mkswu --show [file.swu] で SWU イメージの内容を確認することができます。

出力は desc ファイルに似ていますが、そのまま desc ファイルとして利用できませんので確認用としてお使いください。

[ATDE ~/mkswu]$ mkswu --show enable_sshd.swu
enable_sshd.swu

# built with mkswu 4.1

swdesc_files --dest /root enable_sshd/root
  --version extra_os.sshd 1
  (encrypted)

swdesc_command ssh-keygen -A && rc-update add sshd default
  --version extra_os.sshd 1

6.7. SWUpdate と暗号化について

mkswu --init の時に暗号化を有効にする場合は AES でファイルを暗号化します。

現在使われてる SWUpdate の暗号化はコマンドやメタデータを含む sw-description ファイルは暗号化されてません。 そのため、通信の暗号化(HTTPSで送信するなど)を使うことを推奨します。

6.8. Web UI から Armadillo をセットアップする (ABOS Web)

ABOS Web は、Web ブラウザから Armadillo の動作設定を行う機能で、ABOS (Armadillo Base OS) を搭載する全ての Armadillo に対応しています。

詳細は、「ABOS Web とは」を参照してください。

6.8.1. ABOS Web ではできないこと

ABOS Web は、ABOS の詳細や Linux のコマンドシェルの操作に詳しくない方でも、簡単に Armadillo のセットアップを行なえることを目的にしています。 そのための、Armadillo の動作設定を行う機能ですから、動作設定以外のこと、たとえば、Armadillo の動作状態を監視したりすることは、できません。 さらに、Armadillo をインターネットから設定操作する、リモート操作もできません。 セキュリティの観点から、ABOS Web は、同じ LAN 内からの接続しか受け付けないように実装しています。

ABOS Web でできる Armadillo の設定については、「ABOS Web の設定機能一覧と設定手順」を参照してください。 なお、ABOS Web は OSS で提供していますので、現在の ABOS Web に無い設定機能を、ご自分で実装して機能追加することも可能です。

6.8.2. ABOS Web の設定機能一覧と設定手順

現在、ネットワークに関して ABOS Web で設定できるのは以下のものです。

  • WWAN設定
  • WLAN設定
  • 各接続設定(各ネットワークインターフェースの設定)
  • DHCPサーバー設定
  • NAT設定
  • VPN設定

これらについては、「ネットワーク設定」で紹介していますので、そちらを参照してください。

ネットワーク以外にも ABOS Web は以下の機能を持っています。

  • コンテナ管理
  • SWUインストール
  • 時刻設定
  • アプリケーション向けのインターフェース (Rest API)
  • カスタマイズ

本章では、これらのネットワーク以外の設定項目について紹介します。

6.8.3. コンテナ管理

ABOS Web から Armadillo 上のコンテナを一覧表示して、コンテナごとに起動・停止を行うことができます。

ABOS Web のトップページから、"コンテナ管理"をクリックすると、図6.90「コンテナ管理」の画面に遷移します。

images/abos-images/abos-web/container-list.png

図6.90 コンテナ管理


この画面では、ABOS 上にあるコンテナ全てについて、イメージ名やコンテナ名、現在状態を一覧表示します。 コンテナの一覧表示欄で選択したコンテナに対し、起動と停止、および、コンテナから出力されたログの表示を行うことができます。

[注記]

「VPN設定」に記載のとおり、VPN 接続を設定すると、abos_web_openvpn のコンテナが作成されます。 VPN 接続中は、このコンテナが動作状態になっており、このコンテナをコンテナ管理画面で停止すると、VPN 接続が切断されます。

6.8.4. SWUインストール

ABOS Web から PC 上の SWU イメージや HTTP サーバー上の SWU イメージを Armadillo にインストールすることができます。

SWU イメージについては、「SWU イメージとは」を参照してください。

ABOS Web のトップページから、"SWU インストール"をクリックすると、図6.91「SWU インストール」の画面に遷移します。

images/abos-images/abos-web/swu-select_image.png

図6.91 SWU インストール


この画面では、PC 上の SWU イメージファイルまたは、HTTP サーバー上の SWU イメージファイルの URL を指定して、Armadillo にインストールすることができます。 Armadillo のソフトウェアのアップデート用に最初に行う設定で作成する initial_setup.swu が、まだ Armadillo にインストールされていなければ、"mkswu --init で作成した initial_setup.swu をインストールしてください。" というメッセージを画面上部に表示します。

SWU イメージのインストール動作を実行する時には、進行状況を示すログを表示します。 "現在の SWU で管理されているバージョン" 欄には、ABOS の各ソフトウェアコンポーネントの名前とバージョン情報を一覧表示します。

images/abos-images/abos-web/swu-curr_vers.png

図6.92 SWU 管理対象ソフトウェアコンポーネントの一覧表示


6.8.5. 時刻設定

ABOS Web から時刻に関する設定を行うことができます。

ABOS Web のトップページから "時刻設定" をクリックすると、以下の内容が表示されます。

図6.93「ネットワークタイムサーバーと同期されている場合の状況確認画面」 では Armadillo の現在時刻と、同期中のサーバーとの時間差を確認することができます。

images/abos-images/abos-web/time_status_sync.png

図6.93 ネットワークタイムサーバーと同期されている場合の状況確認画面


時刻が同期されてない状態では 図6.94「ネットワークタイムサーバーと同期されていない場合の状況確認画面」 の様に 「PC と同期する」ボタンを押すことで、 Armadillo の時刻を PC と同期することができます。

images/abos-images/abos-web/time_status_unsync.png

図6.94 ネットワークタイムサーバーと同期されていない場合の状況確認画面


図6.95「ネットワークタイムサーバーの設定項目」 では NTP (ネットワークからの時刻同期)サーバーと Armadillo 起動時に同期するサーバーを設定することができます。

images/abos-images/abos-web/time_ntp_config.png

図6.95 ネットワークタイムサーバーの設定項目


最後に、図6.96「タイムゾーンの設定項目」 では Armadillo Base OS で使用するタイムゾーンの変更ができます。コンテナには影響ありませんのでご注意ください。

images/abos-images/abos-web/time_zone_config.png

図6.96 タイムゾーンの設定項目


6.8.6. アプリケーション向けのインターフェース (Rest API)

コンテナやスクリプトから ABOS Web の一部の機能を使用できます。

6.8.6.1. Rest API へのアクセス権の管理

Rest API は ABOS Web のパスワードと Rest API 用のトークンで認証されます。

また、接続可能なネットワークにも制限をかけております。初期状態では、同一サブネットからのアクセスのみ許容しています。 同一サブネット外の IP アドレスからアクセスしたい場合は設定が必要です。 設定方法は 「ABOS Web へのアクセス」 を参照してください。

各リクエストは以下のどちらかの Authorization ヘッダーで認証されます:

  • Basic (パスワード認証): curl-u :<password> 等で認証可能です。<password> の文字列は ABOS Web で設定したパスワードです。
  • Bearer (トークン認証): curl-H "Authorization: Bearer <token> 等で認証可能です。<token>/api/tokens であらかじめ生成した文字列です。

また、トークンには権限も設定できます。Admin で生成されたトークンはすべてのインターフェースにアクセスできますが、 一部のインターフェースしか使用しない場合はそのインターフェースに必要な権限だけを持つトークンを生成してください。

トークンの管理は ABOS Web の「設定管理」ページで行えます:

images/abos-images/abos-web/settings_restapi.png

図6.97 設定管理の Rest API トークン一覧表示


[ティップ]

ABOS Web の バージョン 1.2.3 以降では、Token ID の横にあるクリップボードアイコンをクリックするとクリップボードにコピーすることができます。

6.8.6.2. Rest API 使用例の前提条件

各 Rest API の使用例を説明します。使用例では以下を前提としています。:

  • ABOS Web に https://armadillo.local:58080 でアクセスします。
  • AUTH 」環境変数に ABOS Web で生成したトークンを設定します。 例: AUTH="Authorization: Bearer 35ac39a8-1eeb-4bb2-84d2-cb542cdbc873"
  • curl コマンドを省略するため、以下のように alias を使用します:
[ATDE ~]$ alias curl_rest='curl -k -H "$AUTH" -w "\nhttp code: %{http_code}\n" '
[注記]

この章で説明する例では、curl のオプションに -k を指定して証明書を無視するようにしています。 もし、証明書を使用したい場合は以下のように設定してください。

[ATDE ~]$ openssl s_client -showcerts -connect armadillo.local:58080 </dev/null 2>/dev/null | openssl x509 -outform PEM > abosweb.pem
[ATDE ~]$ CERT="$PWD/abosweb.pem"
[ATDE ~]$ alias curl_rest='curl -H "$AUTH" --cacert "$CERT" -w "\nhttp code: %{http_code}\n" '

6.8.6.3. Rest API の入力と出力

インターフェースの一部にはパラメータを取るものがあります。パラメータがある場合は json (Content-Typeapplication/json に設定する)と form(デフォルトの application/x-www-form-urlencoded でのパラメータ)のどちらでも使用可能です。

インターフェースの出力がある場合は json object で出力されます。 今後のバージョンアップで json object のキーが増える可能性があるため、 出力された値を処理する場合はその点に留意してください。

エラーの場合は json object の「error」キーに文字列のエラーが記載されています。 http のステータスコードも 50x になります。

エラーの例:

[ATDE ~]$ curl_rest -X DELETE https://armadillo.local:58080/api/tokens/3b2d830d-2f64-4e76-9e59-316da82eefc4
{"error":"No such token"}
http code: 500

6.8.6.4. Rest API : トークン管理

トークン管理のためのインターフェースは以下のとおりです:

  • トークン一覧
    GET "/api/tokens"
    必要権限: Admin
    パラメータ: 無し
    出力: トークンリスト

    [ATDE ~]$ curl_rest https://armadillo.local:58080/api/tokens
    {"tokens":[{"token":"35ac39a8-1eeb-4bb2-84d2-cb542cdbc873","permissions":["Admin"]},{"token":"5c426ce5-8fcb-4e54-9ff6-80aba50935ee","permissions":["Reboot","NetworkView"]}]}
    http code: 200
  • トークン取得
    GET "/api/tokens/<token>"
    必要権限: Admin
    パラメータ: 無し
    出力: トークン情報

    [ATDE ~]$ curl_rest https://armadillo.local:58080/api/tokens/35ac39a8-1eeb-4bb2-84d2-cb542cdbc873
    {"token":"35ac39a8-1eeb-4bb2-84d2-cb542cdbc873","permissions":["Admin"]}
    http code: 200
  • トークン生成
    POST "/api/tokens"
    必要権限: Admin
    パラメータ: 付与したい permissions 権限リスト(ない場合は「Admin」で生成されます)
    出力: 生成されたトークン情報

    [ATDE ~]$ curl_rest -H "Content-type: application/json" -d '{"permissions": ["SwuInstall", "ContainerView"]}' https://armadillo.local:58080/api/tokens
    {"token":"3b2d830d-2f64-4e76-9e59-316da82eefc4","permissions":["SwuInstall","ContainerView"]}
    http code: 200
  • トークン編集 (存在しない場合は指定のトークンで生成されます)
    POST "/api/tokens/{token_id}"
    必要権限: Admin
    パラメータ: 付与したい permissions 権限リスト(ない場合は編集しません)
    出力: 編集か生成されたトークン情報

    [ATDE ~]$ curl_rest -X POST -d permissions=Poweroff -d permissions=ContainerAdmin https://armadillo.local:58080/api/tokens/3b2d830d-2f64-4e76-9e59-316da82eefc4
    {"token":"3b2d830d-2f64-4e76-9e59-316da82eefc4","permissions":["Poweroff","ContainerAdmin"]}
  • トークン削除
    DELETE "/api/tokens/{token_id}"
    必要権限: Admin
    パラメータ: 無し
    出力: 無し

    [ATDE ~]$ curl_rest -X DELETE https://armadillo.local:58080/api/tokens/3b2d830d-2f64-4e76-9e59-316da82eefc4
    http code: 200
  • abos-web パスワード変更
    POST "/api/password"
    必要権限: Admin
    パラメータ: password でハッシュ済みのパスワード文字列か hashed=false が設定されている場合は平文の文字列
    出力: 無し

    [ATDE ~]$ PWD_HASH=$(openssl passwd -6)
    Password:
    Verifying - Password:
    [ATDE ~]$ echo $PWD_HASH
    $6$LuXQduN7L3PwbMaZ$txrw8vLJqEVUreQnZhM0CYMQ5U5B9b58L0mpVRULDiVCh2O46GKscq/xsDPskjxg.x8ym0ri1/8NqFBu..IZE0
    [ATDE ~]$ curl_rest --data-urlencode "password=$PWD_HASH" -X POST https://armadillo.local:58080/api/password
    http code: 200

6.8.6.5. Rest API : SWU

  • インストール済み SWU のバージョン情報取得
    GET "/api/swu/versions"
    必要権限: SwuView
    パラメータ: 無し
    出力: Swupdate の各バージョン情報

    [ATDE ~]$ curl_rest https://armadillo.local:58080/api/swu/versions
    {"extra_os.custom":"54","extra_os.container":"1","custom":"54","extra_os.initial_setup":"4","boot":"2020.4-at19","base_os":"3.18.4-at.6","extra_os.sshd":"1"}
    http code: 200
  • アップデートステータス取得
    GET "/api/swu/status"
    必要権限: SwuView
    パラメータ: 無し
    出力: rollback_ok: ロールバック状態 (false の場合は rollback されています)、last_update_timestamp: UTC の unix epoch (数字での日付)、 last_update_versions: 最新のアップデートで更新されたバージョン情報 (コンポーネント → [更新前のバージョン, 更新後のバージョン]。 更新前に存在しなかったコンポーネントの場合は null で記載されています)
[ATDE ~]$ curl_rest https://armadillo.local:58080/api/swu/status
{"rollback_ok":true,"last_update_timestamp":1703208559,"last_update_versions":{"custom":[null,"54"],"extra_os.custom":["53","54"]}}
http code: 200
  • SWU をファイルアップロードでインストール
    POST "/api/swu/install/upload"
    必要権限: SwuInstall
    パラメータ: multipart/form-data で swu の転送
    出力: swupdate プロセスの出力 (stdout または stderr)、またはアップデートプロセスの出力ステータス (exit_code または exit_signal)

    [ATDE ~]$ curl_rest -F swu=@"$HOME/mkswu/file.swu" https://armadillo.local:58080/api/swu/install/upload
    {"stdout":"SWUpdate v2023.05_git20231025-r0\n"}
    {"stdout":"\n"}
    {"stdout":"Licensed under GPLv2. See source distribution for detailed copyright notices.\n"}
    {"stdout":"\n"}
    {"stdout":"[INFO ] : SWUPDATE running :  [main] : Running on AGX4500 Revision at1\n"}
    {"stdout":"[INFO ] : SWUPDATE started :  Software Update started !\n"}
    {"stdout":"[INFO ] : SWUPDATE running :  [install_single_image] : Installing pre_script\n"}
    {"stdout":"[INFO ] : SWUPDATE running :  [read_lines_notify] : No base os update: copying current os over\n"}
    : (省略)
    {"stdout":"[INFO ] : SWUPDATE running :  [install_single_image] : Installing post_script\n"}
    {"stdout":"[INFO ] : SWUPDATE running :  [read_lines_notify] : Removing unused containers\n"}
    {"stdout":"[INFO ] : SWUPDATE running :  [read_lines_notify] : swupdate triggering reboot!\n"}
    {"stderr":"Killed\n"}
    {"exit_code":0}
    
    http code: 200
  • SWU を URL でインストール
    POST "/api/swu/install/url"
    必要権限: SwuInstall
    パラメータ: url=<SWU をダウンロードできる URL>
    出力: swupdate プロセスの出力 (stdout または stderr)、またはアップデートプロセスの出力ステータス (exit_code または exit_signal)

    [ATDE ~]$ curl_rest -d url=https://url/to/file.swu https://armadillo.local:58080/api/swu/install/url
    {"stdout":"Downloading https://url/to/file.swu...\n"}
    {"stdout":"SWUpdate v2023.05_git20231025-r0\n"}
    {"stdout":"\n"}
    {"stdout":"Licensed under GPLv2. See source distribution for detailed copyright notices.\n"}
    {"stdout":"\n"}
    {"stdout":"[INFO ] : SWUPDATE running :  [main] : Running on AGX4500 Revision at1\n"}
    {"stdout":"[INFO ] : SWUPDATE started :  Software Update started !\n"}
    {"stdout":"[INFO ] : SWUPDATE running :  [install_single_image] : Installing pre_script\n"}
    {"stdout":"[INFO ] : SWUPDATE running :  [read_lines_notify] : No base os update: copying current os over\n"}
    : (省略)
    {"stdout":"[INFO ] : SWUPDATE running :  [install_single_image] : Installing post_script\n"}
    {"stdout":"[INFO ] : SWUPDATE running :  [read_lines_notify] : Removing unused containers\n"}
    {"stdout":"[INFO ] : SWUPDATE running :  [read_lines_notify] : swupdate triggering reboot!\n"}
    {"stderr":"Killed\n"}
    {"exit_code":0}
    
    http code: 200

6.8.6.6. Rest API : コンテナ操作

  • コンテナ一覧
    GET "/api/containers"
    必要権限: ContainerView
    パラメータ: 無し
    出力: 各コンテナの id, name, state, command, image 情報

    [ATDE ~]$ curl_rest https://armadillo.local:58080/api/containers
    {"containers":[{"id":"02616122dcea5bd75c551b29b2ef54f54e09f59c50ce3282684773bc6bfb86a8","name":"python_app","state":"running","command":["python3","/vol_app/src/main.py"],"image":"localhost/python_arm64_app_image:latest"}]}
    http code: 200
  • コンテナログ取得
    GET "/api/containers/{container}/logs"
    必要権限: ContainerView
    パラメータ: follow=true (podman logs -f と同様の効果)
    出力: podman logs プロセスの出力 (stdout または stderr)、またはアップデートプロセスの出力ステータス (exit_code または exit_signal)

    [ATDE ~]$ curl_rest https://armadillo.local:58080/api/containers/python_app/logs
    {"stdout":"Some message\n"}
    {"exit_code":0}
    
    http code: 200

    follow=true を付与する例

    [ATDE ~]$ curl_rest https://armadillo.local:58080/api/containers/python_app/logs?follow=true
    {"stdout":"Some message\n"}
    Ctrl-C で終了
  • コンテナ起動
    POST "/api/containers/{container}/start"
    必要権限: ContainerAdmin
    パラメータ: 無し
    出力: 無し

    [ATDE ~]$ curl_rest -X POST https://armadillo.local:58080/api/containers/python_app/start
    
    http code: 200
  • コンテナ停止
    POST "/api/containers/{container}/stop"
    必要権限: ContainerAdmin
    パラメータ: 無し
    出力: 無し

    [ATDE ~]$ curl_rest -X POST https://armadillo.local:58080/api/containers/python_app/stop
    
    http code: 200

6.8.6.7. Rest API : ネットワーク設定

  • ネットワーク接続一覧
    GET "/api/connections"
    必要権限: NetworkView
    パラメータ: 無し
    出力: ネットワーク接続一覧と各接続の uuid, name, state, ctype, あれば device 情報

    [ATDE ~]$ curl_rest https://armadillo.local:58080/api/connections
    {"connections":[{"name":"Wired connection 1","state":"activated","uuid":"18d241f1-946c-3325-974f-65cda3e6eea5","ctype":"802-3-ethernet","device":"eth0"},{"name":"lo","state":"activated","uuid":"529ec241-f122-4cb2-843f-ec9787b2aee7","ctype":"loopback","device":"lo"},{"name":"podman0","state":"activated","uuid":"be4583bc-3498-4df2-a31c-773d781433aa","ctype":"bridge","device":"podman0"},{"name":"veth0","state":"activated","uuid":"03446b77-b1ab-47d0-98fc-f167c3f3778a","ctype":"802-3-ethernet","device":"veth0"},{"name":"Wired connection 2","state":"","uuid":"181f44df-850e-36c1-a5a4-6e461c768acb","ctype":"802-3-ethernet"},{"name":"Wired connection 3","state":"","uuid":"e4381368-6351-3985-ba6e-2625c62b8d39","ctype":"802-3-ethernet"}]}
    
    http code: 200
  • ネットワーク接続詳細取得
    GET "/api/connections/{connection}"
    必要権限: NetworkView
    パラメータ: 無し(URL の connection は UUID または接続名で使用可能)
    出力: 接続の詳細情報(Network Manager のプロパティ)

    [ATDE ~]$ curl_rest https://armadillo.local:58080/api/connections/Wired%20connection%201
    {"name":"Wired connection 1","state":"activated","uuid":"18d241f1-946c-3325-974f-65cda3e6eea5","ctype":"802-3-ethernet","device":"eth0","props":{"802-3-ethernet.accept-all-mac-addresses":"-1","802-3-ethernet.auto-negotiate":"no","802-3-ethernet.cloned-mac-address":"","802-3-ethernet.duplex":"","802-3-ethernet.generate-mac-address-mask":"","802-3-ethernet.mac-address":"","802-3-ethernet.mac-address-blacklist":"","802-3-ethernet.mtu":"auto","802-3-ethernet.port":"","802-3-ethernet.s390-nettype":"","802-3-ethernet.s390-options":"","802-3-ethernet.s390-subchannels":"","802-3-ethernet.speed":"0","802-3-ethernet.wake-on-lan":"default","802-3-ethernet.wake-on-lan-password":"","GENERAL.CON-PATH":"/org/freedesktop/NetworkManager/Settings/1","GENERAL.DBUS-PATH":"/org/freedesktop/NetworkManager/ActiveConnection/6","GENERAL.DEFAULT":"yes","GENERAL.DEFAULT6":"no","GENERAL.DEVICES":"eth0","GENERAL.IP-IFACE":"eth0","GENERAL.MASTER-PATH":"","GENERAL.NAME":"Wired connection 1","GENERAL.SPEC-OBJECT":"","GENERAL.STATE":"activated","GENERAL.UUID":"18d241f1-946c-3325-974f-65cda3e6eea5","GENERAL.VPN":"no","GENERAL.ZONE":"","IP4.ADDRESS[1]":"198.51.100.123/16","IP4.DNS[1]":"192.0.2.1","IP4.DNS[2]":"192.0.2.2","IP4.GATEWAY":"198.51.100.1","IP4.ROUTE[1]":"dst = 198.51.100.0/16, nh = 0.0.0.0, mt = 100","IP4.ROUTE[2]":"dst = 0.0.0.0/0, nh = 198.51.100.1, mt = 100","IP6.ADDRESS[1]":"fe80::211:cff:fe00:b13/64","IP6.GATEWAY":"","IP6.ROUTE[1]":"dst = fe80::/64, nh = ::, mt = 1024","connection.auth-retries":"-1","connection.autoconnect":"yes","connection.autoconnect-priority":"-999","connection.autoconnect-retries":"-1","connection.autoconnect-slaves":"-1","connection.dns-over-tls":"-1","connection.gateway-ping-timeout":"0","connection.id":"Wired connection 1","connection.interface-name":"eth0","connection.lldp":"default","connection.llmnr":"-1","connection.master":"","connection.mdns":"-1","connection.metered":"unknown","connection.mptcp-flags":"0x0","connection.multi-connect":"0","connection.permissions":"","connection.read-only":"no","connection.secondaries":"","connection.slave-type":"","connection.stable-id":"","connection.timestamp":"1703208824","connection.type":"802-3-ethernet","connection.uuid":"18d241f1-946c-3325-974f-65cda3e6eea5","connection.wait-activation-delay":"-1","connection.wait-device-timeout":"-1","connection.zone":"","ipv4.addresses":"198.51.100.123/16","ipv4.auto-route-ext-gw":"-1","ipv4.dad-timeout":"-1","ipv4.dhcp-client-id":"","ipv4.dhcp-fqdn":"","ipv4.dhcp-hostname":"","ipv4.dhcp-hostname-flags":"0x0","ipv4.dhcp-iaid":"","ipv4.dhcp-reject-servers":"","ipv4.dhcp-send-hostname":"yes","ipv4.dhcp-timeout":"0","ipv4.dhcp-vendor-class-identifier":"","ipv4.dns":"192.0.2.1,192.0.2.2","ipv4.dns-options":"","ipv4.dns-priority":"0","ipv4.dns-search":"","ipv4.gateway":"198.51.100.1","ipv4.ignore-auto-dns":"no","ipv4.ignore-auto-routes":"no","ipv4.link-local":"0","ipv4.may-fail":"yes","ipv4.method":"manual","ipv4.never-default":"no","ipv4.replace-local-rule":"-1","ipv4.required-timeout":"-1","ipv4.route-metric":"-1","ipv4.route-table":"0","ipv4.routes":"","ipv4.routing-rules":"","ipv6.addr-gen-mode":"eui64","ipv6.addresses":"","ipv6.auto-route-ext-gw":"-1","ipv6.dhcp-duid":"","ipv6.dhcp-hostname":"","ipv6.dhcp-hostname-flags":"0x0","ipv6.dhcp-iaid":"","ipv6.dhcp-send-hostname":"yes","ipv6.dhcp-timeout":"0","ipv6.dns":"","ipv6.dns-options":"","ipv6.dns-priority":"0","ipv6.dns-search":"","ipv6.gateway":"","ipv6.ignore-auto-dns":"no","ipv6.ignore-auto-routes":"no","ipv6.ip6-privacy":"-1","ipv6.may-fail":"yes","ipv6.method":"auto","ipv6.mtu":"auto","ipv6.never-default":"no","ipv6.ra-timeout":"0","ipv6.replace-local-rule":"-1","ipv6.required-timeout":"-1","ipv6.route-metric":"-1","ipv6.route-table":"0","ipv6.routes":"","ipv6.routing-rules":"","ipv6.token":"","proxy.browser-only":"no","proxy.method":"none","proxy.pac-script":"","proxy.pac-url":""}}
    http code: 200
  • ネットワーク接続の変更
    PATCH "/api/connections/{connection}"
    必要権限: NetworkAdmin
    パラメータ: Network Manager で編集可能な値
    出力: 無し

    [ATDE ~]$ curl_rest -X PATCH -d ipv4.method=manual -d ipv4.addresses=198.51.100.123/16 https://armadillo.local:58080/api/connections/Wired%20connection%201
    
    http code: 200

6.8.6.8. Rest API : 時刻の設定

  • 時刻の状況確認
    GET "/api/time/ntp_info"
    必要権限: TimeView
    パラメータ: 無し
    出力: time_now: epoch 形式の現在時刻、ntp_server_ip: 現在同期中のサーバーアドレス。同期されていない場合は「null」となります。 ntp_server_offset: 現在同期中のサーバーとの時刻の遅れ(マイナスの場合は Armadillo がサーバーより早いです)
[ATDE ~]$ curl_rest https://armadillo.local:58080/api/time/ntp_info
{"ntp_server_ip":"203.0.113.10","ntp_server_offset":"-0.000015824","time_now":1710139558}
http code: 200
  • NTP の設定確認
    GET "/api/time/ntp_config"
    必要権限: TimeView
    パラメータ: 無し
    出力: servers: 同期する対象、initstepslew: Armadillo 起動時に同期するかどうかの設定
[ATDE ~]$ curl_rest https://armadillo.local:58080/api/time/ntp_config
{"servers":["pool pool.ntp.org iburst"],"initstepslew":"10 pool.ntp.org"}
http code: 200
  • NTP の設定
    POST "/api/time/ntp_config"
    必要権限: TimeAdmin
    パラメータ: servers: 同期する対象、initstepslew: Armadillo 起動時に同期するかどうかの設定。パラメータを送信しない場合は設定されません。 値が空の場合は設定が削除されて、「 default 」の場合は Armadillo Base OS のデフォルトに戻ります。
    出力: 取得時と同じ
[ATDE ~]$ curl_rest https://armadillo.local:58080/api/time/ntp_config -X POST -d "servers=server 203.0.113.10 iburst" -d "servers=server 203.0.113.11 iburst" -d "initstepslew="
{"servers":["server 203.0.113.10 iburst","server 203.0.113.11 iburst"],"initstepslew":null}
http code: 200
[ATDE ~]$ curl_rest https://armadillo.local:58080/api/time/ntp_config -X POST -d "servers=default&initstepslew=default"
{"servers":["pool pool.ntp.org iburst"],"initstepslew":"10 pool.ntp.org"}
http code: 200
  • タイムゾーンの確認
    GET "/api/time/timezone"
    必要権限: TimeView
    パラメータ: 無し
    出力: timezone: 使用されているタイムゾーン
[ATDE ~]$ curl_rest https://armadillo.local:58080/api/time/timezone
{"timezone":"Asia/Tokyo"}
http code: 200
  • タイムゾーンの設定
    POST "/api/time/timezone"
    必要権限: TimeAdmin
    パラメータ: timezone: 設定するタイムゾーン
    出力: 無し
[ATDE ~]$ curl_rest https://armadillo.local:58080/api/time/timezone -X POST -d "timezone=Asia/Tokyo"
http code: 200
  • 時刻を強制的に設定する
    POST "/api/time/set"
    必要権限: TimeAdmin
    パラメータ: timestamp: epoch 形式の時刻
    出力: 無し
[ATDE ~]$ curl_rest https://armadillo.local:58080/api/time/set -X POST -d "timestamp=$(date +%s)"
http code: 200

6.8.6.9. Rest API : 電源制御

  • 再起動
    POST "/api/reboot"
    必要権限: Reboot
    パラメータ: 無し
    出力: 無し

    [ATDE ~]$ curl_rest -X POST https://armadillo.local:58080/api/reboot
    
    http code: 200
  • 停止
    POST "/api/poweroff"
    必要権限: Poweroff
    パラメータ: 無し
    出力: 無し

    [ATDE ~]$ curl_rest -X POST https://armadillo.local:58080/api/poweroff
    
    http code: 200

6.8.6.10. Rest API : ABOS Web 制御

  • リスタート
    POST "/api/abosweb/restart"
    必要権限: AbosWebRestart
    パラメータ: 無し
    出力: コネクションリセット。ABOS Web はリスタートする前に一度終了するためコネクションリセットが発生します。

    [ATDE ~]$ curl_rest -X POST https://armadillo.local:58080/api/abosweb/restart
    
    http code: 000
    curl: (52) Empty reply from server

6.8.7. カスタマイズ

ABOS Web をお客様の最終製品へ組み込む場合に、ロゴ画像や背景色、メニューの文言などを カスタマイズすることができます。詳細は 「ABOS Web をカスタマイズする」 を参照してください。

6.9. ABOSDE から ABOS Web の機能を使用する

ABOSDE は以下に示す ABOS Web の情報取得や動作を行うことができます。

  • Armadillo の SWU バージョンを取得する
  • Armadillo のコンテナの情報を取得する
  • Armadillo のコンテナを起動・停止する
  • Armadillo のコンテナのログを取得する
  • Armadillo に SWU をインストールする

ABOSDE は ABOS Web の Rest API を用いて通信を行っていますので、ABOS Web にパスワードでログインができる状態である必要があります。 ABOS Web へのログインを行っていない場合は「ABOS Web とは」を参考にしてください。

ABOSDE から ABOS Web の機能を使用するには通信を行う対象の Armadillo を選択する必要があります。 図6.98「ABOSDE で ローカルネットワーク上の Armadillo をスキャンする」 の赤枠で囲まれているボタンをクリックすることで、ローカルネットワーク上で ABOS Web が動作している Armadillo をスキャンすることができます。 ただし、ATDE のネットワークを NAT に設定している場合は Armadillo がリストに表示されません。

images/abos-images/abos-web/abosde_monitor_welcome_page.png

図6.98 ABOSDE で ローカルネットワーク上の Armadillo をスキャンする


ABOSDE から ABOS Web に初めて通信を行う時、ABOS Web は通信に使用するためのトークンを発行します。 そのため、ABOSDE では 図6.99「ABOSDE の ABOS Web パスワード入力画面」 のように ABOS Web のパスワードを求められますので、設定したパスワードを入力してください。

images/abos-images/abosde_enter_abos_web_password.png

図6.99 ABOSDE の ABOS Web パスワード入力画面


6.9.1. Armadillo の SWU バージョンを取得する

ローカルネットワーク上の Armadillo をスキャンした後に、 図6.100「ABOSDE で Armadillo の SWU バージョンを取得」 の赤枠で囲まれているボタンをクリックすることで、選択した Armadillo の SWU バージョンを取得することができます。

images/abos-images/abosde_get_swu_versions.png

図6.100 ABOSDE で Armadillo の SWU バージョンを取得


6.9.2. Armadillo のコンテナの情報を取得する

ローカルネットワーク上の Armadillo をスキャンした後に、 図6.101「ABOSDE で Armadillo のコンテナ情報を取得」 の赤枠で囲まれているボタンをクリックすることで、選択した Armadillo のコンテナの情報を取得できます。 表示されるコンテナの情報は以下の通りとなります。

  • state : コンテナが起動中の場合は running、コンテナが停止中の場合は exited
  • image : コンテナのイメージ名
  • command : コンテナ起動時に実行しているコマンド
images/abos-images/abosde_get_containers_info.png

図6.101 ABOSDE で Armadillo のコンテナ情報を取得


6.9.3. Armadillo のコンテナを起動・停止する

ローカルネットワーク上の Armadillo をスキャンした後に、 図6.102「ABOSDE で Armadillo のコンテナを起動」 の赤枠で囲まれているボタンをクリックすることで、選択したコンテナを起動することができます。 コンテナを起動できた場合はコンテナの status が running に変化します。 また、図6.103「ABOSDE で Armadillo のコンテナを停止」 の赤枠で囲まれているボタンをクリックすることで、選択したコンテナを停止することができます。 コンテナを停止できた場合はコンテナの status が exited に変化します。

images/abos-images/abosde_run_container.png

図6.102 ABOSDE で Armadillo のコンテナを起動


images/abos-images/abosde_stop_container.png

図6.103 ABOSDE で Armadillo のコンテナを停止


6.9.4. Armadillo のコンテナのログを取得する

図6.104「ABOSDE で Armadillo のコンテナのログを取得」 の赤枠で囲まれているボタンをクリックすることで、コンテナが出力したログを取得することができます。 ログは VSCode のテキストエディタに開かれます。コンテナが何もログを出力していない場合は表示されません。

images/abos-images/abosde_get_container_log.png

図6.104 ABOSDE で Armadillo のコンテナのログを取得


6.9.5. Armadillo に SWU をインストールする

ローカルネットワーク上の Armadillo をスキャンした後に、 図6.105「ABOSDE で Armadillo に SWU をインストール」 の赤枠で囲まれているボタンをクリックすることで、選択した Armadillo に SWU をインストールすることができます。 SWU インストールのログは VSCode 画面下部の OUTPUT に表示されます。

images/abos-images/abosde_install_swu.png

図6.105 ABOSDE で Armadillo に SWU をインストール


6.10. VPU や NPU を使用する

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

予め「クロスコンパイル用ライブラリをインストールする」の手順を実施しておいてください。

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

以下に示す製品では、出荷状態でライブラリイメージが Armadillo に書き込まれています。 このため、ここで説明する手順はライブラリをアップデートする場合や、 「ブートディスクの作成」 または 「初期化インストールディスクの作成」 の手順に従ってディスクイメージを作成する場合に 必要となります。

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

名称 型番

Armadillo-X2 開発セット(メモリ2GB)

AX2210-U00D0

Armadillo-X2 量産ボード(メモリ2GB、ストレージ10GB)

AX2210-U00Z

Armadillo-X2 量産ボード(メモリ2GB、ストレージ10GB、ケース入り)

AX2210-C00Z


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

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

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


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

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

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


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

6.10.2. 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

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


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

[armadillo ~]$ mount /opt/firmware

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


6.10.3. ライブラリイメージのバージョンを確認する

Armadillo に書き込んだライブラリイメージのバージョンは、次のコマンドを実行することで確認できます。

[armadillo ~]$ cat /opt/firmware/etc/imxlib_version
2.2.0

図6.110 ライブラリバージョンの確認


[ティップ]

図6.110「ライブラリバージョンの確認」によるバージョン確認方法は、ライブラリイメージのバージョンが2.2.0以降の場合のみ可能です。 ライブラリイメージのバージョンが2.2.0未満の場合、/opt/firmware/etc/imxlib_versionファイルは存在しません。

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

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

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

  1. /opt/firmware を渡すコンテナコンフィグの例
[armadillo ~]$ vi /etc/atmark/containers/container_name.conf
add_volumes /opt/firmware:/opt/firmware:ro 1
add_args --env=LD_LIBRARY_PATH=/opt/firmware/usr/lib/aarch64-linux-gnu 2
set_image docker.io/debian:bullseye
set_command sleep infinity
[armadillo ~]# podman_start container_name
Starting 'container_name'
5c2078ff7d54082c1d18b6c4f026c36675328cea61ee6a1ab1b27145df18d72a

1

add_volumes で /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
[container ~]# ln -s /opt/firmware/usr/lib/aarch64-linux-gnu/imx-mm /usr/lib/aarch64-linux-gnu

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


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

[ティップ]

at-debian-image のコンテナを使用する場合には、変数やリンクがすでに作成されていますので add_volumes だけでライブラリを使えます。

6.11. マルチメディアデータを扱う

6.11.1. GStreamer - マルチメディアフレームワーク

6.11.1.1. GStreamer - マルチメディアフレームワークとは

GStreamer は、オープンソースのマルチメディアフレームワークです。小さなコアライブラリに様々 な機能をプラグインとして追加できるようになっており、多彩な形式のデータを扱うことができます。 GStreamer で扱うことができるデータフォーマットの一例を下記に示します。

  • コンテナフォーマット: mp4, avi, mpeg-ps/ts, mkv/webm, ogg
  • 動画コーデック: H.264/AVC, VP8, VP9
  • 音声コーデック: AAC, MP3, Theora, wav
  • 画像フォーマット: JPEG, PNG, BMP
  • ストリーミング: http, rtp

GStreamer では、マルチメディアデータをストリームとして扱います。 ストリームを流すパイプラインの中に、エレメントと呼ばれる処理単位を格納し、 それらを繋ぎ合わせることで、デコードやエンコードなどの処理を行います。

6.11.2. GStreamer 実行用コンテナを作成する

この章における GStreamer の実行例はアットマークテクノが提供する debian イメージから作成したコンテナ内で実行することを想定しています。 ここではアットマークテクノが提供するイメージからコンテナを作成します。 このイメージに関しては 「アットマークテクノが提供するイメージを使う」 を参照してください。

[armadillo ~]# vi /etc/atmark/containers/gst_example.conf
set_image at-debian-image
set_command weston --tty=7
add_devices /dev/dri /dev/galcore
add_devices /dev/mxc_hantro /dev/mxc_hantro_vc8000e
add_devices /dev/ion
add_devices /dev/input /dev/tty7
add_volumes /run/udev:/run/udev:ro
add_volumes /opt/firmware:/opt/firmware:ro
add_args --cap-add=SYS_TTY_CONFIG
add_volumes /tmp/xdg_home:/run/xdg_home
add_args --env=XDG_RUNTIME_DIR=/run/xdg_home
# カメラをコンテナ内で video3 として見せます
# パスがカメラによって変わりますので、自分の環境にあわせて
# 設定してください。
add_device /dev/v4l/by-path/platform-xhci-hcd.1.auto-usb-0:1.1:1.0-video-index1 /dev/video3
[armadillo ~]# podman_start gst_example
Starting 'gst_example'
b53c127075cdd157a2118f37121451ec58f2c273b84da197d61b4468a8328a8b
[armadillo ~]# podman exec -ti gst_example bash
[container /]#

図6.112 GStreamer を実行するためのコンテナ作成例


コンテナ内では最初に GStreamer をインストールします。

[container /]# apt update
[container /]# apt install gstreamer1.0-imx gstreamer1.0-imx-tools \
gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-bad

図6.113 gstreamer のインストール


次に、コンテナ内で画面表示を行うためのデスクトップ環境を起動します。 ここでは weston を起動します。

[container /]# weston --tty=7 &

図6.114 weston の起動


--tty=7 のオプションは画面表示に使用する tty の値を設定してください。

次に、音声を出力するのに必要な pulseaudio を起動します。

[conteiner /]# apt install pulseaudio
[container /]# pulseaudio --start --exit-idle-time=-1

図6.115 pulseaudio の起動


以上により、GSreamer をコンテナ内で実行できるようになります。

6.11.3. GStreamer パイプラインの実行例

パイプラインの実行例を以下に示します。

[container ~]# gst-launch-1.0 filesrc location=<ファイルパス> \
! qtdemux name=demux0 demux0.video_0 ! h264parse ! queue ! vpudec ! queue \
! waylandsink window-width=1920 window-height=1080 demux0.audio_0 ! queue ! beepdec ! autoaudiosink

図6.116 GStreamer の実行例


GStreamer のパイプラインは、シェルスクリプトのパイプ構文の構造に似ています。GStreamer の 各エレメントとシェルスクリプト内のコマンドを対比することができます。構文的な違いとして、 GStreamer のパイプラインは「!」を使って各エレメントを繋ぎますが、シェルスクリプトは「|」を使います。

上記例は、GStreamer のデバッグ/プロトタイピング用のコマンドラインツールである gst-launch-1.0 を使って説明しましたが、GStreamer はライブラリとして提供されているため、GStreamer を使った マルチメディア機能を自作のアプリケーションプログラムに組み込むことができます。API や アプリケーション開発マニュアルは、gstreamer.freedesktop.org の Documentation ページ (http://gstreamer.freedesktop.org/documentation/)から参照することができます。

Armadillo-X2が採用している SoC である i.MX 8M Plus は、動画のデコード/エンコードを行うための Video Processing Unit(VPU) と呼ばれる 専用プロセッサを搭載しています。Armadillo-X2には、この VPU を使用するための GStreamer エレメントがインストールされており、 以下の動画コーデックではメイン CPU のパフォーマンスを落とすことなく動画のデコード/エンコードが行なえます。

  • デコード可能なコーデック

    • H.264/AVC
    • VP8
    • VP9
  • エンコード可能なコーデック

    • H.264/AVC

以降の章では、これらのコーデックに対する GStreamer の実行例を紹介します。

上記で挙げたコーデック以外のものであってもデコード/エンコードは可能ですが、その場合は CPU を使ったソフトウェア処理となってしまうため、 システム全体のパフォーマンスは低下します。

6.11.4. 動画を再生する

GStreamer を使用して動画を再生するための実行例を、音声を含んでいる動画と含んでいない動画の 2 通りについて示します。 VPU でハードウェアデコードを行う GStreamer エレメントとして vpudec を使うことができます。

6.11.4.1. H.264/AVC 動画を再生する

[container ~]# gst-launch-1.0 filesrc location=<ファイルパス> \
! qtdemux name=demux0 demux0.video_0 ! h264parse ! queue ! vpudec ! queue \
! waylandsink window-width=1920 window-height=1080 demux0.audio_0 ! queue ! beepdec ! autoaudiosink

図6.117 H.264/AVC 動画の再生(音声あり)


[container ~]# gst-launch-1.0 filesrc location=<ファイルパス> \
! qtdemux ! h264parse ! vpudec ! queue ! waylandsink window-width=1920 window-height=1080

図6.118 H.264/AVC 動画の再生(音声なし)


6.11.4.2. VP8 動画を再生する

[container ~]# gst-launch-1.0 filesrc location=<ファイルパス> \
! matroskademux name=demux0 demux0.video_0 ! queue ! vpudec ! queue \
! waylandsink window-width=1920 window-height=1080 demux0.audio_0 ! queue ! beepdec ! autoaudiosink

図6.119 VP8 動画の再生(音声あり)


[container ~]# gst-launch-1.0 filesrc location=<ファイルパス> \
! matroskademux ! vpudec ! queue ! waylandsink window-width=1920 window-height=1080

図6.120 VP8 動画の再生(音声なし)


6.11.4.3. VP9 動画を再生する

[container ~]# gst-launch-1.0 filesrc location=<ファイルパス> \
! matroskademux name=demux0 demux0.video_0 ! queue ! vpudec ! queue \
! waylandsink window-width=1920 window-height=1080 demux0.audio_0 ! queue ! beepdec ! autoaudiosink

図6.121 VP9 動画の再生(音声あり)


[container ~]# gst-launch-1.0 filesrc location=<ファイルパス> \
! matroskademux ! vpudec ! queue ! waylandsink window-width=1920 window-height=1080

図6.122 VP9 動画の再生(音声なし)


6.11.5. ストリーミングデータを再生する

GStreamer を使用してネットワーク上にある動画ファイルを HTTP 及び RTSP でストリーミング再生する実行例を示します。 VPU でハードウェアデコードを行う GStreamer エレメントとして vpudec を使うことができます。

6.11.5.1. HTTP ストリーミング

[container ~]# gst-launch-1.0 souphttpsrc location=<動画ファイルのURI> \
! qtdemux name=demux demux. ! queue ! vpudec ! queue \
! waylandsink demux. ! queue ! beepdec ! autoaudiosink

図6.123 HTTP ストリーミングの再生(音声あり)


[container ~]# gst-launch-1.0 souphttpsrc location=<動画ファイルのURI> \
! qtdemux ! queue ! vpudec ! queue ! waylandsink

図6.124 HTTP ストリーミングの再生(音声なし)


6.11.5.2. RTSP ストリーミング

[container ~]# gst-launch-1.0 rtspsrc location=<動画ファイルのURI> name=source \
! queue ! rtph264depay ! vpudec ! queue ! waylandsink source. ! queue \
! rtpmp4gdepay ! aacparse ! beepdec ! autoaudiosink

図6.125 RTSP ストリーミングの再生(音声あり)


[container ~]# gst-launch-1.0 rtspsrc location=<動画ファイルのURI> \
! queue ! rtph264depay ! vpudec ! queue ! waylandsink

図6.126 RTSP ストリーミングの再生(音声なし)


6.11.6. USB カメラからの映像を表示する

GStreamer の v4l2src エレメントを使うことで、V4L2(Video for Linux 2) デバイスとして実装されているカメラデバイスから映像を取得できます。 どのデバイスから映像を取得するかは、v4l2src エレメントの device プロパティにデバイスファイル名を指定することで変更できます。 UVC 対応 USB カメラなども同様に v4l2src で扱うことができるので、ここでは USB カメラからの映像を表示する実行例を示します。

加えて、カメラの他にマイクも接続していて、同時にマイクからの音声も出力する場合の例も示しています。 実行例中のデバイスファイル /dev/video1 の部分や、縦横サイズである width や height の値は実行する環境によって異なる可能性がありますので、適宜変更してください。 また、/dev/v4l/by-id ディレクトリの下に、接続しているカメラ名の付いた /dev/videoN へのシンボリックリンクがありますので、デバイスとしてそれを指定することも可能です。

[container ~]# gst-launch-1.0 v4l2src device=/dev/video1 \
! video/x-raw,width=640,height=480,framerate=30/1 \
! waylandsink window-width=640 window-height=480 pulsesrc \
! audio/x-raw,rate=44100,channels=2 ! autoaudiosink

図6.127 USB カメラからの映像表示(音声あり)


[container ~]# gst-launch-1.0 v4l2src device=/dev/video1 \
! video/x-raw,width=640,height=480,framerate=30/1 \
! waylandsink window-width=640 window-height=480

図6.128 USB カメラからの映像表示(音声なし)


6.11.7. USBカメラからの映像を録画する

GStreamer の v4l2src エレメントを使うことで、V4L2(Video for Linux 2) デバイスとして実装されているカメラデバイスから映像を取得できます。 どのデバイスから映像を取得するかは、v4l2src エレメントの device プロパティにデバイスファイル名を指定することで変更できます。 UVC 対応 USB カメラなども同様に v4l2src で扱うことができるので、ここでは USB カメラからの映像をファイルへ保存する実行例と、 映像を表示しながら同時にファイルへ保存する実行例を示します。

加えて、カメラの他にマイクも接続していて、映像の保存と同時にマイクからの音声も MP3 へエンコードして保存する場合の例も示しています。 実行例中のデバイスファイル /dev/video1 の部分や、縦横サイズである width や height の値は実行する環境によって異なる可能性がありますので、適宜変更してください。 また、/dev/v4l/by-id ディレクトリの下に、接続しているカメラ名の付いた /dev/videoN へのシンボリックリンクがありますので、デバイスとしてそれを指定することも可能です。

パイプライン停止時に EOS イベントを発行するように、gst-launch-1.0 コマンドに-e オプションを付けています。 エンコードを終了するには、Ctrl-C で gst-launch-1.0 コマンドを停止してください。

6.11.7.1. H.264/AVC で録画する

VPU でハードウェアエンコードを行う GStreamer エレメントとして vpuenc_h264 を使うことができます。

[container ~]# gst-launch-1.0 -e v4l2src device=/dev/video1 \
! video/x-raw,width=640,height=480,framerate=30/1 \
! queue ! vpuenc_h264 ! h264parse ! queue ! mux. pulsesrc \
! audio/x-raw,rate=44100,channels=2 ! lamemp3enc ! queue \
! mux. qtmux name=mux ! filesink location=./output.mp4

図6.129 USB カメラからの映像をH.264で録画(音声あり)


[container ~]# gst-launch-1.0 -e v4l2src device=/dev/video1 \
! video/x-raw,width=640,height=480,framerate=30/1 \
! queue ! vpuenc_h264 ! h264parse ! queue \
! filesink location=./output.mp4

図6.130 USB カメラからの映像をH.264で録画(音声なし)


  • 表示と録画を同時に行う
[container ~]# gst-launch-1.0 -e v4l2src device=/dev/video1 \
! video/x-raw,width=640,height=480,framerate=30/1 \
! tee name=t1 ! queue ! vpuenc_h264 ! h264parse ! queue ! mux. pulsesrc \
! tee name=t2 ! audio/x-raw,rate=44100,channels=2 ! lamemp3enc ! queue \
! mux. qtmux name=mux ! filesink location=./output.mp4 t1. ! queue \
! waylandsink window-width=640 window-height=480 t2. ! queue ! autoaudiosink

図6.131 USB カメラからの映像を表示しながらH.264で録画(音声あり)


[container ~]# gst-launch-1.0 -e v4l2src device=/dev/video1 \
! video/x-raw,width=640,height=480,framerate=30/1 \
! tee name=t1 ! queue ! vpuenc_h264 ! h264parse ! queue \
! qtmux ! filesink location=./output.mp4 t1. ! queue \
! waylandsink window-width=640 window-height=480

図6.132 USB カメラからの映像を表示しながらH.264で録画(音声なし)


6.11.8. Video Processing Unit(VPU)

6.11.8.1. Video Processing Unit とは

Video Processing Unit(以下、VPU) とは i.MX 8M Plus に搭載されている、動画のエンコード/デコード処理専用のプロセッサです。 動画のエンコード/デコード処理は、システムに負荷をかけることが多く、メイン CPU で処理を行うとシステム全体のパフォーマンスが低下します。 VPU を利用することでシステム全体のパフォーマンスを落とすことなく、動画のエンコード/デコード処理を行うことができます。

VPU が対応しているフォーマットは以下の通りです。

  • デコーダーが対応しているフォーマット

    • H.264/AVC
    • VP8
    • VP9
  • エンコーダが対応しているフォーマット

    • H.264/AVC

6.11.8.2. VPUの仕様

  • H.264/AVC デコーダー

表6.8 H.264/AVC デコーダー仕様

Profile

High、Main、Baseline

Min resolution

48x48

Max resolution

1920x1080

Frame rate

60 fps

Bitrate

60 Mbps


  • VP8 デコーダー

表6.9 VP8 デコーダー仕様

Profile

-

Min resolution

48x48

Max resolution

1920x1080

Frame rate

60 fps

Bitrate

60 Mbps


  • VP9 デコーダー

表6.10 VP9 デコーダー仕様

Profile

Profile 0, 2

Min resolution

72x72

Max resolution

1920x1080

Frame rate

60 fps

Bitrate

100 Mbps


  • H.264/AVC エンコーダー

表6.11 H.264/AVC エンコーダー仕様

Profiles

Baseline、Main、High、High 10

Maximum Luma pixel sample rate

1920x1080 @ 60 fps

Slices

I, P and B slices

Frame Types

Progressive

Entropy encoding

CABAC、CAVLC

Error resilience

Slices

Maximum MV range

Horizontal (P slice) in pixels: +/-139

Horizontal (B slice) in pixels: +/-75

Vertical (P or B slice) in pixels:

  • Config1: +/-13 (planned)
  • Config2: +/-21
  • Config3: +/-29 (planned)
  • Config4: +/-45 (planned)
  • Config5: +/-61 (planned)

(= Search Window Size -3 pixels)

MV accuracy

1/4 pixel

Supported block sizes

Macroblock and sub-macroblock partitions:

  • Intra PU: 16x16 / 8x8 / 4x4
  • Inter PU: 16x16 / 8x16 / 16x8
  • TU: 4x4 and 8x8 transforms

Intra-prediction modes

16x16: 4 modes

8x8: 9 modes

4x4: 9 modes

Maximum number of reference frames

2

Encoding picture type

Only progressive frame

IPCM encoding

Supported

Temporal scalable video coding

Up to 5 layers including the base layer

IPCM

IPCM rectangle mode

ROI / ROI_map

Absolute QP and qpoffset mode (-32 〜 31)

User controllable CU coded as IPCM CU or skip CU


6.12. デモアプリケーションを実行する

この章では、アットマークテクノが提供するデモアプリケーションについて説明します。 デモアプリケーションは GUI アプリケーションであるため、ディスプレイを接続している必要があります。 デモアプリケーションを実行するためのコンテナイメージとして、アットマークテクノが提供する コンテナイメージを想定しています。 このイメージに関しては 「アットマークテクノが提供するイメージを使う」 を参照してください。

また、パッケージのインストールにはデフォルトの tmpfs の容量が少ないので、 あらかじめ abos-ctrl podman-storage --disk で podman のストレージを eMMC に切り替えてください。開発が終わったら必ず tmpfs に戻ってください。

6.12.1. コンテナを作成する

デモアプリケーションを実行するためのコンテナを以下のように作成します。

デモアプリケーションは GUI アプリケーションであるため、 まずデスクトップ環境を起動する必要があります。ここでは weston を起動します。

[armadillo ~]# vi /etc/atmark/containers/demo_app.conf
set_image localhost/at-debian-image:latest
set_command weston --tty=7
add_args -ti --privileged
add_args --env=VIV_VX_ENABLE_CACHE_GRAPH_BINARY=1
add_args --env=VIV_VX_CACHE_BINARY_GRAPH_DIR=/var/cache/armadillo-demo-experience
add_volumes /sys /dev /run/udev /opt/firmware
add_volumes cache:/var/cache/armadillo-demo-experience
[armadillo ~]# podman_start demo_app
Starting 'demo_app'
b984a8cdf88539c32241618baf45651c92ab9318d82e1a7fbf2a4c0cba315efd
[armadillo ~]# podman exec -it demo_app bash
[container /]#

図6.133 デモアプリケーションを実行するためのコンテナ作成例


6.12.2. デモアプリケーションランチャを起動する

デモアプリケーションランチャを起動します。 個々のデモアプリケーションはこのデモアプリケーションランチャから起動できます。 このデモアプリケーションランチャは GUI フレームワークとして Flutter を使用しています。 デモアプリケーションランチャのソースコードは、apt source で取得することができます。

[container /]# apt install armadillo-demo-experience
[container /]# demoexperience

図6.134 デモアプリケーションランチャの起動


以下のようなアプケーションが起動します。

images/demo_app_launcher_1.png

左側のカテゴリから起動したいデモアプリケーションを選びます。

images/demo_app_launcher_2.png
images/demo_app_launcher_3.png

選んだアプリケーションは、右下の「起動」ボタンで起動することができます。

[警告]

デモアプリケーションには TensorFlow Lite と NPU を使用するものが含まれています。 TensorFlow Lite と NPU を扱うライブラリのバージョンによっては、デモアプリケーションが正しく動作しない場合があります。 以下のバージョンになっていることを確認してください。

表6.12 デモアプリケーション動作のために必要なバージョン

パッケージ名 必要バージョン

tensorflow-lite

2.8.0 以上

python3-tflite-runtime

2.8.0 以上

tensorflow-lite-vx-delegate

2.8.0 以上

tim-vx

1.1.39 以上


各パッケージのバージョンは、コンテナ内で以下のコマンドを実行することで確認できます。 以下は、tensorflow-lite のバージョンを確認する例です。

[container ~]# dpkg -l tensorflow-lite
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name            Version      Architecture Description
+++-===============-============-============-===============================================
ii  tensorflow-lite 2.8.0-1      arm64        deep learning framework for on-device inference

図6.135 パッケージのバージョンを確認する


バージョンの条件を満たしていない場合は、 apt update && apt upgrade を実行してアップデートを行ってください。

6.12.3. mediaplayer

mediaplayer は動画を再生するアプリケーションです。H.264, VP8, VP9 でエンコードされた 動画ファイルであれば、動画のデコードに VPU が使われます。File メニューから、再生したい 動画ファイルを選択することができます。 このアプリケーションは、GUI フレームワークとして wxWidgets を使用しています。

images/demo_app_mediaplayer.png

音声も出力したい場合は、pulseaudio をインストールして起動する必要があります。

[container /]# apt install pulseaudio
[container /]# pulseaudio --start --exit-idle-time=-1

図6.136 pulseaudio のインストールと起動


6.12.4. video recoder

video recoder は gstreamer を使用してカメラからの映像を録画することができます。 そのため、このアプリケーションを使用するためには、Armadillo 本体にカメラを接続する必要があります。 カメラが接続されていると Video device の項目でカメラを選択できるようになります。 カメラを選択し、Start ボタンを押すと別ウィンドウが表示され録画が開始されます。 アプリケーション上のテキストボックスには、Start ボタンを押したときに起動する gstreamer の コマンドを表示しています。テキストボックスの内容はキーボードで編集可能です。 このアプリケーションは、GUI フレームワークとして wxWidgets を使用しています。

images/demo_app_video_rec_tester.png

マイク付きのカメラなどで同時に音声も録音したい場合は、「mediaplayer」 を参照して pulseaudio を起動してください。

6.12.5. led switch tester

led switch tester は Armadillo 本体上の LED と SW1 を扱うアプリケーションです。 LED ボタンを押すことで Armadillo 本体上の LED の 点灯・消灯を確認することができます。 Armadillo 本体上の SW1 を押すとアプリケーションの SW1 部分の表示が変化することを確認できます。 このアプリケーションは、GUI フレームワークとして wxWidgets を使用しています。

images/demo_app_led.png

6.12.6. rtc tester

rtc tester は Armadillo 本体上の RTC に対して日時の設定および取得が行えるアプリケーションです。 カレンダー上から日付を選び、Time に設定したい時刻を入力した後、Set ボタンを押すと RTC にその日時が 設定されます。Get ボタンを押すと、現在の日時を RTC から読み込みアプリケーション上に反映されます。 このアプリケーションは、GUI フレームワークとして wxWidgets を使用しています。

images/demo_app_rtc_tester.png

6.12.7. object detection demo

object detection demo はカメラからの映像に対して物体認識を行うアプリケーションです。 NPU を使用しているため高速に物体認識を行えます。画面の左側には認識した物体を囲む四角形が表示され、 右側には認識した物体のラベルとスコアが表示されます。 このアプリケーションは機械学習のライブラリとして TensorFlow Lite を使用しています。

起動する前に、必要な Python ライブラリをインストールする必要があります。

[container /]# pip3 install pillow

図6.137 pillow のインストールと起動


images/demo_app_object_detection.png

このアプリケーションはカメラデバイスとしてデフォルトで /dev/video2 を使用します。 お使いの環境によって別のカメラデバイスに設定したい場合は、以下のファイルを変更してください。

[container /]# vi /usr/share/armadillo-demo-experience/resources/demos.json
:
: (省略)
:
{"Machine Learning":[{
        "Tensorflow Lite":[{
            "name": "object detection demo",
            "executable": "python3 /usr/share/armadillo-demo-experience/AI-demo/object_detection/detect_usbcamera.py --model /usr/share/armadillo-demo-experience/AI-demo/object_detection/detect.tflite --labels /usr/share/armadillo-demo-experience/AI-demo/object_detection/coco_labels.txt --camera_id 2", 1
            "compatible": "armadillo-x2",
            "description": "This is a simple object detection aplication that used NPU and TensorFlow Lite on the Armadillo-X2 board."
        }]
    }]

図6.138 ビデオデバイスの変更


1

--camera_id の値を環境に合わせて変更します。

6.12.8. pose estimation demo

pose estimation demo はカメラに映った人物の姿勢を推定して表示するアプリケーションです。 NPU を使用しているため高速に姿勢推定を行えます。推定した姿勢は人物の上に重ねて表示されます。 このアプリケーションは機械学習のライブラリとして TensorFlow Lite を使用しています。

images/demo_app_pose_estimation.png

このアプリケーションは起動してから画面に映像が表示されるまで初回のみ約 1 分ほどかかります。 2回目以降の起動では 5 秒程度で映像が表示されます。 また、カメラデバイスとしてデフォルトで /dev/video2 を使用します。 お使いの環境によって別のカメラデバイスに設定したい場合は、以下のファイルを変更してください。

[container /]# vi /usr/share/armadillo-demo-experience/resources/demos.json
:
: (省略)
:
{"Machine Learning":[{
:
: (省略)
:
        {
            "name": "pose estimation",
            "executable": "python3 /usr/share/armadillo-demo-experience/AI-demo/pose_estimation/pose_estimation.py --model /usr/share/armadillo-demo-experience/AI-demo/pose_estimation/posenet.tflite --camera_id 2", 1
            "source": "",
            "screenshot": "pose_estimation_demo.png",
            "compatible": "armadillo-x2",
            "description": "This is a simple pose estimation aplication that uses NPU on the Armadillo-X2 board."
        }]
    }]

図6.139 ビデオデバイスの変更


1

--camera_id の値を環境に合わせて変更します。

6.12.9. image segmentation demo

image segmentation demo はカメラに映った人物の「人物として認識された領域(セグメント)」を推定して表示するアプリケーションです。 NPU を使用しているため高速に領域推定を行えます。推定した領域は人物の上に青の透過色で重ねて表示されます。 このアプリケーションは機械学習のライブラリとして TensorFlow Lite を使用しています。

images/demo_app_image_segmentation.png

このアプリケーションはカメラデバイスとしてデフォルトで /dev/video2 を使用します。 お使いの環境によって別のカメラデバイスに設定したい場合は、以下のファイルを変更してください。

[container /]# vi /usr/share/armadillo-demo-experience/resources/demos.json
:
: (省略)
:
{"Machine Learning":[{
:
: (省略)
:
        {
            "name": "image segmentation",
            "executable": "python3 /usr/share/armadillo-demo-experience/AI-demo/image_segmentation/image_segmentation.py --model /usr/share/armadillo-demo-experience/AI-demo/image_segmentation/human_segmentation.tflite --camera_id 2", 1
            "source": "",
            "screenshot": "image_segmentation_demo.png",
            "compatible": "armadillo-x2",
            "description": "This is a simple image segmentation aplication that uses NPU on the Armadillo-X2 board."
        }]
    }]

図6.140 ビデオデバイスの変更


1

--camera_id の値を環境に合わせて変更します。

6.12.10. super resolution demo

super resolution demo はカメラの映像の中央部 50 x 50 ピクセルの領域を 200 x 200 ピクセルに解像度を 上げて表示する (超解像) アプリケーションです。NPU を使用しているため高速に超解像を行えます。 このアプリケーションは機械学習のライブラリとして TensorFlow Lite を使用しています。

画面右上は最近傍補間で 200 x 200 ピクセルに拡大した映像、画面右下が超解像で 200 x 200 ピクセルにした映像です。

images/demo_app_super_resolution.png

このアプリケーションは起動してから画面に映像が表示されるまで初回のみ約 1 分ほどかかります。 2回目以降の起動では 5 秒程度で映像が表示されます。 また、カメラデバイスとしてデフォルトで /dev/video2 を使用します。 お使いの環境によって別のカメラデバイスに設定したい場合は、以下のファイルを変更してください。

[container /]# vi /usr/share/armadillo-demo-experience/resources/demos.json
:
: (省略)
:
{"Machine Learning":[{
:
: (省略)
:
        {
            "name": "super resolution",
            "executable": "python3 /usr/share/armadillo-demo-experience/AI-demo/super_resolution/super_resolution.py --model /usr/share/armadillo-demo-experience/AI-demo/super_resolution/super_resolution.tflite --camera_id 2", 1
            "source": "",
            "screenshot": "super_resolution_demo.png",
            "compatible": "armadillo-x2",
            "description": "This is a super resolution application that uses NPU on the Armadillo-X2 board."
        }]
    }]

図6.141 ビデオデバイスの変更


1

--camera_id の値を環境に合わせて変更します。

6.12.11. hand estimation demo

hand estimation demo はカメラに映った人物の手指を検出してその領域と手の骨格を同時に表示するアプリケーションです。 NPU を使用しているため高速に手指検出を行えます。検出した手指の領域と骨格は手指の上に重ねて表示されます。 このアプリケーションは機械学習のライブラリとして TensorFlow Lite を使用しています。

images/demo_app_hand_estimation.png

このアプリケーションは起動してから画面に映像が表示されるまで初回のみ約 30 秒ほどかかります。 2回目以降の起動では 5 秒程度で映像が表示されます。 また、カメラデバイスとしてデフォルトで /dev/video2 を使用します。 お使いの環境によって別のカメラデバイスに設定したい場合は、以下のファイルを変更してください。

[container /]# vi /usr/share/armadillo-demo-experience/resources/demos.json
:
: (省略)
:
{"Machine Learning":[{
:
: (省略)
:
        {
            "name": "hand estimation",
            "executable": "python3 /usr/share/armadillo-demo-experience/AI-demo/hand_estimation/hand_estimation.py --landmark_model /usr/share/armadillo-demo-experience/AI-demo/hand_estimation/hand.tflite --detection_model /usr/share/armadillo-demo-experience/AI-demo/hand_estimation/palm.tflite --camera_id 2", 1
            "source": "",
            "screenshot": "hand_estimation_demo.png",
            "compatible": "armadillo-x2",
            "description": "This is a simple hand estimation application that uses NPU on the Armadillo-X2 board."
        }]
    }]

図6.142 ビデオデバイスの変更


1

--camera_id の値を環境に合わせて変更します。

6.12.12. screw detection demo

screw detection demo はカメラに映ったネジを検出してその領域を表示するアプリケーションです。 また、領域の大きさからネジの長さを測り、しきい値以下であれば赤枠、それ以外は青枠で領域を囲います。 各種パラメータはコマンドライン引数で指定可能です。

NPU を使用しているため高速にネジの検出を行えます。検出したネジの領域はネジの上に重ねて表示されます。 このアプリケーションは機械学習のライブラリとして TensorFlow Lite を使用しています。

images/demo_app_screw_detection.png

このアプリケーションは起動してから画面に映像が表示されるまで初回のみ約 30 秒ほどかかります。 2回目以降の起動では 5 秒程度で映像が表示されます。 また、カメラデバイスとしてデフォルトで /dev/video2 を使用します。 お使いの環境によって別のカメラデバイスに設定したい場合は、以下のファイルを変更してください。

[container /]# vi /usr/share/armadillo-demo-experience/resources/demos.json
:
: (省略)
:
{"Machine Learning":[{
:
: (省略)
:
        {
            "name": "screw detection",
            "executable": "python3 /usr/share/armadillo-demo-experience/AI-demo/screw_detection/screw_detection.py --camera_id 2 --conf_thres 0.5 --iou_thres 0.45 --len_thres 130", 1
            "source": "",
            "screenshot": "screw_detection_demo.png",
            "compatible": "armadillo-x2",
            "description": "This is a simple screw detection application that uses NPU on the Armadillo-X2 board."
        }]
    }]

図6.143 各種コンフィグの変更


1

この行の各パラメータを変更することで、アプリケーションの挙動が変化します。各パラメータの詳細は表6.13「ネジ検出デモのパラメータの詳細」を参照してください。

表6.13 ネジ検出デモのパラメータの詳細

パラメータ名 意味

camera_id

使用するカメラを指定します。/dev/videoNのNに相当します。

conf_thres

AIがネジと認識した確度のしきい値です。この値以下の確度の物体はネジとみなされません。

iou_thres

ネジ検出の後処理に使用するパラメータです。

len_thres

長いネジと短いネジの境界値を設定できます。

visualize_score

これを指定すると、AIがネジと認識した確度を描画します。

visualize_length

これを指定すると、ネジの長さを描画します。


6.13. ssh 経由で Armadillo Base OS にアクセスする

Armadillo-X2 には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に設定を保存しています。

6.14. コマンドラインからネットワーク設定をする

基本的に、 Armadillo-X2 のネットワーク設定は、「ネットワーク設定」で紹介したとおり、 ABOS Web で行います。 しかし、 ABOS Webで対応できない複雑なネットワーク設定を行いたい場合などは、コマンドラインからネットワークの設定を行うことも可能です。

ここでは、コマンドラインからネットワークを設定する方法について説明します。

6.14.1. 接続可能なネットワーク

Armadillo-X2 は、1つの Ethernet ポートが搭載されています。 Linuxからは、 eth0 に見えます。

表6.14 ネットワークとネットワークデバイス

ネットワーク ネットワークデバイス 出荷時の設定

Ethernet

eth0

DHCP


6.14.2. IP アドレスの確認方法

Armadillo-X2 の IP アドレスを確認するには、ip addr コマンドを使用します。

[armadillo ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:11:0c:00:0b:79 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.84/16 brd 172.16.255.255 scope global dynamic noprefixroute eth0
       valid_lft 28786sec preferred_lft 28786sec
    inet6 fe80::e9c0:7b3c:c0c9:3c4/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

図6.144 IP アドレスの確認


inet となっている箇所が IP アドレスです。 特定のインターフェースのみを表示したい場合は、以下のようにします。

[armadillo ~]# ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:11:0c:00:0b:79 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.84/16 brd 172.16.255.255 scope global dynamic noprefixroute eth0
       valid_lft 28656sec preferred_lft 28656sec
    inet6 fe80::e9c0:7b3c:c0c9:3c4/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

図6.145 IP アドレス(eth0)の確認


6.14.3. ネットワークの設定方法

Armadillo-X2 では、通常の Linux システムと同様、ネットワークインターフェースの設定は NetworkManager を使用します。 NetworkManager はすべてのネットワーク設定をコネクションとして管理します。コネクションには「どのようにネットワークへ接続するか」、 「どのようにネットワークを作成するか」を記述し、 /etc/NetworkManager/system-connections/ に保存します。 また、1つのデバイスに対して複数のコネクションを保存することは可能ですが、1つのデバイスに対して有効化にできるコネクションは1つだけです。

NetworkManager は、従来の /etc/network/interfaces を使った設定方法もサポートしていますが、本書では nmcli を用いた方法を中心に紹介します。

6.14.3.1. nmcli について

nmcli は NetworkManager を操作するためのコマンドラインツールです。 図6.146「nmcli のコマンド書式」nmcli の書式を示します。このことから、 nmcli は「オブジェクト (OBJECT) というものが存在し、 それぞれのオブジェクトに対してコマンド (COMMAND) を実行する。」という書式でコマンドを入力することがわかります。 また、オブジェクトそれぞれに help が用意されていることもここから読み取れます。

nmcli [ OPTIONS ] OBJECT { COMMAND | help }

図6.146 nmcli のコマンド書式


6.14.4. nmcli の基本的な使い方

ここでは nmcli の、基本的な使い方を説明します。

6.14.4.1. コネクションの一覧

登録されているコネクションの一覧を確認するには、次のようにコマンドを実行します。 [14]

[armadillo ~]# nmcli connection
NAME                UUID                                  TYPE      DEVICE
Wired connection 1  a6f99120-b4ed-3823-a6f0-0491d4b6101e  ethernet  eth0

図6.147 コネクションの一覧


表示された NAME については、以降 [ID] として利用することができます。

6.14.4.2. コネクションの有効化・無効化

コネクションを有効化するには、次のようにコマンドを実行します。

[armadillo ~]# nmcli connection up [ID]

図6.148 コネクションの有効化


コネクションを無効化するには、次のようにコマンドを実行します。

[armadillo ~]# nmcli connection down [ID]

図6.149 コネクションの無効化


6.14.4.3. コネクションの作成

コネクションを作成するには、次のようにコマンドを実行します。

[armadillo ~]# nmcli connection add con-name [ID] type [type] ifname [interface name]

図6.150 コネクションの作成


[ID] にはコネクションの名前(任意)、[type] には ethernet、wifi といった接続タイプ、 [interfacename] にはインターフェース名(デバイス)を入力します。 これにより /etc/NetworkManager/system-connections/ に[ID]の名前でコネクション ファイルが作成されます。このファイルを vi などで編集し、コネクションを修正する ことも可能です。

Armadillo-X2 を再起動したときにコネクションファイルが消えてしまわないように、 persist_file コマンドで永続化する必要があります。 persist_file コマンドに関する詳細は「persist_file について」を参照してください。

[armadillo ~]# persist_file /etc/NetworkManager/system-connections/<コネクションファイル名>

図6.151 コネクションファイルの永続化


[注記]

別の Armadillo-X2 からコネクションファイルをコピーした場合は、コネクションファイルの パーミッションを 600 に設定してください。 600 に設定後、 nmcli c reload コマンドでコネクションファイルを再読込します。

[armadillo ~]# chmod 600 /etc/NetworkManager/system-connections/<コネクションファイル名>
[armadillo ~]# persist_file /etc/NetworkManager/system-connections/<コネクションファイル名>
[armadillo ~]# nmcli c reload

swu イメージを使用してコネクションファイルのアップデートを行う場合は、 swu イメージに含めるコネクションファイルのパーミッションを 600 に設定してから、 swu イメージを作成してください。 アップデート実行時には swu イメージ作成時のパーミッションが維持されるため、 上記のコマンド実行手順は不要です。 swu イメージに関しては 「アップデート機能について」 を参考にしてください。

6.14.4.4. コネクションの削除

コネクションを削除するには、次のようにコマンドを実行します。

[armadillo ~]# nmcli connection delete [ID]

図6.152 コネクションの削除


これにより /etc/NetworkManager/system-connections/ のコネクションファイルも同時に削除されます。 コネクションの作成と同様に persist_file コマンドで永続化する必要があります。

[armadillo ~]# persist_file -d /etc/NetworkManager/system-connections/<コネクションファイル名>

図6.153 コネクションファイル削除時の永続化


6.14.4.5. 固定IPアドレスに設定する

表6.15「固定 IP アドレス設定例」の内容に設定する例を、 図6.154「固定 IP アドレス設定」に示します。

表6.15 固定 IP アドレス設定例

項目設定

IP アドレス

192.0.2.10

マスク長

24

デフォルトゲートウェイ

192.0.2.1


[armadillo ~]# nmcli connection modify [ID] \
ipv4.method manual ipv4.addresses 192.0.2.10/24 ipv4.gateway 192.0.2.1

図6.154 固定 IP アドレス設定


6.14.4.6. DNS サーバーを指定する

DNS サーバーを指定する例を、図6.155「DNS サーバーの指定」に示します。

[armadillo ~]# nmcli connection modify [ID] ipv4.dns 192.0.2.1

図6.155 DNS サーバーの指定


6.14.4.7. DHCP に設定する

DHCP に設定する例を、図6.156「DHCP の設定」に示します。

[armadillo ~]# nmcli connection modify [ID] ipv4.method auto

図6.156 DHCP の設定


[注記]

-ipv4.addresses のように、プロパティ名の先頭に "-" を付けることで設 定したプロパティを削除することができます。反対に "+" を付けることで プロパティを追加することができます。

6.14.4.8. コネクションの修正を反映する

有効化されているコネクションを修正した場合、かならず修正したコネクションを再 度有効化してください。

[armadillo ~]# nmcli connection down [ID]
[armadillo ~]# nmcli connection up [ID]

図6.157 コネクションの修正の反映


6.14.4.9. デバイスの一覧

デバイスの一覧(デバイス名、タイプ、状態、有効なコネクション)を確認するには、次のようにコマン ドを実行します。

[armadillo ~]# nmcli device
DEVICE  TYPE      STATE        CONNECTION
eth0    ethernet  connected    Wired connection 1
lo      loopback  unmanaged    --

図6.158 デバイスの一覧


6.14.4.10. デバイスの接続

デバイスを接続するには、次のようにコマンドを実行します。

[armadillo ~]# nmcli device connect [ifname]

図6.159 デバイスの接続


[注記]

デバイスを接続するには、接続しようとしているデバイスの有効なコネク ションが必要です。"Error: neither a valid connection nor device given" というメッセージが表示された場合には、 nmcli connection など で有効なコネクションがあるかを確認してください。

6.14.4.11. デバイスの切断

デバイスを切断するには、次のようにコマンドを実行します。

[armadillo ~]# nmcli device disconnect [ifname]

図6.160 デバイスの切断


6.14.5. 有線 LAN

有線 LAN で正常に通信が可能か確認します。設定を変更した場合、必ず変更したインターフェースを再度有効化してください。

同じネットワーク内にある通信機器と PING 通信を行います。以下の例では、通信機器が「192.0.2.20」という IP アドレスを持っていると想定しています。

[armadillo ~]# ping -I eth0 -c 3 192.0.2.20 1
PING 192.0.2.20 (192.0.2.20): 56 data bytes
64 bytes from 192.0.2.20: seq=0 ttl=64 time=3.056 ms
64 bytes from 192.0.2.20: seq=1 ttl=64 time=1.643 ms
64 bytes from 192.0.2.20: seq=2 ttl=64 time=1.633 ms

--- 192.0.2.20 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 1.633/2.110/3.056 ms

図6.161 有線 LAN の PING 確認


1

-I オプションでインターフェースを指定できます。eth1 を確認する場合は -I eth1 としてください。

[注記]

有線 LAN 以外のインターフェースが有効化されている場合、ルーティングの設定などにより、ネットワーク通信に有線 LAN が使用されない場合があります。 設定を必ず確認してください。確実に有線 LAN の接続確認をする場合は、有線 LAN 以外のインターフェースを無効化してください。

6.15. ストレージの操作

ここでは、microSDHC カードを接続した場合を例にストレージの使用方法を説明します。 以降の説明では、共通の操作が可能な場合に、microSD/microSDHC/microSDXCカードを microSD カードと表記します。

6.15.1. ストレージ内にアクセスする

Linux では、アクセス可能なファイルやディレクトリは、一つの木構造にまとめられています。あるストレージデバイスのファイルシステムを、 この木構造に追加することを、マウントするといいます。マウントを行うコマンドは、 mount です。

mount コマンドの典型的なフォーマットは、次の通りです。

mount [-t fstype] device dir

図6.162 mount コマンド書式


-t オプションに続く fstype には、ファイルシステムタイプを指定します。ファイルシステムタイプの指定は省略可能です。 省略した場合、mount コマンドはファイルシステムタイプを推測します。この推測は必ずしも適切なものとは限りませんので、 事前にファイルシステムタイプが分かっている場合は明示的に指定してください。 FAT32 ファイルシステムの場合は vfat 、EXT3 ファイルシステムの場合は ext3 を指定します。

[注記]

通常、購入したばかりの microSDHC カードは FAT32 または exFAT ファイルシステムでフォーマットされています。

device には、ストレージデバイスのデバイスファイル名を指定します。microSD カードのパーティション1の場合は /dev/mmcblk1p1 、 パーティション2の場合は /dev/mmcblk1p2 となります。

dir には、ストレージデバイスのファイルシステムをマウントするディレクトリを指定します。

SD インターフェース (CON1) に microSD カードを挿入し、以下に示すコマンドを実行すると、 /mnt ディレクトリに microSD カードのファイルシステムをマウントすることができます。 microSDカード内のファイルは、/mnt ディレクトリ以下に見えるようになります。

[armadillo ~]# mount -t vfat /dev/mmcblk1p1 /mnt
[armadillo ~]# ls /mnt
  :
  :

図6.163 ストレージのマウント


6.15.2. ストレージを安全に取り外す

ストレージを安全に取り外すには、アンマウントという作業が必要です。アンマウントを行うコマンドは、 umount です。 オプションとして、アンマウントしたいデバイスがマウントされているディレクトリを指定します。

[armadillo ~]# umount /mnt

図6.164 ストレージのアンマウント


6.15.3. ストレージのパーティション変更とフォーマット

通常、購入したばかりの microSD カードや USB メモリは、一つのパーティションを持ち、FAT32ファイルシステムでフォーマットされています。

パーティション構成を変更したい場合、 fdisk コマンドを使用します。 fdisk コマンドの使用例として、 一つのパーティションで構成されている microSD カードのパーティションを、2つに分割する例を図6.165「fdiskコマンドによるパーティション変更」に示します。 一度、既存のパーティションを削除してから、新たにプライマリパーティションを二つ作成しています。先頭のパーティションには 100MByte、 二つめのパーティションに残りの容量を割り当てています。先頭のパーティションは /dev/mmcblk1p1 、二つめは /dev/mmcblk1p2 となります。

[armadillo ~]# fdisk /dev/mmcblk1

Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-15138815, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-15138815, default 15138815): +100M

Created a new partition 1 of type 'Linux' and of size 100 MiB.

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (206848-15138815, default 206848):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (206848-15138815, default 15138815):

Created a new partition 2 of type 'Linux' and of size 7.1 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
[  305.798606]  mmcblk1: p1 p2
Syncing disks.

図6.165 fdiskコマンドによるパーティション変更


FAT32 ファイルシステムでストレージデバイスをフォーマットするには、 mkfs.vfat コマンドを使用します。 また、EXT2 や EXT3、EXT4 ファイルシステムでフォーマットするには、mkfs.ext2mkfs.ext3mkfs.ext4 コマンドを使用します。 microSD カードのパーティション1を EXT4 ファイルシステムでフォーマットするコマンド例を次に示します

[armadillo ~]# mkfs.ext4 /dev/mmcblk1p1

図6.166 EXT4 ファイルシステムの構築


6.16. ボタンやキーを扱う

buttond サービスを使用することで、ボタンやキー入力をトリガーとする処理を簡単に実装できます。

/etc/atmark/buttond.confBUTTOND_ARGS を指定することで、動作を指定することができます:

  • --short <key> --action "command" : 短押しの設定。キーを 1 秒以内に離せば短押しと認識し "command"を実行します。認識する最大時間は --time <time_ms> オプションで変更可能です。
  • --long <key> --action "command" : 長押しの設定。キーを 5 秒押し続けたタイミングで "command" を実行します。長押しと認識する最低時間は --time <time_ms> オプションで変更可能です。
  • 1 つのキーに対して複数の設定が可能です。長押しの設定が複数ある場合、押したままの状態だと一番長い時間に設定されている "command" を実行します。途中でキーを離した場合は、キーを離した時間に応じた "command" を実行します。(例:buttond --short <key> --action "cmd1" --long <key> --time 2000 --action "cmd2" --long <key> --time 10000 --action "cmd3" <file> を実行した場合、1 秒以内に離すと "cmd1"、2 秒以上 10 秒以内に離すと "cmd2"、10 秒を越えたら "cmd3" を実行します)。

    • 短押し設定を複数指定する場合、時間の短い設定を先に指定してください。 0.5秒、1 秒を設定したい場合、1 秒 → 0.5 秒の順番で指定すると 0.5秒が無視されます。
  • --exit-timeout <time_ms> : 設定した時間の後に buttond を停止します。起動時のみに対応したい場合に使えます。
  • キーの設定の --exit-after オプション : キーのコマンドを実行した後に buttond を停止します。キーの対応を一回しか実行しないように使えます。

6.16.1. SW1 の短押しと長押しの対応

以下にデフォルトを維持したままで SW1 の短押しと長押しのそれぞれの場合にコマンドを実行させる例を示します。

[armadillo ~]# vi /etc/atmark/buttond.conf 1
BUTTOND_ARGS="$BUTTOND_ARGS --short prog1 --action 'date >> /tmp/shortpress'"
BUTTOND_ARGS="$BUTTOND_ARGS --long prog1 --time 5000 --action 'date >> /tmp/longpress'"
[armadillo ~]# persist_file /etc/atmark/buttond.conf 2
[armadillo ~]# rc-service buttond restart 3
buttond          | * Stopping button watching daemon ...                                         [ ok ]
buttond          | * Starting button watching daemon ...                                         [ ok ]
[armadillo ~]# cat /tmp/shortpress 4
Tue Mar 22 17:16:42 JST 2022
Tue Mar 22 17:16:43 JST 2022
[armadillo ~]# cat /tmp/longpress
Tue Mar 22 17:16:48 JST 2022

図6.167 buttond で SW1 を扱う


1

buttond の設定ファイルを編集します。この例では、短押しの場合 /tmp/shotpress に、5 秒以上の長押しの場合 /tmp/longpress に日付を出力します。

2

設定ファイルを保存します。

3

buttond サービスを再起動させます。ここでは再起動後短押しを 2 回、長押しを 1 回行ったとします。

4

押された回数を確認します。

6.16.2. USB キーボードの対応

USB キーボードや他の入力デバイスにも対応できます。

  1. デバイスを接続してから、 buttond でデバイス名とキーコードを確認します。

    [armadillo ~]# buttond -vvv /dev/input/* /dev/input/by-*/* 1
    Skipping directory /dev/input/by-id
    Skipping directory /dev/input/by-path
    [78972.042] /dev/input/event2 4 4 458976: non-keyboard event ignored
    [78972.042] /dev/input/event2 LEFTCTRL (29) pressed: ignored 2
    [78972.042] /dev/input/by-id/usb-0566_3029-event-kbd 4 4 458976: non-keyboard event ignored
    [78972.042] /dev/input/by-id/usb-0566_3029-event-kbd LEFTCTRL (29) pressed: ignored
    [78972.042] /dev/input/by-path/platform-xhci-hcd.1.auto-usb-0:1:1.0-event-kbd 4 4 458976: non-keyboard event ignored
    [78972.042] /dev/input/by-path/platform-xhci-hcd.1.auto-usb-0:1:1.0-event-kbd LEFTCTRL (29) pressed: ignored
    [78972.130] /dev/input/event2 4 4 458976: non-keyboard event ignored
    [78972.130] /dev/input/event2 LEFTCTRL (29) released: ignored
    [78972.130] /dev/input/by-id/usb-0566_3029-event-kbd 4 4 458976: non-keyboard event ignored
    [78972.130] /dev/input/by-id/usb-0566_3029-event-kbd LEFTCTRL (29) released: ignored
    [78972.130] /dev/input/by-path/platform-xhci-hcd.1.auto-usb-0:1:1.0-event-kbd 4 4 458976: non-keyboard event ignored
    [78972.130] /dev/input/by-path/platform-xhci-hcd.1.auto-usb-0:1:1.0-event-kbd LEFTCTRL (29) released: ignored

    図6.168 buttond で USB キーボードのイベントを確認する


    1

    buttond-vvv で冗長出力にして、すべてのデバイスを指定します。

    2

    希望のキーを押すと、LEFTCTRL が三つのパスで認識されました。 一番安定する by-id のパスを控えておきます。

  2. USB デバイスを外すこともありますので、-i (inotify) で管理されてる入力デバイスとして追加します。 そうしないとデバイスを外したときにbuttondが停止します。

    [armadillo ~]# vi /etc/atmark/buttond.conf
    BUTTOND_ARGS="$BUTTOND_ARGS -i /dev/input/by-id/usb-0566_3029-event-kbd"
    BUTTOND_ARGS="$BUTTOND_ARGS --short LEFTCTRL --action 'podman_start button_pressed_container'"
    [armadillo ~]# persist_file /etc/atmark/buttond.conf
    [armadillo ~]# rc-service buttond restart

    図6.169 buttond で USB キーボードを扱う


6.16.3. Armadillo 起動時にのみボタンに反応する方法

Armadillo 起動時にのみ、例として SW1 の長押しに反応する方法を紹介します。

/etc/local.d/boot_switch.start に稼働期間を指定した buttond を起動させる設定を記載します。

buttond が起動してから 10秒以内に SW1 を一秒以上長押しすると myapp のコンテナの親プロセスに USR1 信号を送ります(アプリケーション側で信号を受信して、デバッグモードなどに切り替える想定です)。 SW1 が Armadillo 起動前に押された場合は、buttond の起動一秒後に実行されます。

[armadillo ~]# vi /etc/local.d/boot_switch.start
#!/bin/sh

buttond /dev/input/by-path/platform-gpio-keys-event \ 1
        --exit-timeout 10000 \ 2
        --long PROG1 --time 1000 --exit-after \ 3
                --action "podman exec myapp kill -USR1 1" & 4
[armadillo ~]# chmod +x /etc/local.d/boot_switch.start
[armadillo ~]# persist_file /etc/local.d/boot_switch.start

図6.170 buttond で SW1 を Armadillo 起動時のみ受け付ける設定例


1

SW1 の入力を /dev/input/by-path/platform-gpio-keys-event ファイルの PROG1 として認識できます。

2

buttond 起動後 10 秒経過すると終了します。

3

SW1 を一度検知した後すぐに終了します。

4

サービスとして動作させる必要がないため & を付けてバックグラウンド起動します。

6.17. 動作中の Armadillo の温度を測定する

この章では、Armadillo Base OS 搭載製品を組み込んだユーザー製品の熱設計時に役立つ温度プロファイラツールである「atmark-thermal-profiler」について紹介します。

6.17.1. 温度測定の重要性

Armadillo は製品ごとに動作温度範囲が設定されていますが、それらはあくまでも標準筐体に放熱材と共に取り付けて使用した場合の目安であり、実運用時には自作の筐体の使用や放熱の有無などで記載のスペック通りにならない場合があります。 また、 Armadillo には CPU または SoC が特定の温度以上になると、自動的にシャットダウンするサーマルシャットダウン機能が搭載されています。 そのため、現実的には Armadillo を組み込んだ製品を運用時と同等の環境で動作させつつ、実際に温度を計測して実運用時の CPU 及び SoC 温度がどの程度まで上がるか、サーマルシャットダウンは起こらないかを確かめる必要があります。

Armadillo Base OS 搭載製品では、動作中の Armadillo の各種温度等を取得しCSV形式で出力する atmark-thermal-profiler を利用することができますので、温度測定に役立てることができます。

6.17.2. atmark-thermal-profiler をインストールする

atmark-thermal-profiler は apk パッケージで公開されていますので、apk add コマンドでインストールすることが可能です。

[armadillo ~]# apk upgrade
[armadillo ~]# apk add atmark-thermal-profiler

図6.171 atmark-thermal-profiler をインストールする


[警告]

atmark-thermal-profiler はデバッグ(開発)用途で温度情報を収集及び解析するツールです。 atmark-thermal-profiler は、他の apk パッケージと同様に persist_file -a コマンドで永続的にインストールしておくことが可能ですが、 ログの保存のために Armadillo が起動している間 eMMC への書き込みを続けるので、 Armadillo を組み込んだ製品の運用時に動かしたままにしておくことは推奨しません。

atmark-thermal-profiler を永続的にインストールする場合は、運用時には必ず削除してください。

6.17.3. atmark-thermal-profiler を実行・停止する

図6.172「atmark-thermal-profiler を実行する」に示すコマンドを実行することで、 atmark-thermal-profiler が動作を開始します。

[armadillo ~]# rc-service atmark-thermal-profiler start

図6.172 atmark-thermal-profiler を実行する


図6.173「atmark-thermal-profiler を停止する」に示すコマンドを実行することで、 atmark-thermal-profiler が動作を停止します。

[armadillo ~]# rc-service atmark-thermal-profiler stop

図6.173 atmark-thermal-profiler を停止する


6.17.4. atmark-thermal-profiler が出力するログファイルを確認する

atmark-thermal-profiler は、インストール直後から自動的に温度やCPU負荷率、Load Averageなどの情報を30秒に1度の周期で集め、/var/log/thermal_profile.csvに追記していきます。

[armadillo ~]# head /var/log/thermal_profile.csv
DATE,ONESHOT,CPU_TMEP,SOC_TEMP,LOAD_AVE,CPU_1,CPU_2,CPU_3,CPU_4,CPU_5,USE_1,USE_2,USE_3,USE_4,USE_5
2022-11-30T11:11:05+09:00,0,54,57,0.24,/usr/sbin/rngd -b -p /run/rngd.pid -q -O jitter:buffer_size:4133 -O jitter:refill_thresh:4133 -O jitter:thread_count:1,/usr/sbin/chronyd -f /etc/chrony/chrony.conf,[kworker/1:3H-kb],podman network inspect podman,/usr/sbin/NetworkManager -n,22,2,2,0,0,
: (省略)

図6.174 ログファイルの内容例


thermal_profile.csv の1行目はヘッダ行です。 各列についての説明を表6.16「thermal_profile.csvの各列の説明」に記載します。

表6.16 thermal_profile.csvの各列の説明

ヘッダ 説明

DATE

その行のデータ取得日時です。 "年-月-日T時:分:秒+タイムゾーン" の形式で出力されます。

ONESHOT

この列が1の行のデータは、サーマルシャットダウンを含むシャットダウンが実行された時に取得されたことを示します。

CPU_TEMP

計測時点の CPU 温度を示します。単位は℃です。

SOC_TEMP

計測時点の SoC 温度を示します。単位は℃です。製品よっては非対応で、その場合は空白になります。

LOAD_AVE

計測時点から直近1分間のLoad Averageです。

CPU_1

計測時点のCPU使用率1位のプロセスです。

CPU_2

計測時点のCPU使用率2位のプロセスです。

CPU_3

計測時点のCPU使用率3位のプロセスです。

CPU_4

計測時点のCPU使用率4位のプロセスです。

CPU_5

計測時点のCPU使用率5位のプロセスです。

USE_1

計測時点のCPU使用率1位のプロセスのCPU使用率です。

USE_2

計測時点のCPU使用率2位のプロセスのCPU使用率です。

USE_3

計測時点のCPU使用率3位のプロセスのCPU使用率です。

USE_4

計測時点のCPU使用率4位のプロセスのCPU使用率です。

USE_5

計測時点のCPU使用率5位のプロセスのCPU使用率です。


6.17.5. 温度測定結果の分析

atmark-thermal-profiler を使用して得られたログファイルの内容を分析してみます。

6.17.5.1. サーマルシャットダウン温度の確認

予め、使用している Armadillo が何℃でサーマルシャットダウンするか確認しておきます。 ここでは、 Armadillo Base OS を搭載している Armadillo-IoT ゲートウェイ G4 を例とします。 他の製品では得られる結果が異なる場合があることに注意してください。

[armadillo ~]# cat /sys/class/thermal/thermal_zone0/trip_point_1_temp
105000 1
[armadillo ~]# cat /sys/class/thermal/thermal_zone1/trip_point_1_temp
105000 2

図6.175 サーマルシャットダウン温度の確認(Armadillo-IoT ゲートウェイ G4を例に)


1

CPU のサーマルシャットダウン温度です。ミリ℃で表記されているので、105℃でサーマルシャットダウンすることがわかります。

2

SoC のサーマルシャットダウン温度です。ミリ℃で表記されているので、105℃でサーマルシャットダウンすることがわかります。

6.17.5.2. 温度測定結果のグラフ化

atmark-thermal-profiler が出力するログ(thermal_profile.csv)はCSVファイルなので、各種表計算ソフトでインポートしてグラフ化することが可能です。 これにより Armadillo 動作中の温度の変化が可視化され、得られる情報が見やすくなります。

図6.176「Armadillo-IoT ゲートウェイ G4で取得した温度のグラフ」は Armadillo-IoT ゲートウェイ G4上で一定期間 atmark-thermal-profiler を実行して取得した thermal_profile.csv を Google スプレッドシートでグラフ化したものです。 例のために、途中で stress-ng コマンドを実行して CPU に負荷を与えた後、 stress-ng コマンドを停止して CPU と SoC の温度が下がるのを待った際のデータです。

images/abos-images/thermal_profiler_graph.png

図6.176 Armadillo-IoT ゲートウェイ G4で取得した温度のグラフ


グラフの縦軸は温度(℃)で、横軸は時間です。青い線は CPU の温度、赤い線は SoC の温度を表しています。 このグラフと、「サーマルシャットダウン温度の確認」で得たサーマルシャットダウン温度を見比べると、 CPU に負荷をかけた際であっても SoC の温度は 60℃ 前後ほどまでしか上がらず、 この条件で動く Armadillo が温度的にどれほど余裕を持っているかをひと目で確認できます。

6.17.5.3. CPU使用率の確認

atmark-thermal-profiler は、時間毎の温度だけでなく CPU 使用率と CPU 使用率の高いプロセスについても取得して記録します。 CPU 使用率については thermal_profile.csv の CPU_1〜CPU_5 列と、 USE_1〜USE_5 列を参照してください。 各列について詳しくは表6.16「thermal_profile.csvの各列の説明」にまとまっています。

一般的に CPU 使用率が高くなると、 CPU 周辺の温度も高くなります。 そのため、測定した温度が高い場合は、 CPU 使用率の高いプロセスに注目して、 CPU を無駄に使用している意図しない処理が行なわれていないかなどを確認することをおすすめします。

6.17.6. Armadillo Twin から Armadillo の温度を確認する

atmark-thermal-profiler の他に、Armadillo Twin からも温度や CPU 負荷率等の情報を確認することができます。 詳細は Armadillo Twin ユーザーマニュアル 「デバイス監視アラートを管理する」 をご確認ください。

6.17.7. 温度センサーの仕様

Armadillo-X2の温度センサーは、i.MX 8M PlusのTMU(Thermal Monitoring Unit)を利用しています。CPU(Arm Cortex-A53)周辺温度と、SoC(ANAMIX内部)温度を測定することができます。

起動直後の設定では、ARMまたはSoCの測定温度が 105°C以上になった場合、Linuxカーネルはシステムを停止します。

機能
  • 測定温度範囲: -40〜+105°C
sysfs thermalクラスディレクトリ
  • /sys/class/thermal/thermal_zone0 (CPU)
  • /sys/class/thermal/thermal_zone1 (SoC)

6.18. Armadillo Base OS をアップデートする

Armadillo Base OS は SWUpdate によってアップデートすることができます。

アップデートする際には、rootfs ファイルシステムにインストールされたファイルをすべて消して、アップデートの中身と /etc/swupdate_preserve_files に記載されているファイルで新しい rootfs を作ります。「swupdate_preserve_files について」 を参照してください。

アップデートでファイルを削除してしまった場合に abos-ctrl mount-old で前のシステムを read-only でマウントして、 削除されたファイルをコピーすることもできます。

6.19. ロールバック状態を確認する

Armadillo Base OS の ルートファイルシステムが壊れて起動できなくなった場合に自動的に前のバージョンで再起動します。

自分で確認する必要がある場合に abos-ctrl status でロールバックされてるかどうかの確認ができます。

必要な場合(例えば、自分のアプリケーションがアップデート直後に問題があった場合)、 abos-ctrl rollback で手動のロールバックも可能です。ロールバックにエラーがなければ、再起動してロールバックを完了します。

なお、/var/at-log/atlog に切り替えの際に必ずログを書きますので、調査の時に使ってください。

[armadillo ~]# cat /var/at-log/atlog
Mar 17 14:51:35 armadillo NOTICE swupdate: Installed update to /dev/mmcblk2p2: \
extra_os.sshd: unset -> 1, extra_os.initial_setup: unset -> 1
Mar 17 16:48:52 armadillo NOTICE swupdate: Installed update to /dev/mmcblk2p1: \
boot: 2020.04-at5 -> 2020.04-at6, base_os: 3.15.0-at.3 -> 3.15.0-at.4
Mar 17 17:42:15 armadillo NOTICE swupdate: Installed update to /dev/mmcblk2p2: \
other_boot: 2020.04-at5 -> 2020.04-at6, container: unset -> 1, extra_os.container: unset -> 1

図6.177 /var/at-log/atlog の内容の例


6.20. Armadillo 起動時にコンテナの外でスクリプトを実行する

起動時に何かスクリプトを走らせるためにはコンテナとして実行することを推奨します。 「コンテナ起動設定ファイルを作成する」 を参照してください。

コンテナで実行不可能な場合に、「local」サービスを使うことができます: /etc/local.d ディレクトリに .start ファイルを置いておくと起動時に実行されて、 .stop ファイルは終了時に実行されます。

[armadillo ~]# vi /etc/local.d/date_test.start 1
#!/bin/sh

date > /tmp/boottest
[armadillo ~]# chmod +x /etc/local.d/date_test.start 2
[armadillo ~]# persist_file /etc/local.d/date_test.start 3
[armadillo ~]# reboot
: (省略)
[armadillo ~]# cat /tmp/boottest 4
Tue Mar 22 16:36:12 JST 2022

図6.178 local サービスの実行例


1

スクリプトを作ります。

2

スクリプトを実行可能にします。

3

スクリプトを保存して、再起動します。

4

実行されたことを確認します。

6.21. u-boot の環境変数の設定

u-boot の環境変数を変更するには /boot/uboot_env.d/ ディレクトリに環境変数が書かれた設定ファイルを配置します。

ファイルの構文は fw_setenv が扱うことができるもので、以下のとおりです:

  • # で始まる行はコメントと扱われる為、無視されます。また、 環境変数への代入を示す = がない場合も無視されます。
  • [変数]=[値] で変数を設定します。スペースや引用符を含め他の文字は有効ですので、変数の名前と値に不要な文字を入れないように注意してください。
  • [変数]= で変数を消します。値がない場合に変数が消去されます。

このファイルによるアップデート内容は swupdate でアップデートする際に適用されます。

実行中のシステムに影響がありませんので、設定ファイルを swupdate で転送しない場合はファイル永続化後に fw_setenv -s /boot/uboot_env.d/[ファイル名] で変数を書き込んでください。

swupdate でファイルを転送した場合には、変数はすぐに利用されます。

[armadillo ~]# vi /boot/uboot_env.d/no_prompt 1
# bootdelay を -2 に設定することで u-boot のプロンプトを無効化します
bootdelay=-2
[armadillo ~]# persist_file -v /boot/uboot_env.d/no_prompt 2
'/boot/uboot_env.d/no_prompt' -> '/mnt/boot/uboot_env.d/no_prompt'
[armadillo ~]# fw_setenv -s /boot/uboot_env.d/no_prompt 3
Environment OK, copy 0
[armadillo ~]# fw_printenv | grep bootdelay 4
bootdelay=-2

図6.179 uboot_env.d のコンフィグファイルの例


1

コンフィグファイルを生成します。

2

ファイルを永続化します。

3

変数を書き込みます。

4

書き込んだ変数を確認します。

[ティップ]

mkswu バージョン 4.4 以降が必要です。必要な場合はアップデートしてください。

[ATDE ~]$ sudo apt update && sudo apt upgrade

書き方は、 /usr/share/mkswu/examples/uboot_env.desc を参考にしてください。

[警告]

「ブートローダーをビルドする」 の際に u-boot のデフォルトを変更した場合や、u-boot のプロンプトで「setenv」や「saveenv」を実行しても、 /boot/uboot_env.d/00_defaults によって変更がアップデートの際にリセットされます。

00_defaults のファイルは Base OS の一部で更新されることもありますので、変更を望む場合は別のファイルを作って設定してください。 ファイルはアルファベット順で処理されます。 00_defaults にある変数を後のファイルにも設定した場合はそのファイルの値だけが残ります。

主要なu-bootの環境変数を以下に示します。

表6.17 u-bootの主要な環境変数

環境変数説明デフォルト値

console

コンソールのデバイスノードと、UARTのボーレート等を指定します。

ttymxc1,115200

bootcount

起動回数を示します。初回起動時に1となり、起動に失敗する度にインクリメントされます。ユーザーランドのbootcountサービスが起動されると、この値はクリアされます。この値が"bootlimit"を越えた場合はロールバックします。ロールバックの詳細については、「ロールバック(リカバリー)」を参照してください。

1

bootlimit

"bootcount"のロールバックを行うしきい値を指定します。

3

bootdelay

保守モードに遷移するためのキー入力を待つ時間を指定します(単位:秒)。次の値は特別な意味を持ちます。

  • -1: キー入力の有無に関らず保守モードに遷移します。
  • -2: キー入力の有無に関らず保守モードに遷移しません。

2

image

Linuxカーネルイメージファイルのパスです。"mmcdev"で指定されたデバイスの、"mmcpart"で指定されたパーティションのルートディレクトリからの相対パスで指定します。

boot/Image

fdt_file

DTBファイルのパスです。"mmcdev"で指定されたデバイスの、"mmcpart"で指定されたパーティションのルートディレクトリからの相対パスで指定します。

boot/armadillo.dtb

overlays_list

DT overlayの設定ファイルのパスです。"mmcdev"で指定されたデバイスの、"mmcpart"で指定されたパーティションのルートディレクトリからの相対パスで指定します。DT overlayの詳細については、「DT overlay によるカスタマイズ」を参照してください。

boot/overlays.txt

mmcautodetect

mmcデバイスの自動検出機能の有効/無効を指定します。yesを指定した場合のみ、u-bootが起動されたmmcデバイスが自動的にmmcdevとして利用されます。

yes

mmcdev

"image"や"fdt_file"で指定されたファイルが配置してあるmmcデバイスのインデックスを指定します。インデックスとmmcデバイスの対応は次の通りです。

  • 1: microSD/microSDHC/microSDXC カード
  • 2: eMMC

"mmcautodetect"にyesが指定されている場合は、u-bootの起動時に上書きされます。

2

mmcpart

"image"や"fdt_file"で指定されたファイルが配置してある、"mmcdev"で指定されたmmcデバイスのパーティション番号を指定します。"mmcautodetect"にyesが指定されている場合は、u-bootの起動時に上書きされます。

1

mmcroot

ルートファイルシステムが配置されているデバイスノードと、マウントオプションを指定します。"mmcautodetect"にyesが指定されている場合は、u-bootの起動時に上書きされます。overlayfsが正しく機能しなくなる場合があるので、roの指定は変更しないでください。

/dev/mmcblk2p1 rootwait ro

optargs

Linuxカーネル起動時パラメータを指定します。"quiet"を削除すると、コンソールに起動ログが出力されるようになりますが、起動時間が長くなります。 nokaslrを削除すると、KASLR(Kernel Adress Space Layout Randomization)が有効となり、Linuxカーネルの仮想アドレス空間がランダム化されます。

quiet nokaslr

loadaddr

LinuxカーネルがRAMにロードされる物理アドレスを指定します。

0x40480000

fdt_addr

DTBがRAMにロードされる物理アドレスを指定します。

0x45000000

overlay_addr

DT overlayのワーク領域として利用されるRAMの物理アドレスを指定します。

0x45020000


6.22. SDブートの活用

本章では、microSDカードから直接起動(以降「SDブート」と表記します)する手順を示します。 SDブートを活用すると、microSDカードを取り替えることでシステムイメージを変更することができます。 本章に示す手順を実行するためには、容量が8Gbyte以上のmicroSDカードを必要とします。

[ティップ]

SDブートを行った場合、ブートローダーの設定は microSDカード に保存されます。

6.22.1. ブートディスクの作成

  1. ブートディスクイメージのビルドします

    「Alpine Linux ルートファイルシステムをビルドする」 で説明されているソースツリー alpine/build-rootfs にあるスクリプト build_image「ブートローダーをビルドする」 でビルドした imx-boot_armadillo_x2 を利用します。

    VPU や NPU も使用する場合は、 「VPU や NPU を使用する」 で用意した imx_lib.img も組み込めます。

    [PC ~/build-rootfs-[VERSION]]$ sudo ./build_image.sh \
            --boot ~/imx-boot-[VERSION]/imx-boot_armadillo_x2 \
            --firmware ~/at-imxlibpackage/imx_lib.img
    : (省略)
    [PC ~/build-rootfs-[VERSION]]$ ls baseos-x2*img
    baseos-x2-[VERSION].img
  2. ATDE に microSD カードを接続します。詳しくは「取り外し可能デバイスの使用」を参考にしてください。
  3. microSD カードのデバイス名を確認します

    [ATDE ~]$ ls /dev/sd?
    /dev/sda  /dev/sdb
    [ATDE ~]$ sudo fdisk -l /dev/sdb
    Disk /dev/sdb: 7.22 GiB, 7751073792 bytes, 15138816 sectors
    Disk model: SD/MMC
    : (省略)
  4. microSD カードがマウントされている場合、アンマウントします。

    [ATDE ~]$ mount
    : (省略)
    /dev/sdb1 on /media/52E6-5897 type ext2 (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0077,codepage=cp437,iocharset=utf8,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks)
    [ATDE ~]$ sudo umount /dev/sdb1

    図6.180 自動マウントされたmicroSDカードのアンマウント


  5. ブートディスクイメージの書き込み

    [PC ~]$ sudo dd if=~/build-rootfs-[VERSION]/baseos-x2-[VERSION].img \
                    of=/dev/sdb bs=1M oflag=direct status=progress

    microSDカードの性能にもよりますが、書き込みには5分程度かかります。

[ティップ]

microSDカードのパーティション構成は次のようになっています。

表6.18 microSDカードのパーティション構成

パーティション オフセット サイズ 説明

-

0

10MiB

ブートローダー

1

10MiB

300MiB

A/B アップデートのA面パーティション

2

310MiB

300MiB

A/B アップデートのB面パーティション

3

610MiB

50MiB

ログ用パーティション

4

660MiB

200MiB

ファームウェア

5

860MiB

残り

アプリケーション用パーティション


gdiskで確認すると次のようになります。

[PC ~]$ sudo gdisk -l /dev/mmcblk1
GPT fdisk (gdisk) version 1.0.8

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/mmcblk1: 15319040 sectors, 7.3 GiB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 309AD967-470D-4FB2-835E-7963578102A4
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 15319006
Partitions will be aligned on 2048-sector boundaries
Total free space is 20446 sectors (10.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1           20480          634879   300.0 MiB   8300  rootfs_0
   2          634880         1249279   300.0 MiB   8300  rootfs_1
   3         1249280         1351679   50.0 MiB    8300  logs
   4         1351680         1761279   200.0 MiB   8300  firm
   5         1761280        15319006   6.5 GiB     8300  app

6.22.2. SDブートの実行

「ブートディスクの作成」で作成したブートディスクから起動する方法を説明します。

  1. Armadillo-X2に電源を投入する前に、ブートディスクをCON1(SD インターフェース)に挿入します。 また、JP1ジャンパーをショート(SDブートに設定)します。
  2. 電源を投入します。

    U-Boot SPL 2020.04-at7 (May 21 2022 - 11:21:55 +0900)
    rv8803 rtc woken by interrupt
    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-gba76d337e956
    NOTICE:  BL31: Built : 11:08:22, Apr  6 2022
    
    
    U-Boot 2020.04-at7 (May 21 2022 - 11:21:55 +0900)
    
    CPU:   i.MX8MP[8] rev1.1 1600 MHz (running at 1200 MHz)
    CPU:   Industrial temperature grade (-40C to 105C) at 40C
    Model: Atmark-Techno Armadillo X2 Series
    DRAM:    Hold key pressed for tests: t (fast) / T (slow)
    2 GiB
    WDT:   Started with servicing (10s timeout)
    MMC:   FSL_SDHC: 1, FSL_SDHC: 2
    Loading Environment from MMC... OK
    In:    serial
    Out:   serial
    Err:   serial
    
     BuildInfo:
      - ATF
      - U-Boot 2020.04-at7
    
    first boot since power on
    switch to partitions #0, OK
    mmc1 is current device
    flash target is MMC:1
    Net:   eth0: ethernet@30be0000 [PRIME], eth1: ethernet@30bf0000
    Fastboot: Normal
    Saving Environment to MMC... Writing to MMC(1)... OK
    Normal Boot
    Hit any key to stop autoboot:  0
    u-boot=>
  3. ブートディスク上のLinuxカーネルを起動します。

    u-boot=> boot

6.23. Armadilloのソフトウェアをビルドする

ここでは、Armadillo-X2で使用するソフトウェアのビルド方法を説明します。

6.23.1. ブートローダーをビルドする

ここでは、Armadillo-X2向けのブートローダーイメージをビルドする方法を説明します。

  1. ブートローダーのビルドに必要なパッケージのインストール

    次のコマンドを実行します。

    [ATDE ~]$ sudo apt install build-essential git wget gcc-aarch64-linux-gnu libgcc-*-dev-arm64-cross bison flex zlib1g-dev bash python3-pycryptodome python3-pyelftools device-tree-compiler
  2. ソースコードの取得

    Armadillo-X2 ブートローダー から 「ブートローダー ソース」ファイル (imx-boot-[VERSION].tar.gz) を次のようにダウンロードします。

    [ATDE ~]$ wget https://download.atmark-techno.com/armadillo-x2/bootloader/imx-boot-[VERSION].tar.gz
    [ATDE ~]$ tar xf imx-boot-[VERSION].tar.gz
    [ATDE ~]$ cd imx-boot-[VERSION]
  3. ビルド

    次のコマンドを実行します。

    [ATDE ~/imx-boot-[VERSION]]$ make imx-boot_armadillo_x2
    :
    : (省略)
    :
    Second Loader IMAGE:
     sld_header_off         0x58000
     sld_csf_off            0x59020
     sld hab block:         0x401fcdc0 0x58000 0x1020
    make[1]: ディレクトリ '/home/atmark/imx-boot-[VERSION]/imx-mkimage' から出ます
    cp imx-mkimage/iMX8M/flash.bin imx-boot_armadillo_x2

    初めてのビルドの場合、i.MX 8M Plusに必要なファームウェアの EULA への同意を求められます。 内容を確認の上、同意してご利用ください。[15]

    Welcome to NXP firmware-imx-8.11.bin
    
    You need to read and accept the EULA before you can continue.
    
    LA_OPT_NXP_Software_License v19 February 2021
    :
    : (省略)
    :
    Do you accept the EULA you just read? (y/N)
  4. インストール

    ビルドしたブートローダーは、以下に示すどちらかの方法でインストールしてください。

    • swupdate でインストールする

      mkswu の初期化を行った後に 提供されているスクリプトを使ってSWUイメージを作成してください。

      [ATDE ~/imx-boot-[VERSION]]$ echo 'swdesc_boot imx-boot_armadillo_x2' > boot.desc
      [ATDE ~/imx-boot-[VERSION]]$ mkswu boot.desc
      boot.swu を作成しました。

      作成された boot.swu のインストールについては 「SWU イメージのインストール」 を参照ください。

    • 「ブートディスクの作成」 でインストールする

      手順を参考にして、ビルドされた imx-boot_armadillo_x2 を使ってください。

6.23.2. Linux カーネルをビルドする

ここでは、Armadillo-X2向けのLinuxカーネルイメージをビルドする方法を説明します。

[ティップ]

Armadillo-X2では、 基本的にはLinuxカーネルイメージをビルドする必要はありません。 「Alpine Linux ルートファイルシステムをビルドする」の手順を実施することで、 標準のLinuxカーネルイメージがルートファイルシステムに組み込まれます。

標準のLinuxカーネルイメージは、アットマークテクノが提供する linux-at というAlpine Linux用のパッケージに含まれています。

カスタマイズしたLinuxカーネルイメージを利用する場合は、 以下に示す手順を参照してください。

  1. Linuxカーネルのビルドに必要なパッケージのインストール

    次のコマンドを実行します。

    [ATDE ~]$ sudo apt update
    [ATDE ~]$ sudo apt install crossbuild-essential-arm64 bison flex python3-pycryptodome python3-pyelftools zlib1g-dev libssl-dev bc firmware-misc-nonfree wireless-regdb atmark-firmware
  2. ソースコードの取得

    Armadillo-X2 Linuxカーネル から 「Linuxカーネル」ファイル (linux-at-x2-[VERSION].tar) をダウンロードして、次のコマンドを実行します。

    [ATDE ~]$ tar xf linux-at-x2-[VERSION].tar
    [ATDE ~]$ tar xf linux-at-x2-[VERSION]/linux-[VERSION].tar.gz
    [ATDE ~]$ cd linux-[VERSION]
  3. デフォルトコンフィギュレーションの適用

    次のコマンドを実行します。

    [ATDE ~/linux-[VERSION]]$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- x2_defconfig
  4. カーネルコンフィギュレーションの変更

    次のコマンドを実行します。 カーネルコンフィギュレーションの変更を行わない場合はこの手順は不要です。

    [ATDE ~]$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig

    コマンドを実行するとカーネルコンフィギュレーション設定画面が表示されます。 カーネルコンフィギュレーションを変更後、"Exit"を選択して 「Do you wish to save your new kernel configuration? (Press <ESC><ESC> to continue kernel configuration.)」で"Yes"とし、 カーネルコンフィギュレーションを確定します。

     .config - Linux/arm64 5.10.86 Kernel Configuration
     ─────────────────────────────────────────────
      ┌────────── Linux/arm64 5.10.86 Kernel Configuration ───────────┐
      │  Arrow keys navigate the menu.  <Enter> selects submenus ---> (or empty submenus   │
      │  ----).  Highlighted letters are hotkeys.  Pressing <Y> includes, <N> excludes, <M>│
      │  modularizes features.  Press <Esc><Esc> to exit, <?> for Help, </> for Search.    │
      │  Legend: [*] built-in  [ ] excluded  <M> module  < > module capable                │
      │ ┌───────────────────────────────────────┐ │
      │ │         General setup  --->                                                  │ │
      │ │     [*] Support DMA zone                                                     │ │
      │ │     [*] Support DMA32 zone                                                   │ │
      │ │         Platform selection  --->                                             │ │
      │ │         Kernel Features  --->                                                │ │
      │ │         Boot options  --->                                                   │ │
      │ │         Power management options  --->                                       │ │
      │ │         CPU Power Management  --->                                           │ │
      │ │         Firmware Drivers  --->                                               │ │
      │ │     [ ] Virtualization  ----                                                 │ │
      │ │     -*- ARM64 Accelerated Cryptographic Algorithms  --->                     │ │
      │ │         General architecture-dependent options  --->                         │ │
      │ │     [*] Enable loadable module support  --->                                 │ │
      │ │     [*] Enable the block layer  --->                                         │ │
      │ │         IO Schedulers  --->                                                  │ │
      │ │         Executable file formats  --->                                        │ │
      │ │         Memory Management options  --->                                      │ │
      │ │     [*] Networking support  --->                                             │ │
      │ │         Device Drivers  --->                                                 │ │
      │ │         File systems  --->                                                   │ │
      │ │         Security options  --->                                               │ │
      │ │     -*- Cryptographic API  --->                                              │ │
      │ │         Library routines  --->                                               │ │
      │ │         Kernel hacking  --->                                                 │ │
      │ │                                                                              │ │
      │ └───────────────────────────────────────┘ │
      ├──────────────────────────────────────────┤
      │              <Select>    < Exit >    < Help >    < Save >    < Load >              │
      └──────────────────────────────────────────┘
    [ティップ]

    Linux Kernel Configuration メニューで"/"キーを押下すると、カーネルコンフィギュレーションの検索を行うことができます。 カーネルコンフィギュレーションのシンボル名(の一部)を入力して"Ok"を選択すると、 部分一致するシンボル名を持つカーネルコンフィギュレーションの情報が一覧されます。

  5. ビルド

    次のコマンドを実行します。

    [ATDE ~/linux-[VERSION]]$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j5
  6. インストール

    ビルドしたカーネルは、以下に示すどちらかの方法でインストールしてください。

    • swupdate でインストールする

      mkswu の初期化を行った後に 提供されているスクリプトを使ってSWUイメージを作成してください。

      [ATDE ~/linux-[VERSION]]$ /usr/share/mkswu/examples/kernel_update_plain.install.sh ~/mkswu/kernel.desc
      Installing kernel in /home/atmark/mkswu/kernel ...
      'arch/arm64/boot/Image' -> '/home/atmark/mkswu/kernel/Image'
      'arch/arm64/boot/dts/freescale/armadillo_iotg_g4.dtb' -> '/home/atmark/mkswu/kernel/armadillo_iotg_g4.dtb'
      : (省略)
        INSTALL arch/arm64/crypto/poly1305-neon.ko
        INSTALL drivers/block/loop.ko
      : (省略)
        DEPMOD  [VERSION]
      Updated /home/atmark/mkswu/kernel.desc version from [PREV_VERSION] to [VERSION]
      Done installing kernel, run `mkswu "/home/atmark/mkswu/kernel.desc"` next.
      [ATDE ~/linux-[VERSION]]$ mkswu ~/mkswu/kernel.desc
      /home/atmark/mkswu/kernel.swu を作成しました

      図6.181 Linux カーネルを SWU でインストールする方法


      作成された kernel.swu のインストールについては 「SWU イメージのインストール」 を参照ください。

      [注記]

      この kernel.swu をインストールする際は /etc/swupdate_preserve_files の更新例 の様に /boot/lib/modules を維持するように追加します。 カーネルをインストールした後に Armadillo Base OS を更新しても、この kernel.swu のカーネルが維持されます。

      標準のカーネルに戻りたいか、以下の 図6.182「Linux カーネルを build_rootfs でインストールする方法」 で Armadillo Base OS の更新のカーネルを使用したい場合は /etc/swupdate_preserve_files から /boot/lib/modules の行を削除してください。

    • build_rootfs で新しいルートファイルシステムをビルドする場合は build_rootfs を展開した後に以下のコマンドでインストールしてください。

      [ATDE ~/linux-[VERSION]]$ BROOTFS=$HOME/build-rootfs-[VERSION] 1
      [ATDE ~/linux-[VERSION]]$ sed -i -e '/^linux-at/d' "$BROOTFS/ax2/packages" 2
      [ATDE ~/linux-[VERSION]]$ cp -v arch/arm64/boot/Image "$BROOTFS/ax2/resources/boot/"
      'arch/arm64/boot/Image' -> '/home/atmark/build-rootfs-v3.17-at.3/ax2/resources/boot/Image'
      [ATDE ~/linux-[VERSION]]$ cp -v arch/arm64/boot/dts/freescale/armadillo_*.{dtb,dtbo} "$BROOTFS/ax2/resources/boot/"
      'arch/arm64/boot/dts/freescale/armadillo_iotg_g4.dtb' -> '/home/atmark/build-rootfs-v3.17-at.3/ax2/resources/boot/armadillo_iotg_g4.dtb'
      'arch/arm64/boot/dts/freescale/armadillo_iotg_g4-at-dtweb.dtbo' -> '/home/atmark/build-rootfs-v3.17-at.3/ax2/resources/boot/armadillo_iotg_g4-at-dtweb.dtbo'
      : (省略)
      [ATDE ~/linux-[VERSION]]$ rm -rfv "$BROOTFS/ax2/resources/lib/modules" 3
      [ATDE ~/linux-[VERSION]]$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH="$BROOTFS/ax2/resources" -j5 modules_install
        INSTALL arch/arm64/crypto/poly1305-neon.ko
        INSTALL drivers/block/loop.ko
      : (省略)
        DEPMOD  [VERSION]

      図6.182 Linux カーネルを build_rootfs でインストールする方法


      1

      build_rootfs のディレクトリ名を設定します。これによって、長いディレクトリ名を何度も入力する必要が無くなります。

      2

      アットマークテクノが提供するカーネルをインストールしない様に、 linux-at-x2@atmark と記載された行を削除します。

      3

      別のカーネルをすでにインストールしている場合は、新しいモジュールをインストールする前に古いモジュールを削除する必要があります。

6.23.3. Alpine Linux ルートファイルシステムをビルドする

ここでは、alpine/build-rootfsを使って、 Alpine Linux ルートファイルシステムを構築する方法を説明します。

alpine/build-rootfsはATDEで動作しているLinux上でArmadillo-X2用の aarch64アーキテクチャに対応したAlpine Linux ルートファイルシステムを構築することができるツールです。

  1. ルートファイルシステムのビルドに必要な Podman のインストール

    次のコマンドを実行します。

    [ATDE ~]$ sudo apt install podman btrfs-progs xxhash
  2. alpine/build-rootfsの入手

    Armadillo-X2 開発用ツール から 「Alpine Linuxルートファイルシステムビルドツール」 ファイル (build-rootfs-[VERSION].tar.gz) を次のようにダウンロードします。

    [ATDE ~/]$ wget https://download.atmark-techno.com/armadillo-x2/tool/build-rootfs-latest.tar.gz
    [ATDE ~/]$ tar xf build-rootfs-latest.tar.gz
    [ATDE ~/]$ cd build-rootfs-[VERSION]
  3. Alpine Linux ルートファイルシステムの変更

    ax2ディレクトリ以下のファイルを変更することで、 ルートファイルシステムをカスタマイズすることができます。

    [ティップ]

    commonとax2 ディレクトリ直下にあるfixupやpackagesなどの同名ファイルは、それぞれのファイルを連結して利用されます。パッケージの削除などを行う場合は、commonディレクトリ以下のファイルも確認してください。

    commonとax2内のサブディレクトリにある同名ファイルは、ax2のファイルが利用されます。

    build-rootfsに含まれるファイルの説明は次の通りです。

    表6.19 build-rootfsのファイル説明

    ファイル説明

    ax2/resources/*

    配置したファイルやディレクトリは、そのままルートファイルシステム直下にコピーされます。 ファイルを追加する場合は、このディレクトリに入れてください。

    ax2/packages

    このファイルに記載されているパッケージはルートファイルシステムにインストールされます。 パッケージを追加する場合はこのファイルに追加してください。

    ax2/fixup

    このファイルに記載されているコマンドはパッケージのインストールが完了した後に実行されます。

    ax2/image_firstboot/*

    配置したファイルやディレクトリは、「ブートディスクの作成」「初期化インストールディスクの作成」の手順 のようにブートディスクイメージを作成する際、そのままルートファイルシステム直下にコピーされます。

    ax2/image_installer/*

    配置したファイルやディレクトリは、「初期化インストールディスクの作成」の手順 のようにインストールディスクイメージを作成する際、 そのままインストーラーにコピーされます。ルートファイルシステムに影響はありません。

    ax2/image_common/*

    配置したファイルやディレクトリは、ブートディスクイメージおよびインストールディスクイメージを 作成する際、ルートファイルシステム、インストーラにそれぞれコピーされます。


    [注記]

    利用可能なパッケージは以下のページで検索することができます。

    Alpine Linuxルートファイルシステムを起動している Armadilloでも検索することができます。

    [armadillo ~]# apk update
    [armadillo ~]# apk search ruby
    ruby-test-unit-rr-1.0.5-r0
    ruby-rmagick-5.1.0-r0
    ruby-public_suffix-5.0.0-r0
    :
    : (省略)
    :
    ruby-mustache-1.1.1-r5
    ruby-nokogiri-1.13.10-r0
  4. ビルド

    次のコマンドを実行します。

    パッケージをインターネット上から取得するため回線速度に依存しますが、 ビルドには数分かかります。

    [ATDE ~/build-rootfs-[VERSION]]$ sudo ./build_rootfs.sh
    use default(board=ax2)
    use default(arch=aarch64)
    use default(outdir=/home/xxxx/at-optee-build/build-rootfs)
    use default(output=baseos-x2-ATVERSION.tar.zst)
    'repositories' -> '/etc/apk/repositories'
    :
    : (略)
    :
    > Creating rootfs archive
    -rw-r--r--    1 root     root     231700480 Nov 26 07:18 rootfs.tar
    ERROR: No such package: .make-alpine-make-rootfs
    ============================================
    footprint[byte]  tarball[byte]  packages
          229904000       74942331  alpine-base coreutils chrony ...(省略)
    ============================================
    done.
    [注記]

    リリース時にバージョンに日付を含めたくないときは --release を引数に追加してください。

    [ティップ]

    インターネットに接続できない環境か、テスト済みのソフトウェアのみをインストールしたい場合は Armadillo-X2 開発用ツール から キャッシュアーカイブもダウンロードして、 build_rootfs.sh --cache baseos-x2-[VERSION].cache.tar で使ってください。

    [ティップ]

    任意のパス、ファイル名で結果を出力することもできます。

    [ATDE ~/build-rootfs-[VERSION]]$ ./build_rootfs.sh ~/alpine.tar.zst
    :
    : (略)
    :
    [ATDE ~/build-rootfs-[VERSION]]$ ls ~/alpine.tar.zst
    ~/alpine.tar.zst

    「Alpine Linux ルートファイルシステムビルドツール」のバージョンが3.18-at.7以降を使用している場合は、ビルドが終わると SBOM も [output].spdx.json として出力されます。 ライセンス情報等を記載するためのコンフィグファイルはデフォルトは baseos_sbom.yaml となっています。コンフィグファイルを変更する場合は --sbom-config <config> に引数を入れてください。 SBOM が不要な場合は --nosbom を引数に追加してください。

    SBOM のライセンス情報やコンフィグファイルの設定方法については 「ビルドしたルートファイルシステムの SBOM を作成する」 をご覧ください。

  5. インストール

    ビルドしたルートファイルシステムは、以下に示すどちらかの方法でインストールしてください。

    • swupdate でインストールする

      mkswu の初期化を行った後に 提供されているスクリプトを使ってSWUイメージを作成してください。

      [ATDE ~/build-rootfs-[VERSION]]$ vi OS_update.desc
      swdesc_tar --version base_os [VERSION] \
          --preserve-attributes baseos-x2-[VERSION].tar.zst
      [ATDE ~/build-rootfs-[VERSION]]$ mkswu OS_update.desc
      OS_update.swu を作成しました。

      作成された OS_update.swu のインストールについては 「SWU イメージのインストール」 を参照ください。

    • 「ブートディスクの作成」 でインストールする

      手順を実行すると、ビルドされた baseos-x2-[VERSION].tar.zst が自動的に利用されます。

6.23.4. ビルドしたルートファイルシステムの SBOM を作成する

ここでは例として、「Alpine Linux ルートファイルシステムをビルドする」 で作成した OS_update.swu の SBOM を作成します。 SBOM を作成するには、作成する対象のファイルとライセンス情報等を記載するためのコンフィグファイルが必要となります。 また、baseos-x2-[VERSION].package_list.txt から、パッケージの情報を記載することができます。

ライセンス情報等を記載するためのコンフィグファイルの例は以下のコマンドで確認することができます。 各項目に関する説明はコメントに記載しておりますので、必要に応じて値を変更してください。 各項目の詳細な説明については SPDX specification v2.2.2 (https://spdx.github.io/spdx-spec/v2.2.2/) をご覧ください。

[ATDE ~/build-rootfs-[VERSION]]$ cat submodules/make-sbom/config.yaml

作成した コンフィグファイルとパッケージ情報から SBOM を作成するには以下のコマンドを実行します。

[ATDE ~/build-rootfs-[VERSION]]$ ./make_sbom.sh -i OS_update.swu -c <コンフィグファイル> -p baseos-x2-[VERSION].package_list.txt
INFO:root:created OS_update.swu.spdx.json

このツールで作成される SBOM は json 形式で ISO/IEC5962で国際標準となっているSPDX2.2のフォーマットに準拠しています。

[ティップ]

当ツールで読み取ることが可能なライセンスは SPDX License List (https://spdx.org/licenses/) に含まれており、 SPDX license expressions (https://spdx.github.io/spdx-spec/v2.2.2/SPDX-license-expressions/#d4-composite-license-expressions) に従っている必要があります。 ライセンスが読み取れなかった場合は make_sbom.sh 実行時に以下のログが表示され、.spdx.json では NOASSERTION と記載されます。

WARNING:root:Failed to parse <パッケージ名> license: <ライセンス名>

アットマークテクノが提供している SBOM は ソフトウェアダウンロード の各ソフトウェアダウンロードページからダウンロードすることができます。

6.24. eMMC のデータリテンション

eMMC は主に NAND Flash メモリから構成されるデバイスです。NAND Flash メモリには書き込みしてから1年から3年程度の長期間データが読み出されないと電荷が抜けてしまう可能性があります。その際、電荷が抜けて正しくデータが読めない場合は、eMMC 内部で ECC (Error Correcting Code) を利用してデータを訂正します。しかし、訂正ができないほどにデータが化けてしまう場合もあります。そのため、一度書いてから長期間利用しない、高温の環境で利用するなどのケースでは、データ保持期間内に電荷の補充が必要になります。電荷の補充にはデータの読み出し処理を実行し、このデータの読み出し処理をデータリテンションと呼びます。

Armadillo-X2 に搭載のeMMCには長期間データが読み出されない状態であっても、データリテンションを自動的に行う機能を搭載しています。

[ティップ]

詳しい仕様については 「実装仕様に関する技術情報」 を参照してください。

6.24.1. データリテンションの設定

データリテンションは /etc/conf.d/micron_emmc_reten というファイルに書かれた設定、use_system_time によって以下の2通りの挙動を示します。

表6.20 データリテンションの挙動

/etc/conf.d/micron_emmc_reteninitiating condition

use_system_time=yes

Linux 起動した時に前回のリテンションから1日以上経過していたら開始する

use_system_time=no (default)

Linux 起動した時に毎回開始する


これで設定は完了しました。

以下は挙動ごとのシステム概略図です。

images/common-images/emmc-sref.png

図6.183 データリテンション開始トリガーの方式


use_system_time を有効にした場合のデータリテンションの動作例を以下に示します。

images/common-images/emmc-sref_counter.png

図6.184 データリテンションの開始トリガーの動作例


6.24.2. より詳しくデータリテンションの統計情報を確認するには

Micron Technology が提供する emmcparm というツールを使うことで、データリテンションの統計情報を確認することができます。統計情報として eMMC 内部に保存されているのは実行回数、最終実行完了時のカウンター値、現在のデータリテンション処理の進捗があります。 次の手順で、emmcparmを使ってeMMCの情報を確認することができます。このツールではデータリテンション処理のことを「セルフリフレッシュ」と呼びます。

  1. emmcparm をダウンロードする

    以下の検索結果から最新の emmcparm をダウンロードする。ユーザー登録が必要になります。

    [注記]

    マニュアル作成時点では 5.0.0 を利用しました

  2. パッケージを展開する

    [armadillo ~]# unzip emmc_emmcparm_c_code_derived_from_TN\ FC\ 25_v5.0.0 _binary.zip
  3. SSR を取得する

    [armadillo ~]# emmcparm/bin/emmcparm_arm_64bit -r /dev/mmcblk2
    : (省略)
    =======================================================================
    |                         Secure Smart Report                         |
    =======================================================================
      Self Refresh progress of scan[215-212]:               0x00000000 (0) 1
      Power Loss Counter[195-192]:                          0x00000005 (5)
      Current total ON time[131-128]:                       0x00001b28 (6952)
      Number of Blocks in Refresh Queue[99-96]:             0x00000000 (0)
      Self Refresh Completion date [95-88]:                 0xffffffffd8148931 2
                                                            (-669742799)
      Self Refresh Loop Count[81-80]:                       0x00000002 (2)  3
      Written Data 100MB Size Count (from NAND)[79-76]:     0x0004889d (297117)
      Cumulative Initialization Count (from NAND)[75-72]:   0x00005300 (21248)
      Written Data 100MB Size Count (from RAM)[71-68]:      0x0004889d (297117)
      Refresh Count[55-52]:                                 0x00000004 (4)
    : (省略)

    1

    現在のセルフリフレッシュ処理の進捗。0 ということは実行中ではない

    2

    最後に行ったセルフリフレッシュのカウンター値

    3

    セルフリフレッシュを行った回数

6.24.3. 実装仕様に関する技術情報

ここではデータリテンションを自動的におこなう機能の仕様について詳細に説明します。 Armadillo で採用しているeMMCには、データリテンションを自動的に実行することができる「セルフリフレッシュ」と呼ばれる機能が搭載されます。実行トリガーは2種類のうちどちらかを選択できます。OTP のため一度設定すると変更できません。この設定は出荷時に「eMMC 内部レジスタ値とコマンドに入力された値を比較して1日以上経過していると実行する」を設定しています。

  1. リセット後に毎回実行する
  2. eMMC 内部レジスタ値とコマンドに入力された値を比較して1日以上経過していると実行する

2の設定の場合、セルリフレッシュ機能が実行されるまでの流れは以下のとおりです。

  1. ホストによって eMMC がハードウェアもしくはソフトウェアリセットされる
  2. 一定時間 (delay 1) 以内に、ホストから SET_TIME (CMD49)と呼ばれるコマンドが eMMC に発行される
  3. eMMC コントローラは、バスの稼動状態を監視する
  4. eMMC コントローラは、アイドルになってから一定時間 (delay 2) 経過した後にセルフリフレッシュを実行する

    • ECC エラーなどのエラーがしきい値 (2) を越えたセルに対してのみセルフリフレッシュを実行する

Armadillo でのセルフリフレッシュ機能搭載 eMMC への設定は以下のとおりです。

表6.21 Armadillo のデータリテンションの設定

settingvaluedescription

RTC

ON

eMMC 内部レジスタの値と SET_TIME の値を比較してセルフリフレッシュを実行する

Delay 1

60s

リセット後の SET_TIME 有効期間

Delay 2

100ms

アイドル確認後のセルフリフレッシュ実行までの遅れ時間


[注記]

詳しい情報は以下を参照してください。

マイクロンのサイトの会員登録が必要になります。

6.25. Linuxカーネルがクラッシュしたときにメモリの状態を保存する

ArmadilloはLinuxカーネルがクラッシュすると、ウォッチドッグタイマーによってシステムリセットが発生し、再起動します。

このとき、再起動によってメモリの内容が失われてしまうため、デバッグが困難になる場合があります。

ここでは Kdump を利用してLinuxカーネルがクラッシュしたときにメモリの状態(vmcore)を保存し、vmcoreを解析する方法を紹介します。

6.25.1. Kdumpを利用する準備

ここでは、Kdumpの実行環境を構築する手順を紹介します。

  1. Linuxカーネルの準備

    ArmadilloのLinuxカーネルをデバッグ用に変更します。以下で紹介する二つの方法のどちらかを選択してください。

    1. ビルド済みのapkパッケージを利用する場合

      以下のコマンドを実行します。

      [armadillo ~]# persist_file -a del linux-at-x2
      [armadillo ~]# persist_file -a add linux-at-x2-debug
    2. Linuxカーネルをビルドする場合

      以下のようにカーネルコンフィギュレーションを変更してください。

      Kernel hacking  --->
        Compile-time checks and compiler options  --->
          [*] Compile the kernel with debug info             <DEBUG_INFO> 1
          [ ]   Reduce debugging information         <DEBUG_INFO_REDUCED> 2

      1

      チェックを入れます

      2

      チェックを外します

      「Linux カーネルをビルドする」を参照して、ビルドおよびインストールしてください。

  2. パッケージのインストール

    kdump-toolsをインストールします。

    [armadillo ~]# persist_file -a add kdump-tools
  3. 設定ファイルの編集

    Kdumpの設定ファイルを編集します。

    [armadillo ~]# vi /etc/conf.d/kdump-tools
    # kdump-tools configuration
    :(省略)
    KDUMP_KERNEL=/boot/Image 1
    #KDUMP_INITRD=/var/lib/kdump/initrd.img 2
    :(省略)
    KDUMP_COREDIR="/var/app/volumes/kdump" 3
    :(省略)
    [armadillo ~]# persist_file /etc/conf.d/kdump-tools 4

    1

    Linuxカーネルイメージのパスを指定します。

    2

    initrdは利用しないのでコメントアウトします。

    3

    vmcoreを保存するディレクトリを指定します。少なくとも30MByte以上の空き容量が必要です。

    4

    ファイルを永続化します。

  4. kdump-toolsサービスの有効化

    起動時に、自動的にkdump-toolsサービスを有効化するようにします。

    [armadillo ~]# rc-update add kdump-tools 1
    [armadillo ~]# persist_file /etc/runlevels/default/kdump-tools 2

    1

    kdump-toolsサービスの自動起動を有効にします。

    2

    ファイルを永続化します。

  5. Linuxカーネル起動時パラメータの指定

    Kdumpで利用するメモリサイズを、Linuxカーネル起動時パラメータのcrashkernelに指定します。「u-boot の環境変数の設定」を参照し、環境変数optargsを設定してください。

    以下の例では、Kdumpで利用するメモリサイズを128MByteに指定しています。

    [armadillo ~]# vi /boot/uboot_env.d/kdump 1
    optargs=quiet nokaslr crashkernel=128M 2
    [armadillo ~]# persist_file -v /boot/uboot_env.d/kdump 3
    '/boot/uboot_env.d/kdump' -> '/mnt/boot/uboot_env.d/kdump'
    [armadillo ~]# fw_setenv -s /boot/uboot_env.d/kdump 4
    Environment OK, copy 0
    [armadillo ~]# fw_printenv | grep optargs= 5
    optargs=quiet nokaslr crashkernel=128M
    [armadillo ~]# reboot 6

    1

    コンフィグファイルを生成します。

    2

    デフォルト値である"quiet nokaslr"の後ろに追加しています。デフォルト値が不要であれば、削除しても問題ありません。

    3

    ファイルを永続化します。

    4

    変数を書き込みます。

    5

    書き込んだ変数を確認します。

    6

    再起動して、設定を反映させます。

    以上で、Kdumpを利用する準備は完了です。Linuxカーネルがクラッシュした場合に、Kdumpによってvmcoreが保存されるようになりました。

6.25.2. Kdumpの動作確認

ここでは、故意にLinuxカーネルをクラッシュさせ、Kdumpの動作確認を行う手順を紹介します。

[armadillo ~]# echo 1 > /proc/sys/kernel/sysrq 1
[armadillo ~]# echo c > /proc/sysrq-trigger 2
[   19.295633] sysrq: Trigger a crash
[   19.299079] Kernel panic - not syncing: sysrq triggered crash
: (省略)
[   19.386503] Starting crashdump kernel...
[   19.390426] Bye!
[    0.000000] Booting Linux on physical CPU 0x0000000003 [0x410fd034] 3
: (省略)
kdump-tools              |makedumpfile Completed.
kdump-tools              |kdump-config: saved vmcore in /var/app/volumes/kdump/202303101530
kdump-tools              |Fri, 10 Mar 2023 15:30:39 +0900
[   20.189148] imx2-wdt 30280000.watchdog: Device shutdown: Expect reboot!
[   20.201853] reboot: Restarting system 4
: (省略)
[armadillo ~]# ls /var/app/volumes/kdump/202303101530 5
dmesg.202303101530  dump.202303101530 6

1

SysRqキーを有効化します。

2

SysRqキーの"c"コマンドを実行してLinuxカーネルをクラッシュさせます。

3

Kdumpに指定したLinuxカーネルがブートローダーを経由せずに起動します。

4

Kdumpがvmcoreを保存した後、自動的に再起動します。

5

作成されたファイルを確認します。

6

dmesg.[DATE]はLinuxカーネルのログです。dump.[DATE]はvmcoreです。

Armadilloの再起動が完了後、Kdumpのログに表示されたディレクトリ(/var/app/volumes/kdump/[DATE]/)から、Linuxカーネルがクラッシュした状態でのvmcoreやdmesgを確認することができます。

[ティップ]

vmcoreが保存されるディレクトリおよび、そのディレクトリ内に作成されるファイル名に付与される日時は次のコマンドで作られています。

date +"%Y%m%d%H%M"

6.25.3. vmcoreの確認

ここでは、vmcoreの内容を確認する手順を紹介します。

vmcoreの内容を確認するには、次の3つが必要です。

  • vmcore
  • vmlinux
  • crashコマンド

vmcoreは、「Kdumpの動作確認」で作成した /var/app/volumes/kdump/[DATE]/dump.[DATE] です。vmlinuxおよびcrashコマンドの準備については、以下の手順を参照してください。

  1. vmlinuxの準備

    現在動作しているLinuxカーネルと一緒にビルドされたvmlinuxを取得します。

    「Kdumpを利用する準備」でどちらのLinuxカーネルを選択したかによって手順が異なります。以下で紹介する二つの方法のどちらかを選択してください。

    1. ビルド済みのapkパッケージに含まれているLinuxカーネルが動作している場合

      以下のコマンドを実行してvmlinuxを取得します。vmlinuxは、ホストとコンテナ間で共有する/var/app/volumes/kdump/に配置します。

      [armadillo ~]# cd /var/app/volumes/kdump/
      [armadillo /var/app/volumes/kdump]# apk fetch linux-at-x2-dbg
      [armadillo /var/app/volumes/kdump]# mv linux-at-x2-dbg-[VERSION].apk linux-at-x2-dbg.tar.gz
      [armadillo /var/app/volumes/kdump]# tar xf linux-at-x2-dbg.tar.gz
      [armadillo /var/app/volumes/kdump]# ln -s usr/lib/debug/lib/modules/[VERSION]/vmlinux .
    2. ビルドしたLinuxカーネルが動作している場合

      ビルドしたLinuxカーネルディレクトリ直下にvmlinuxが作成されています。

      [armadillo ~]# ls linux-[VERSION]/vmlinux
      linux-[VERSION]/vmlinux

      vmlinuxを/var/app/volumes/kdump/にコピーしてください。

  2. crashコマンドの準備

    crashコマンドを利用する為に、「アットマークテクノが提供するイメージを使う」を参照してdebianコンテナを作成してください。

    [ティップ]

    crashコマンドが利用できるディストリビューションであれば、debian以外を利用しても構いません。

    以下のコマンドを実行してcrashをインストールします。

    [armadillo ~]# vi /etc/atmark/containers/kdump.conf
    set_image localhost/at-debian-image:latest
    set_command sleep infinity
    add_volumes /var/app/volumes/kdump:/mnt:ro 1
    [armadillo ~]# podman_start kdump
    Starting 'kdump'
    8e7ad42534e3fb968dbf597d679246346ae4f766ac33ab0265008f30a7bf7d11
    [armadillo ~]# podman exec -it kdump bash
    [container /]# apt install crash 2

    1

    ホスト OS 側の /var/app/volumes/kdump をコンテナ内の /mnt にマウントするように設定します。

    2

    crashコマンドを含むcrashパッケージをインストールします。

  3. vmcoreの確認

    以下のコマンドを実行してcrashを起動します。起動に成功するとcrashのプロンプトが表示され、不具合の解析を行うことができるようになります。

    [container /]# crash /mnt/vmlinux /mnt/[DATE]/dump.[DATE]
    :(省略)
    crash>
    [ティップ]

    crashのコマンド一覧は、helpコマンドで確認できます。

    crash> help

    helpの引数にコマンドを与えると、そのコマンドの詳細を確認できます。例としてbtコマンドの詳細は以下のように確認できます。

    crash> help bt

6.26. 動作ログ

6.26.1. 動作ログについて

Armadillo-X2 ではシステムが出力するログの一部は、 一般的な /var/log ディレクトリではなく、/var/at-log ディレクトリに出力されます。 /var/at-log は、ルートファイルシステムとは別のパーティションになっているので、 ルートファイルシステムに障害が発生した場合でも、/var/at-log のパーティションが無事であれば、 ログファイルを取り出して、不具合等の解析に利用することができます。

[ティップ]

通常のログは /var/log/messages に出力されます。

/var/log/messages はファイルサイズが 4MB になるとローテートされ /var/log/messages.0 に移動されます。

/var/log/messages.0 が存在する状態で、更に /var/log/messages のファイルサイズが 4MB になった場合は、 /var/log/messages の内容が /var/log/messages.0 に上書きされます。 /var/log/messages.1 は生成されません。

6.26.2. 動作ログを取り出す

ログファイルは /var/at-log ディレクトリ内に atlog というファイル名で作成されているので、 これを任意のディレクトリにコピーすることで取り出せます。 もし、eMMC 上のルートファイルシステムが壊れてしまい起動できない場合は、 microSD カードから起動することでログファイルを取り出すことができます。

[ティップ]

/var/at-log/atlog はファイルサイズが 3MB になるとローテートされ /var/at-log/atlog.1 に移動されます。

/var/at-log/atlog.1 が存在する状態で、更に /var/at-log/atlog のファイルサイズが 3MB になった場合は、 /var/at-log/atlog の内容が /var/at-log/atlog.1 に上書きされます。 /var/at-log/atlog.2 は生成されません。

6.26.3. ログファイルのフォーマット

ログファイルの内容はテキストデータであり、以下のようなフォーマットになっています。

日時 armadillo ログレベル 機能: メッセージ

図6.185 動作ログのフォーマット


atlog には以下の内容が保存されています。

  • インストール状態のバージョン情報
  • swupdate によるアップデートの日付とバージョン変更
  • abos-ctrl / uboot の rollback 日付
  • uboot で wdt による再起動が合った場合にその日付

6.26.4. ログ用パーティションについて

ログ出力先である /var/at-log ディレクトリには、 GPP である /dev/mmcblk2gp1 パーティションがマウントされています。 このパーティションに論理的な障害が発生した場合は、/dev/mmcblk2gp1 の データを /dev/mmcblk2gp2 にコピーし、/dev/mmcblk2gp1 は FAT ファイルシステムで フォーマットされます。 このパーティションの障害チェックはシステム起動時に自動的に実行されます。

6.27. viエディタを使用する

viエディタは、Armadilloに標準でインストールされているテキストエディタです。本書では、Armadilloの設定ファイルの編集などにviエディタを使用します。

viエディタは、ATDEにインストールされてるgeditやemacsなどのテキストエディタとは異なり、モードを持っていることが大きな特徴です。viのモードには、コマンドモードと入力モードがあります。コマンドモードの時に入力した文字はすべてコマンドとして扱われます。入力モードでは文字の入力ができます。

本章で示すコマンド例はATDEで実行するよう記載していますが、Armadilloでも同じように実行することができます。

6.27.1. viの起動

viを起動するには、以下のコマンドを入力します。

[ATDE ~]# vi [file]

図6.186 viの起動


file にファイル名のパスを指定すると、ファイルの編集(+file+が存在しない場合は新規作成)を行います。viはコマンドモードの状態で起動します。

6.27.2. 文字の入力

文字を入力するにはコマンドモードから入力モードへ移行する必要があります。コマンドモードから入力モードに移行するには、表6.22「入力モードに移行するコマンド」に示すコマンドを入力します。入力モードへ移行後は、キーを入力すればそのまま文字が入力されます。

表6.22 入力モードに移行するコマンド

コマンド動作

i

カーソルのある場所から文字入力を開始

a

カーソルの後ろから文字入力を開始


入力モードからコマンドモードに戻りたい場合は、ESCキーを入力することで戻ることができます。現在のモードが分からなくなった場合は、ESCキーを入力し、一旦コマンドモードへ戻ることにより混乱を防げます。

[警告]

日本語変換機能をOFFに

viのコマンドを入力する時はATDEの日本語入力システム(Mozc)をOFFにしてください。日本語入力システムのON/OFFは、半角/全角キーで行うことができます。

「i」、「a」それぞれのコマンドを入力した場合の文字入力の開始位置を図6.187「入力モードに移行するコマンドの説明」に示します。

images/common-images/vi-insert-command.svg

図6.187 入力モードに移行するコマンドの説明


[ティップ]

viでの文字削除

コンソールの環境によってはBS(Backspace)キーで文字が削除できず、「^H」文字が入力される場合があります。その場合は、「文字の削除」で説明するコマンドを使用し、文字を削除してください。

6.27.3. カーソルの移動

方向キーでカーソルの移動ができますが、コマンドモードで表6.23「カーソルの移動コマンド」に示すコマンドを入力することでもカーソルを移動することができます。

表6.23 カーソルの移動コマンド

コマンド動作

h

左に1文字移動

j

下に1文字移動

k

上に1文字移動

l

右に1文字移動


6.27.4. 文字の削除

文字を削除する場合は、コマンドモードで表6.24「文字の削除コマンド」に示すコマンドを入力します。

表6.24 文字の削除コマンド

コマンド動作

x

カーソル上の文字を削除

dd

現在行を削除


「x」コマンド、「dd」コマンドを入力した場合に削除される文字を図6.188「文字を削除するコマンドの説明」に示します。

images/common-images/vi-delete-command.svg

図6.188 文字を削除するコマンドの説明


6.27.5. 保存と終了

ファイルの保存、終了を行うコマンドを表6.25「保存・終了コマンド」に示します。

表6.25 保存・終了コマンド

コマンド動作

:q!

変更を保存せずに終了

:w[file]

ファイルを+file+に指定して保存

:wq

ファイルを上書き保存して終了


保存と終了を行うコマンドは「 : 」(コロン)からはじまるコマンドを使用します。" : "キーを入力すると画面下部にカーソルが移り入力したコマンドが表示されます。コマンドを入力した後Enterキーを押すことで、コマンドが実行されます。

6.28. オプション品

本章では、Armadillo-X2のオプション品について説明します。

表6.26 Armadillo-X2関連のオプション品

名称型番備考

Armadillo-X2 オプションケース(金属製)

OP-CASEX2-MET-00

ケースモデルに付属

CPU放熱シート15x15x4mm 10個セット

OP-THS-151504-00

Armadillo-X2、G4 ケースモデル VESA規格固定用プレート

OP-CASEX2-VESA-00

ACアダプタ(12V/3.0A φ2.1mm)標準品

OP-AC12V6-00

開発セットに付属


6.28.1. Armadillo-X2 オプションケース(金属製)

6.28.1.1. 概要

Armadillo-X2用のアルミ製ケースです。 基板を収めた状態で、DCジャック、LAN、USBx2、HDMI、USBコンソール、スイッチ、LEDにアクセスすることが可能となっています。

images/x2-metal-case.svg

図6.189 Armadillo-X2 オプションケース(金属製)


表6.27 Armadillo-X2 オプションケースセット(金属製)について

製品名

Armadillo-X2 オプションケースセット(金属製)

型番

OP-CASEX2-MET-00

セット内容

アルミケース、ケースネジ×2、Armadillo-X2固定用ネジ×4


表6.28 Armadillo-X2 オプションケース(金属製)の仕様

材質

ヘアライン白アルマイト材

板厚

1.0 mm


[警告]

コネクタ開口部等に存在する継ぎ目状の加工痕は正常な状態ですのでご了承ください。

images/turret-punch.png

図6.190 オプションケース(金属製)の加工痕例


6.28.1.2. 組み立て

組み立て手順に関しては、「オプションケース(金属製)への組み付け」を参照してください。

6.28.1.3. 形状図

images/case-top-dimension.svg

図6.191 ケース(上)形状図


images/case-bottom-dimension.svg

図6.192 ケース(下)形状図


[ティップ]

DXF形式の形状図を「アットマークテクノ Armadilloサイト」から「購入者向けの限定公開データ」としてダウンロード可能です。

[ティップ]

DCジャック(CON14)、USBコンソールインターフェース(CON6)、SDインターフェース(CON1)は、 他コネクタの面位置より少し後ろに配置しているため、 外部からの操作が不要な場合、開口を塞ぐ設計変更をするだけで、目隠しすることが可能です。

[警告]

ケース固定用のM3のねじ穴を2つ用意しています。 故障の原因となりますので、基板裏や部品にねじが接触していないか、十分にご確認の上ご利用ください。

images/metal-case-mount-caution.svg

図6.193 ケースを固定する際の注意


6.28.2. Armadillo-X2、G4 ケースモデル VESA規格固定用プレート

6.28.2.1. 概要

Armadillo-X2、G4 ケースモデル VESA規格固定用プレートはVESA規格(100 × 100mm)に対応したテレビやモニターなどに Armadillo-X2およびArmadillo-IoT ゲートウェイ G4のケースモデルを取り付けるための製品です。

images/common-images/about-op-vesa-plate.svg

図6.194 Armadillo-X2、G4 ケースモデル VESA規格固定用プレート


表6.29 Armadillo-X2、G4 ケースモデル VESA規格固定用プレートについて

製品名

Armadillo-X2、G4 ケースモデル VESA規格固定用プレート

型番

OP-CASEX2-VESA-00

セット内容

VESA規格固定用プレート、ケース固定用ねじ×2、プレート固定用ねじ×4


表6.30 Armadillo-X2、G4 ケースモデル VESA規格固定用プレートの仕様

材質

寸法

120 × 123 mm

板厚

2 mm


6.28.2.2. 組み立て

Armadillo-X2 オプションケース(金属製)の底面には、ケース固定用のM3のネジ穴が2箇所あります。この穴を利用して、VESA規格固定用プレートを取り付けます。

VESA規格固定用プレートの中央側にある2箇所の穴が、ケース取り付け用の穴です。ケース底面の穴とVESA規格固定用プレートの穴位置を合わせて、皿もみ加工されている面から、ねじ頭がすっぽり収まるまで、ねじを締めてください。推奨のねじ締めトルクは 31.5cN•m です。

images/x2-vesa-assy.svg

図6.195 ケースにVESA規格固定用プレートを取り付け


images/common-images/callouts/1.svg
皿小ねじ(M3、L=4mm) × 2
[警告]

故障の原因となりますので、付属ねじ以外をご使用の場合、ケース内部の基板や部品にねじが接触していないか、十分にご確認ください。

VESA規格固定用プレートの4隅の穴が、VESA規格(100 x 100mm)に対応した穴です。

ケース取り付け済みのVESA規格固定用プレートを VESA規格(100 x 100mm)に対応したテレビやモニターなどに取り付けます。

images/monitor-vesa-assy.svg

図6.196 モニターにVESA規格固定用プレートを取り付け


images/common-images/callouts/1.svg
バインド小ねじ(M4、L=10mm) × 4

6.28.2.3. 形状図

images/common-images/vesa-plate-dimension.svg

図6.197 Armadillo-X2、G4 ケースモデル VESA規格固定用プレート形状図


[ティップ]

DXF形式の形状図を「アットマークテクノ Armadilloサイト」から「購入者向けの限定公開データ」としてダウンロード可能です。



[13] 推論実行用のソフトウェアであり、学習は行なえません。

[14] nmcli connection show [ID] によって、より詳細な情報を表示することもできます。

[15] スペースキーでページを送ると、 最終ページに同意するかどうかの入力プロンプトが表示されます。