応用編

目次

6.1. 省電力・間欠動作機能を使う
6.1.1. シャットダウンモードへの遷移と起床
6.1.2. スリープモードへの遷移と起床
6.1.3. スリープ(SMS 起床可能)モードへの遷移と起床
6.1.4. 状態遷移トリガにコンテナ終了通知を利用する
6.1.5. コンテナ終了後、指定した秒数だけスリープしてコンテナを再始動する
6.2. persist_file について
6.3. swupdateを使用してアップデートする
6.3.1. swupdate で可能なアップデート
6.3.2. コンテナのアップデート、ユーザーデータディレクトリや Armadillo Base OS の差分アップデート
6.3.3. Armadillo Base OS の一括アップデート
6.3.4. ブートローダーのアップデート
6.3.5. swupdate がエラーする場合の対処
6.4. mkswu の .desc ファイルを編集する
6.4.1. インストールバージョンを指定する
6.4.2. Armadillo へファイルを転送する
6.4.3. Armadillo 上で任意のコマンドを実行する
6.4.4. Armadillo にファイルを転送し、そのファイルをコマンド内で使用する
6.4.5. 動作中の環境でのコマンドの実行
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. コンテナの概要と操作方法を知る
6.8.1. Podman - コンテナ仮想化ソフトウェアとは
6.8.2. コンテナの基本的な操作
6.8.3. コンテナとコンテナに関連するデータを削除する
6.8.4. コンテナ起動設定ファイルを作成する
6.8.5. アットマークテクノが提供するイメージを使う
6.8.6. alpine のコンテナイメージをインストールする
6.8.7. コンテナのネットワークを扱う
6.8.8. コンテナ内にサーバを構築する
6.8.9. コンテナからのpoweroff及びreboot
6.8.10. 異常検知
6.9. ゲートウェイコンテナを動かす
6.9.1. ゲートウェイコンテナ利用の流れ
6.9.2. ゲートウェイコンテナ起動確認
6.9.3. 接続先の クラウド 環境を構築 (AWS)
6.9.4. 接続先の クラウド 環境を構築 (Azure)
6.9.5. ゲートウェイコンテナの設定ファイル
6.9.6. コンテナ起動・実行
6.9.7. クラウドからの操作
6.9.8. コンテナの終了
6.9.9. ログ内容確認
6.9.10. ゲートウェイコンテナの構成
6.10. ゲートウェイコンテナアプリケーションを改造する
6.11. Web UI から Armadillo をセットアップする (ABOS Web)
6.11.1. ABOS Web ではできないこと
6.11.2. ABOS Web の設定機能一覧と設定手順
6.11.3. コンテナ管理
6.11.4. SWUインストール
6.11.5. 時刻設定
6.11.6. アプリケーション向けのインターフェース (Rest API)
6.11.7. カスタマイズ
6.11.8. ユーザー設定とユーザーデータの削除
6.11.9. ABOS Web を停止する
6.11.10. ABOS Web を起動する
6.12. ABOSDE から ABOS Web の機能を使用する
6.12.1. Armadillo の SWU バージョンを取得する
6.12.2. Armadillo のコンテナの情報を取得する
6.12.3. Armadillo のコンテナを起動・停止する
6.12.4. Armadillo のコンテナのログを取得する
6.12.5. Armadillo に SWU をインストールする
6.13. ssh 経由で Armadillo Base OS にアクセスする
6.14. コマンドラインからネットワーク設定を行う
6.14.1. 接続可能なネットワーク
6.14.2. ネットワークの設定方法
6.14.3. nmcli の基本的な使い方
6.14.4. 有線 LAN の接続を確認する
6.14.5. LTE (Cat.1/Cat.M1 モデル)
6.14.6. 無線LAN
6.14.7. 無線 LAN アクセスポイント (AP) として設定する
6.14.8. ファイアウォールの設定方法
6.15. コマンドラインからストレージを使用する
6.15.1. ストレージのパーティション変更とフォーマット
6.16. コマンドラインから CPU の測定温度を取得する
6.16.1. 温度を取得する
6.17. SMS を利用する (Cat.1/Cat.M1 モデル)
6.17.1. 初期設定
6.17.2. SMS を送信する
6.17.3. SMS を受信する
6.17.4. SMS 一覧を表示する
6.17.5. SMS の内容を表示する
6.17.6. SMS を削除する
6.17.7. SMS を他のストレージに移動する
6.18. ボタンやキーを扱う
6.18.1. SW1 の短押しと長押しの対応
6.18.2. USB キーボードの対応
6.18.3. Armadillo 起動時にのみボタンに反応する方法
6.19. 動作中の Armadillo の温度を測定する
6.19.1. 温度測定の重要性
6.19.2. atmark-thermal-profiler をインストールする
6.19.3. atmark-thermal-profiler を実行・停止する
6.19.4. atmark-thermal-profiler が出力するログファイルを確認する
6.19.5. 温度測定結果の分析
6.19.6. Armadillo Twin から Armadillo の温度を確認する
6.20. 電源を安全に切るタイミングを通知する
6.20.1. signal_indicator の設定
6.20.2. DTS overlays の設定
6.20.3. 動作確認
6.21. Armadillo Base OS をアップデートする
6.22. ロールバック状態を確認する
6.23. Armadillo 起動時にコンテナの外でスクリプトを実行する
6.24. u-boot の環境変数の設定
6.24.1. u-boot の環境変数の変更を制限する
6.25. SDブートの活用
6.25.1. ブートディスクの作成
6.25.2. SDブートの実行
6.25.3. ゲートウェイコンテナのインストール
6.26. Device Treeをカスタマイズする
6.26.1. at-dtweb のインストール
6.26.2. at-dtweb の起動
6.26.3. Device Tree をカスタマイズ
6.26.4. DTS overlays によるカスタマイズ
6.26.5. 独自の DTS overlay を追加する
6.27. Armadilloのソフトウェアをビルドする
6.27.1. ブートローダーをビルドする
6.27.2. Linux カーネルをビルドする
6.27.3. Alpine Linux ルートファイルシステムをビルドする
6.28. SBOM の提供
6.28.1. SBOM について
6.28.2. SBOM の利点
6.28.3. ビルドしたルートファイルシステムの SBOM を作成する
6.28.4. SWU イメージと同時に SBOM を作成する
6.29. eMMC のデータリテンション
6.30. 動作ログ
6.30.1. 動作ログについて
6.30.2. 動作ログを取り出す
6.30.3. ログファイルのフォーマット
6.30.4. ログ用パーティションについて
6.30.5. /var/log/ 配下のログに関して
6.31. シリアル通信ソフトウェア(minicom)のセットアップ
6.32. viエディタを使用する
6.32.1. viの起動
6.32.2. 文字の入力
6.32.3. カーソルの移動
6.32.4. 文字の削除
6.32.5. 保存と終了
6.33. オプション品
6.33.1. Armadillo-IoTゲートウェイA6E 標準ケースセットロング(9M)

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

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

6.1. 省電力・間欠動作機能を使う

本章では、Armadillo-IoTゲートウェイ A6E の 省電力・間欠動作機能や動作モード、状態遷移について説明します。

6.1.1. シャットダウンモードへの遷移と起床

シャットダウンモードへ遷移するには、poweroffコマンド、またはaiot-alarm-poweroffコマンドを実行します。

6.1.1.1. poweroffコマンド

poweroffコマンドを実行してシャットダウンモードに遷移した場合、電源の切断・接続のみでアクティブモードに遷移が可能です。 poweroffコマンドの実行例を次に示します。

[armadillo ~]# poweroff
[  OK  ] Stopped target Timers.
[  OK  ] Stopped Daily man-db regeneration.
[  OK  ] Stopped Daily rotation of log files.

※省略

[39578.876586] usb usb1: USB disconnect, device number 1
[39578.882754] ci_hdrc ci_hdrc.0: USB bus 1 deregistered
[39578.888133] reboot: Power down

6.1.1.2. aiot-alarm-poweroffコマンド

aiot-alarm-poweroffコマンドを実行することで、シャットダウンモードに遷移後、 RTCのアラーム割り込みをトリガで起床(アクティブモードに遷移)することができます。 なお、RTC を起床要因に使って間欠動作させる場合は、 「RTC を使用する」 を参考に、必ず RTC の日時設定を行ってください。

[警告]

RTC 未設定によるエラーが発生した場合、シャットダウンモードへの遷移は行われません。

[armadillo ~]# aiot-alarm-poweroff +[現在時刻からの経過秒数]

図6.1 aiot-alarm-poweroff コマンド書式


シャットダウンモードに遷移し、300秒後にアラーム割り込みを発生させるには、次のようにコマンドを実行します。

[armadillo ~]# aiot-alarm-poweroff +300
aiot-alarm-poweroff: alarm_timer +300 second

現在時刻からの経過秒数は180秒以上を指定する必要があります。

6.1.2. スリープモードへの遷移と起床

aiot-sleepコマンドを実行することで、スリープモードに遷移することができます。 スリープモードからの起床(アクティブモードに遷移する)条件は、aiot-sleepコマンドを実行する前にaiot-set-wake-triggerコマンドで事前指定します。 ユーザースイッチによる起床は標準で有効になっています。また、起床条件はOR条件での設定が可能です。

6.1.2.1. RTCアラーム割り込み以外での起床

aiot-set-wake-triggerコマンドの書式と設定可能なパラメータを以下に示します。

[armadillo ~]# aiot-set-wake-trigger [TRIGGER] [enabled|disabled]

図6.2 aiot-set-wake-trigger コマンド書式 (RTCアラーム割り込み以外での起床のとき)


表6.1 aiot-set-wake-trigger TRIGGER一覧

TRIGGER 説明

usb

CON9(USB ホストインターフェース)にUSBデバイスを挿抜したとき

uart3

CON3(シリアルインターフェース /dev/ttymxc2)にデータ受信があったとき

rs485

UART5(シリアルインターフェース /dev/ttymxc4)にデータ受信があったとき

gpio

GPIO 割り込みが発生したとき

sw1

SW1 が押下されたとき

ain [a]

アナログ入力電圧閾値割り込み発生時

[a] +DI8+Ai4 のみ使用可能です


コンソール(/dev/ttymxc2)から入力があった場合にスリープモードから起床するには、次に示すコマンドを実行します。

[armadillo ~]# aiot-set-wake-trigger uart3 enabled
aiot-set-wake-trigger: uart3 enabled

[armadillo ~]# aiot-sleep
aiot-sleep: Power Management suspend-to-ram
[ 1767.050404] PM: suspend entry (deep)
[ 1767.054019] PM: Syncing filesystems ...
[ 1767.236546] fec 2188000.ethernet eth0: Link is Up - 100Mbps/Full -
flow control rx/tx
[ 1767.428714] done.
[ 1767.431262] Freezing user space processes ... (elapsed 0.001 seconds) done.
[ 1767.439582] OOM killer disabled.
[ 1767.442834] Freezing remaining freezable tasks ... (elapsed 0.001
seconds) done.
[ 1767.451485] Suspending console(s) (use no_console_suspend to debug)

※ コンソールに入力

[ 1767.567686] OOM killer enabled.
[ 1767.570875] Restarting tasks ... done.
[ 1767.606048] PM: suspend exit
aiot-sleep: change mode CPU Idle

6.1.2.2. RTCアラーム割り込みでの起床

RTCアラーム割り込みでの起床を行う場合、パラメーター設定が異なります。 なお、RTC を起床要因に使って間欠動作させる場合は、 「RTC を使用する」 を参考に、必ず RTC の日時設定を行ってください。

RTCアラーム割り込みでの起床は、毎分 00 秒で起床する分指定 (Armadillo-IoT ゲートウェイ A6E 搭載のRTCアラーム割り込みを用いた起床) と秒指定 (SoC内蔵のRTCアラーム割り込みを用いた起床) の 2種類があります。

分指定のコマンド書式を 図6.3「aiot-set-wake-trigger コマンド書式 (RTCアラーム割り込みでの起床の場合: 分指定)」 に示します。

[armadillo ~]# aiot-set-wake-trigger rtc [enabled|disabled] <現在時刻からの経過秒数>

図6.3 aiot-set-wake-trigger コマンド書式 (RTCアラーム割り込みでの起床の場合: 分指定)


現在時刻からの経過秒数 は60秒以上を指定する必要があります。

300秒後にRTCアラーム割り込みを発生させ、スリープモードから起床させるコマンド実行例を以下に示します。

[armadillo ~]# aiot-set-wake-trigger rtc enabled +300
aiot-set-wake-trigger: rtc enabled
aiot-set-wake-trigger: alarm_timer +300 second

[armadillo ~]# aiot-sleep
aiot-sleep: Power Management suspend-to-ram
[ 1767.050404] PM: suspend entry (deep)
[ 1767.054019] PM: Syncing filesystems ...
[ 1767.236546] fec 2188000.ethernet eth0: Link is Up - 100Mbps/Full -
flow control rx/tx
[ 1767.428714] done.
[ 1767.431262] Freezing user space processes ... (elapsed 0.001 seconds) done.
[ 1767.439582] OOM killer disabled.
[ 1767.442834] Freezing remaining freezable tasks ... (elapsed 0.001
seconds) done.
[ 1767.451485] Suspending console(s) (use no_console_suspend to debug)

※ 約300秒待つ

[ 1767.567686] OOM killer enabled.
[ 1767.570875] Restarting tasks ... done.
[ 1767.606048] PM: suspend exit
aiot-sleep: change mode CPU Idle

秒指定のコマンド書式を 図6.4「aiot-set-wake-trigger コマンド書式 (RTC アラーム割り込みでの起床の場合: 秒指定)」 に示します。

[armadillo ~]# aiot-set-wake-trigger rtc_sec [enabled|disabled] <現在時刻からの経過秒数>

図6.4 aiot-set-wake-trigger コマンド書式 (RTC アラーム割り込みでの起床の場合: 秒指定)


現在時刻からの経過秒数 は5秒以上を指定する必要があります。

45秒後にRTCアラーム割り込みを発生させ、スリープモードから起床させるコマンド実行例を以下に示します。

[14:46:35.650] armadillo:~# aiot-set-wake-trigger rtc_sec enabled +45
[14:46:38.671] aiot-set-wake-trigger: rtc_sec alarm enabled
[14:46:38.673] aiot-set-wake-trigger: alarm_timer_snvs +45 second
[14:46:38.673] armadillo:~# aiot-sleep
[14:46:43.023] aiot-sleep: Power Management suspend-to-ram

※ 約45秒待つ

[14:47:23.128] aiot-sleep: change mode CPU Idle
[14:47:23.128] armadillo:~#

6.1.2.3. 起床要因のクリア

すべての起床要因をクリアするには次に示すコマンドを実行します。ユーザースイッチによる起床設定は無効化できません。

[armadillo ~]# aiot-set-wake-trigger all disabled
aiot-set-wake-trigger: clear_all disabled

6.1.3. スリープ(SMS 起床可能)モードへの遷移と起床

aiot-sleep-smsコマンドを実行することで、スリープ(SMS 起床可能)モードに遷移することができます。 スリープモードからの起床(アクティブモードに遷移する)条件は、aiot-sleep-smsコマンドを実行する前にaiot-set-wake-triggerコマンドで事前指定します。 ユーザースイッチによる起床は標準で有効になっています。aiot-sleep-smsコマンドを実行した場合SMS受信による起床は強制的に有効になります。 また、起床条件はOR条件での設定が可能です。

aiot-sleep-smsコマンドの実行例を次に示します。

[armadillo ~]# aiot-sleep-sms
aiot-sleep-sms: Power Management suspend-to-ram
AT+CMGF=1
OK

AT^SIND="message",0
^SIND: message,0,0

OK

AT+CMGD=1,4
OK

AT+CMGL="ALL"
OK

[ 3508.609638] PM: suspend entry (deep)

^SIND: message,1,0

OK

[ 3508.613982] PM: Syncing filesystems ... done.
[ 3508.637946] Freezing user space processes ... (elapsed 0.001 seconds) done.
[ 3508.646276] OOM killer disabled.
[ 3508.649527] Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done.
[ 3508.658161] Suspending console(s) (use no_console_suspend to debug)

※ SMS受信

[ 1767.567686] OOM killer enabled.
[ 1767.570875] Restarting tasks ... done.
[ 1767.606048] PM: suspend exit
aiot-sleep: change mode CPU Idle
[警告]

ご利用の SMS 送信サービスの SMS 送信制限により SMS の送信ができないことがあります。また、ネットワーク状態によって SMS の受信を検知できなかったり、検知が遅れることがあります。

起床要因として SMS のみを設定されるシステムを想定されている場合は、上記検知できない可能性を考慮して RTC など別な起床要因で周期的に起床することを推奨します。

また「LTE モデム EMS31-J 省電力などの設定 (Cat.M1 モデル)」の初期値では、SMS 受信を検知して起床するまでに最長で 3 分かかります。より短時間で起床する必要がある場合は psm と edrx を disable に設定する対応をご検討ください。

[警告]

aiot-sleep-sms でスリープモードへ遷移する際、LTE モジュールの SMS 保存用ストレージに空きがない場合 SMS 受信での起床ができなくなるため、LTE モジュールのストレージから 1 件 SMS を削除してからスリープモードへ遷移します。

SMS で受信した内容が必要な場合は、 SMS の内容を別なファイルなどに保存してから aiot-sleep-sms を実施してください。

6.1.4. 状態遷移トリガにコンテナ終了通知を利用する

動作中のコンテナの終了をトリガに、省電力状態のモードへの遷移を行うことができます。

[注記]

コンテナの終了契機は「/etc/atmark/containers/*.confファイルの set_command で指定したコンテナ起動時に実行するコマンド」のプロセスが終了した時」となります。 ファイルの詳細は 「イメージからコンテナを作成する」 を参照してください。

遷移先の動作モードと起床条件は設定ファイルで指定し、 コンテナが終了すると指定した動作モードへ遷移、指定した起床条件が発生すると 省電力モードから復帰します。また、その際自動的にコンテナも開始します。

コンテナ終了時に遷移する動作モードと起床条件については、設定ファイル(/etc/atmark/power-utils.conf)で指定します。 設定ファイルは下記の通り、 TARGET , MODE , WAKEUP を指定します。

[armadillo ~]# cat /etc/atmark/power-utils.conf
TARGET='a6e-gw-container'
MODE='NONE'
WAKEUP='SW1', 'USB', 'UART', 'GPIO', 'SMS', 'RTC:60', 'AIN'

設定ファイルの概要を以下に示します。

表6.2 設定パラメーター

パラメーター名 意味

TARGET

状態遷移トリガの対象となるコンテナ名

MODE

遷移先の動作モード

WAKEUP

起床条件


表6.3 遷移先の動作モード

モード名 設定値

省電力・間欠動作OFF

NONE (初期値)

シャットダウンモード

SHUTDOWN

スリープモード

SLEEP


表6.4 起床条件

起床条件設定値

RTC

RTC:[コンテナ終了からの経過秒数[a]]

SW1 押下

SW1

GPIO 割り込み

GPIO

USB デバイス接続

USB

UART データ受信

UART

SMS 受信

SMS

AIN [b]

アナログ入力電圧閾値割り込み発生時

[a] 現在時刻からの経過秒数は MODE が SHUTDOWN の場合は 180秒以上、SLEEP の場合は 60秒以上を指定する必要があります。

[b] Armadillo-IoT ゲートウェイ +Di8+Ai4 のみ使用可能です


[警告]

Cat.1 モデルで SMS 受信を起床条件に指定すると、間欠動作が正常に動作しません。SMS はデフォルトで起床条件に含まれているため、 Cat.1 モデルで間欠動作を実施する際は WAKEUP から削除してください。

以下は遷移する動作モードがシャットダウンモード、起床条件が RTC(300秒後起床) のパターンです。 起床条件に RTC を設定した場合、「RTCアラーム割り込みでの起床」 で説明している、SoC 外付け RTC による分単位のアラーム割り込みで起床します。 そのため、RTC:300 で"300秒後起床"を指定した場合、実際に起床するまでの時間は、コンテナ終了から300秒~359秒の間となります。 なお、デフォルトでは省電力・間欠動作は OFF (MODE=NONE) となっています。

[armadillo ~]# vi /etc/atmark/power-utils.conf
TARGET='a6e-gw-container'
MODE='SHUTDOWN'
WAKEUP='RTC:300'

設定ファイル(/etc/atmark/power-utils.conf)変更後、変更内容を永続化するには図6.5「状態遷移トリガにコンテナ終了通知を利用する場合の設定値を永続化する」に示すコマンドを実行してください。

[armadillo ~]# persist_file /etc/atmark/power-utils.conf

図6.5 状態遷移トリガにコンテナ終了通知を利用する場合の設定値を永続化する


状態遷移トリガの対象はデフォルトでゲートウェイコンテナが指定されていますが、任意のコンテナを指定することも可能です。 ここでは、 "my_container" というコンテナを状態遷移トリガの対象にする場合の設定を記載します。

[armadillo ~]# vi /etc/atmark/power-utils.conf 1
TARGET='my_container' 2
MODE='SHUTDOWN'
WAKEUP='RTC:300'
[armadillo ~]# persist_file /etc/atmark/power-utils.conf 3
[armadillo ~]# vi /etc/atmark/containers/my_container.conf 4
set_image docker.io/alpine
set_command ls /
add_args --hooks-dir=/etc/containers/aiot_gw_container_hooks.d 5
[armadillo ~]# persist_file /etc/atmark/containers/my_container.conf 6

図6.6 状態遷移トリガの対象コンテナを設定する


1

設定ファイル(/etc/atmark/power-utils.conf)を編集します。

2

コンテナ名 my_container を指定します。

3

設定内容を永続化します。

4

コンテナの設定ファイル(/etc/atmark/containers/my_container.conf)を編集します。記載内容の詳細は「イメージからコンテナを作成する」を参照してください。

5

コンテナの終了を検知するため、フックを設定します。

6

コンテナの設定内容を永続化します。

6.1.5. コンテナ終了後、指定した秒数だけスリープしてコンテナを再始動する

設定ファイル(/etc/atmark/power-utils.conf)で起床条件に RTC を指定して間欠動作する場合、コンテナが終了してから起床するまでの時間は、指定した秒数よりも最大59秒長くなります。 これは、RTCアラーム割り込みでの起床に使用する、SoC 外付けの RTC による制限です。 以下に述べる方法を使うと、コンテナ終了後、終了前にコンテナアプリケーションが指定した秒数だけスリープして、起床時にコンテナを再始動することができます。 この方法を使う場合、設定ファイル(/etc/atmark/power-utils.conf)の MODEWAKEUP の設定内容は無視されます。

以下に、"my_container"というコンテナをスリープモードへの状態遷移トリガの対象にして、コンテナアプリケーションの終了後50秒後に起床する手順を述べます。

  1. 設定ファイル(/etc/atmark/power-utils.conf)を編集します。
  2. コンテナ名 my_container を TARGET に指定します。
  3. 設定内容を永続化します。
  4. コンテナの設定ファイル(/etc/atmark/containers/my_container.conf)に、図6.7「コンテナ終了後に指定した秒数だけスリープして再始動する場合のコンテナ設定」 に示す行を追加します。
  5. コンテナの設定内容を永続化します。
  6. コンテナアプリケーション自身が、終了する前に /tmp/power-utils/sleep_secs というパスのファイルを作り、そのファイルに、スリープしたい秒数の文字列(つまり 50)を書き込みます。指定可能な秒数は、5 から 3600 です。
  7. コンテナアプリケーションが自発終了します。コンテナアプリケーションが終了するとスリープモードに遷移して、sleep_secs に書き込んだ秒数が経過すると起床してコンテナが始動します。
[ -e /etc/atmark/power-utils ] || mkdir /etc/atmark/power-utils
add_volume /etc/atmark/power-utils:/tmp/power-utils

図6.7 コンテナ終了後に指定した秒数だけスリープして再始動する場合のコンテナ設定


コンテナアプリケーションがスリープしたい秒数を書き込んだ sleep_secs ファイルは、起床時に削除されます。 このファイルが存在しない場合は、コンテナ終了時の状態遷移と起床条件は、設定ファイル(/etc/atmark/power-utils.conf)の MODEWAKEUP で設定した内容になります。

6.2. persist_file について

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

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

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

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

persist_file コマンドの概要を 図6.8「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.8 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.9 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.10 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.11 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.12 persist_file でのパッケージインストール手順例


    1

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

6.3. swupdateを使用してアップデートする

6.3.1. swupdate で可能なアップデート

swupdate を実行する目的としては以下が考えられます。

  1. コンテナをアップデートしたい

    開発したコンテナのアップデートが可能です。

  2. ユーザーデータディレクトリや Armadillo Base OS のファイルを差分アップデートしたい

    ユーザーデータをアップデートする場合は、以下のディレクトリを更新します。

    • /var/app/rollback/volumes

    ユーザーディレクトリについては「電源を切っても保持されるディレクトリ(ユーザーデータディレクトリ)」を参照してください。

    [警告]

    SWUpdate による /var/app/volumes の更新は推奨しません。

    /var/app/volumes が二面化されていないため、書込みの途中で問題が発生した場合、 不完全な書込みになる恐れがあります。

    また、アップデート中にアプリケーションがそのデータに アクセスすると、書込み中のデータにアクセスすることになります。

    /var/app/volumes のデータに対して更新が必要な場合、SWUpdate では /var/app/rollback/volumes に更新するデータを書き込んでください。 その後、次回起動時にアプリケーション側から /var/app/rollback/volumes に書き込んだデータを /var/app/volumes に移動するようにしてください。

  3. Armadillo Base OS を一括アップデートしたい

    アットマークテクノがリリースする Armadillo Base OS の機能追加、更新、セキュリティパッチの追加が可能です。

  4. ブートローダーをアップデートしたい

    アットマークテクノがリリースするブートローダーのアップデートが可能です。

「Armadillo Base OSとは」で示すように、Armadillo Base OS は OS・ブートローダー・コンテナ部分の安全性を担保するため二面化しています。

それにより、万が一アップデートに失敗した場合でも起動中のシステムに影響ありません。

以降、それぞれの目的ごとに swupdate によるアップデートの流れを示します。

6.3.2. コンテナのアップデート、ユーザーデータディレクトリや Armadillo Base OS の差分アップデート

以下にアップデートの流れを示します。

ここでは、boot して起動中の面を A 面、アップデート先の面を B 面とします。

  1. Armadillo Base OS を B 面へコピー

    Armadillo Base OS を B 面にコピーする流れを図6.13「Armadillo Base OS を B 面にコピー」に示します。

    A 面と B 面の Armadillo Base OS が同期しているか確認します。

    同期していない場合、 A 面の Armadillo Base OS を B 面にコピーします。

    同期している場合はコピーしません。

    swdesc_option version で指定するバージョンの書き方については「インストールバージョンを指定する」を参照してください。

    images/abos-images/swupdate/swupdate_copy_to_B_string_extra_os.png

    図6.13 Armadillo Base OS を B 面にコピー


  2. コマンドを順番に実行

    図6.14「desc ファイルに記述したswudesc_* コマンドを実行」に示すように、desc ファイルに記述した順番に従って swudesc_* コマンドを実行します。

    「インストールバージョンを指定する」に示すように、swdesc_* コマンドによって Armadillo Base OS に対して書き込みをする場合は --extra-os オプションをつけてください。

    images/abos-images/swupdate/swupdate_exec_command_string_extra_os.png

    図6.14 desc ファイルに記述したswudesc_* コマンドを実行


    swudesc_* コマンドの種類を表6.5「swudesc_* コマンドの種類」に示します。

    表6.5 swudesc_* コマンドの種類

    おおまかな機能 コマンド名 説明

    ファイル転送
    参照先:「Armadillo へファイルを転送する」

    swdesc_files

    指定したファイルをアップデート先の環境にコピー

    swdesc_tar

    指定した tar アーカイブをアップデート先の環境に展開してコピー

    コマンド実行
    参照先:「Armadillo 上で任意のコマンドを実行する」

    swdesc_command

    指定したコマンドをアップデート先の環境で実行

    swdesc_script

    指定したスクリプトをアップデート先の環境で実行

    ファイル転送 + コマンド実行
    参照先:「Armadillo にファイルを転送し、そのファイルをコマンド内で使用する」

    swdesc_exec

    指定したファイルをアップデート先の環境にコピーした後、そのファイル名を"$1"としてコマンドを実行

    起動中の面に対してコマンド実行(非推奨)
    参照先:「動作中の環境でのコマンドの実行」

    swdesc_command_nochroot

    指定したコマンドを起動中の環境で実行

    swdesc_script_nochroot

    指定したスクリプトを起動中の環境で実行

    起動中の面に対してファイル転送 + コマンド実行(非推奨)
    参照先:「動作中の環境でのコマンドの実行」

    swdesc_exec_nochroot

    指定したファイルを起動中の環境にコピーした後、そのファイル名を"$1"としてコマンドを実行

    コンテナイメージの転送
    参照先:「Armadillo にコンテナイメージを転送する」

    swdesc_embed_container

    SWU ファイルに含まれるコンテナイメージの tar アーカイブをアップデート先の環境に展開

    swdesc_pull_container

    アップデート先の環境でコンテナイメージをダウンロード

    swdesc_usb_container

    SWU ファイルに含めない形で用意したコンテナイメージの tar アーカイブをアップデート先の環境に展開


  3. アップデート完了後の挙動

    デフォルトではアップデート後に再起動( POST_ACTION=reboot )が行われます。

    images/abos-images/swupdate/swupdate_post_action_string_extra_os.png

    図6.15 アップデート完了後の挙動


    アップデート後の挙動を変更するには desc ファイルに swdesc_option POST_ACTION を追加してください。

    swdesc_option POST_ACTION に指定できる挙動の種類を表6.6「アップデート完了後の挙動の種類」に示します。

    表6.6 アップデート完了後の挙動の種類

    オプション名 説明

    container

    アップデート後にコンテナのみを再起動
    (ただし、アップデート時に --extra_os オプションを指定したコマンドが実行された場合は reboot になる)

    poweroff

    アップデート後にシャットダウン

    reboot

    アップデートの後に再起動

    wait

    アップデート後に再起動は行われず、次回起動時に B 面に切り替わる


    swdesc_option POST_ACTION の詳細は「SWUpdate 実行中/完了後の挙動を指定する」を参照してください。

  4. B 面への切り替え

    図6.16「B 面への切り替え」に示すように、正常にアップデートが行われると、次回起動時に B 面に切り替わります。

    images/abos-images/swupdate/swupdate_boot_string_extra_os.png

    図6.16 B 面への切り替え


  5. desc ファイルの書き方の例

    下記に SWUpdate を用いたアップデートの例を示します。

6.3.3. Armadillo Base OS の一括アップデート

アップデートの流れを示します。

ここでは、boot して起動中の面を A 面、アップデート先の面を B 面とします。

  1. Armadillo Base OS とアップデート後に保持するファイルを B 面へコピー

    Armadillo Base OS とアップデート後に保持するファイルを B 面にコピーする流れを図6.17「Armadillo Base OS とファイルを B 面にコピー」に示します。

    「インストールバージョンを指定する」に示すように、Armadillo Base OS の tar アーカイブを展開する swdesc_tar コマンドに --base-os オプションをつけてください。

    swdesc_option version で指定するバージョンの書き方については「インストールバージョンを指定する」を参照してください。

    images/abos-images/swupdate/swupdate_copy_to_B_base_os.png

    図6.17 Armadillo Base OS とファイルを B 面にコピー


    1. /etc/swupdate_preserve に記載された POST 指定以外のファイルを B 面にコピーします。
    2. SWU ファイル内にある Armadillo Base OS を B 面に展開します。
    3. /etc/swupdate_preserve に記載された POST 指定のファイルを B 面にコピーします。

    /etc/swupdate_preserve への追記方法については「swupdate_preserve_files について」「/etc/swupdate_preserve_fileへの追記」を参照してください。

  2. コマンドを順番に実行

    図6.18「desc ファイルに記述したswudesc_* コマンドを実行」に示すように、desc ファイルに記述した順番に従って swudesc_* コマンドを実行します。

    「インストールバージョンを指定する」に示すように、swdesc_* コマンドによって Armadillo Base OS に対して書き込みをする場合は --extra-os オプションをつけてください。

    images/abos-images/swupdate/swupdate_exec_command_base_os.png

    図6.18 desc ファイルに記述したswudesc_* コマンドを実行


    swudesc_* コマンドの種類を表6.7「swudesc_* コマンドの種類」に示します。

    表6.7 swudesc_* コマンドの種類

    おおまかな機能 コマンド名 説明

    ファイル転送
    参照先:「Armadillo へファイルを転送する」

    swdesc_files

    指定したファイルをアップデート先の環境にコピー

    swdesc_tar

    指定した tar アーカイブをアップデート先の環境に展開してコピー

    コマンド実行
    参照先:「Armadillo 上で任意のコマンドを実行する」

    swdesc_command

    指定したコマンドをアップデート先の環境で実行

    swdesc_script

    指定したスクリプトをアップデート先の環境で実行

    ファイル転送 + コマンド実行
    参照先:「Armadillo にファイルを転送し、そのファイルをコマンド内で使用する」

    swdesc_exec

    指定したファイルをアップデート先の環境にコピーした後、そのファイル名を"$1"としてコマンドを実行

    起動中の面に対してコマンド実行(非推奨)
    参照先:「動作中の環境でのコマンドの実行」

    swdesc_command_nochroot

    指定したコマンドを起動中の環境で実行

    swdesc_script_nochroot

    指定したスクリプトを起動中の環境で実行

    起動中の面に対してファイル転送 + コマンド実行(非推奨)
    参照先:「動作中の環境でのコマンドの実行」

    swdesc_exec_nochroot

    指定したファイルを起動中の環境にコピーした後、そのファイル名を"$1"としてコマンドを実行

    コンテナイメージの転送
    参照先:「Armadillo にコンテナイメージを転送する」

    swdesc_embed_container

    SWU ファイルに含まれるコンテナイメージの tar アーカイブをアップデート先の環境に展開

    swdesc_pull_container

    アップデート先の環境でコンテナイメージをダウンロード

    swdesc_usb_container

    SWU ファイルに含めない形で用意したコンテナイメージの tar アーカイブをアップデート先の環境に展開

    ブートローダーの更新
    参照先:「Armadillo のブートローダーを更新する」

    swdesc_boot

    SWU ファイルに含まれるブートローダーをアップデート先の環境に展開


  3. アップデート完了後の挙動

    デフォルトではアップデート後に再起動( POST_ACTION=reboot )が行われます。

    images/abos-images/swupdate/swupdate_post_action_base_os.png

    図6.19 アップデート完了後の挙動


    アップデート後の挙動を変更するには desc ファイルに swdesc_option POST_ACTION を追加してください。

    swdesc_option POST_ACTION に指定できる挙動の種類を表6.8「アップデート完了後の挙動の種類」に示します。

    表6.8 アップデート完了後の挙動の種類

    オプション名 説明

    poweroff

    アップデート後にシャットダウン

    reboot

    アップデートの後に再起動

    wait

    アップデート後に再起動は行われず、次回起動時に B 面に切り替わる


    swdesc_option POST_ACTION の詳細は「SWUpdate 実行中/完了後の挙動を指定する」を参照してください。

  4. B 面への切り替え

    図6.20「B 面への切り替え(component=base_os)」に示すように、正常にアップデートが行われると、次回起動時に B 面に切り替わります。

    images/abos-images/swupdate/swupdate_boot_B_base_os.png

    図6.20 B 面への切り替え(component=base_os)


  5. desc ファイルの書き方の例

    下記に SWUpdate を用いたアップデートの例を示します。

6.3.4. ブートローダーのアップデート

swdesc_* コマンドには、swdesc_boot を指定してください。

swdesc_boot については「Armadillo のブートローダーを更新する」を参照してください。

ブートローダーのアップデートの流れは以下の通りです。

  • desc ファイルに swdesc_boot がある場合

    SWU ファイルに含まれるブートローダーを B 面に書き込む

  • desc ファイルに swdesc_boot がない場合

    A 面のブートローダーを B 面にコピーする

下記に SWUpdate を用いたアップデートの例を示します。

6.3.5. 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のすべてがコピーされます。

      swdesc_tar コマンドで rootfs (Armadillo Base OS) の tar アーカイブを展開する時に、--base-os オプションをつけることで component に base_os を指定したときと同じ動作となります。

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

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

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

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

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

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

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

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

  • バージョンの指定方法

    swdesc_option version で指定可能なバージョンのフォーマットは以下の 2 種類があります。

    • x[.y[.z[-t]]]

      x, y, z にはそれぞれ 0 ~ 2147483647 の整数を適用してください。 t には任意のアルファベットまたは 0 ~ 147483647 の整数を適用してください。

      成功例は以下です:

      • 1
      • 1.2.3
      • 1.2.3-4
      • 1.2.3-abc.4
      • 1.2.3-a.b.c.4

      失敗例は以下です:

      • 2147483648

        x には 0 ~ 2147483647 の整数を適用してください。

      • 1.2.3-a.2147483648

        t には 0 ~ 2147483647 の整数を適用してください。

      • 1.2.3-abc123

        t には 数字とアルファベットを混在しないでください。 1.2.3-abc.123 ならば可能です。

      • a.2.3

        x にはアルファベットではなく 0 ~ 2147483647 の整数を適用してください。

      • 1.1.1.1-a

        x[.y[.z[-t]]]の形式で書いてください。

    • x.y.z.t

      x, y, z, t にはそれぞれ 0 ~ 65535 の整数を適用してください。

      成功例は以下です:

      • 1.2.3.4
      • 65535.65535.65535.65535
      • 65535.2.3.4

      失敗例は以下です:

      • 65536.2.3.4

        x には 0 ~ 65535 の整数を適用してください。

      • 1.2.3.a

        t にはアルファベットではなく 0 ~ 65535 の整数を適用してください。

      • 1.2.3.4.5

        x.y.z.t の形式で書いてください。

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

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

    swdesc_tar [--dest <dest>] [--preserve-attributes] <tar_file>
    swdesc_files [--dest <dest>] [--basedir <basedir>] [--preserve-attributes] \
                 <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 を使ってください。

    --preserve-attributes を指定しない場合はファイルのオーナー、モード、タイムスタンプ等が保存されませんので、必要な場合は設定してください。バージョンが base_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. 動作中の環境でのコマンドの実行

[警告]

本節で紹介する swdesc_command_nochrootswdesc_script_nochrootswdesc_exec_nochroot は基本的に使用することはありません。

swdesc_commandswdesc_scriptswdesc_exec をご使用ください。

  • swdesc_command_nochroot, swdesc_script_nochroot, swdesc_exec_nochroot は アップデート先の環境ではなく動作中の環境でコマンドを実行します。

    使い方は「Armadillo へファイルを転送する」「Armadillo にファイルを転送し、そのファイルをコマンド内で使用する」に示した nochroot なしのバージョンと同じです。

    アップデート先の環境は /target にマウントされるので、nochroot のコマンドを用いてアップデート先の環境に対してアクセスすることは可能です。

    しかし、その方法によるアップデート先の環境に対するコマンドの実行は nochroot なしのコマンドでは実現できない特殊な場合にのみ行ってください。

    [警告]

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

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

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

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

  • swdesc_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-IoT ゲートウェイ A6Eを再起動せずにコンテナだけを再起動させます。
  • 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-IoT ゲートウェイ A6E 向けのイメージをインストールする方法

Armadillo-IoT ゲートウェイ A6E 向けのアップデートイメージに 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-IoT ゲートウェイ A6E 向けのイメージをインストールする方法」 を参考にしてください。

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

  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. コンテナの概要と操作方法を知る

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

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

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

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

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

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

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

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

6.8.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.21 コンテナを作成する実行例


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.8.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.22 イメージ一覧の表示実行例


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

[armadillo ~]# podman images --help

図6.23 podman images --help の実行例


6.8.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.24 コンテナ一覧の表示実行例


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

[armadillo ~]# podman ps --help

図6.25 podman ps --help の実行例


6.8.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.26 コンテナを起動する実行例


-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.27 コンテナを起動する実行例(a オプション付与)


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

[armadillo ~]# podman start --help

図6.28 podman start --help 実行例


6.8.2.5. コンテナを停止する

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

[armadillo ~]# podman stop my_container
my_container

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


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

[armadillo ~]# podman stop --help

図6.30 podman stop --help 実行例


6.8.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.31 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.8.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.32 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.33 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.8.2.8. コンテナを削除する

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

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

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


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

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

6.8.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.35 イメージを削除する実行例


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

[armadillo ~]# podman rmi --help

図6.36 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.37 Read-Onlyのイメージを削除する実行例


6.8.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.38 コンテナ内部のシェルを起動する実行例


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

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

[container ~]# exit

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


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

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

[armadillo ~]# podman exec --help

図6.40 podman exec --help 実行例


6.8.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.41 コンテナを作成する実行例


コンテナに割り当てられた 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.42 コンテナの 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.43 ping コマンドによるコンテナ間の疎通確認実行例


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

6.8.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.44 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.8.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.45 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.8.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.8.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.8.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.46 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.47 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.8.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.8.2.18. 開発時に有用な—privilegedオプション

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

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

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

[警告]

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

6.8.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.48 Armadillo 上のコンテナイメージを削除する


6.8.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.49 abos-ctrl container-clear 実行例


6.8.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.50 コンテナを自動起動するための設定例


.conf ファイルに設定可能なパラメーターの説明を以下に記載します。 podman_start --long-help コマンドでも詳細を確認できます。

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

set_image [イメージ名]

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

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

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

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

6.8.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.8.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.8.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のファームウェアを使えます。

「:」はホスト側のパスとコンテナの側のパスを分割する意味があるため、ファイル名に「:」を使用することはできません。 ホスト側のパスにのみ「:」が含まれてる場合は「 add_volumes "[ホストパス]" "[コンテナパス]" "[オプション]" 」と指定することで設定できます。

[ティップ]

複数のコンテナでマウントコマンドを実行することがあれば、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_devices /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.51 ボリュームを shared でサブマウントを共有する例


1

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

2

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

3

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

4

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

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

add_hotplugs [デバイスタイプ]

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

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

: add_hotplugs input

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

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

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

input

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

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

video4linux

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

/dev/video0 など

sd

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

/dev/sda1 など


表6.9「add_hotplugsオプションに指定できる主要な文字列」に示した文字列の他にも、/proc/devicesの数字から始まる行に記載されている文字列を指定することができます。 図6.52「/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.52 /proc/devicesの内容例


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

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

: add_hotplugs input video4linux sd

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

add_armadillo_env

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

: add_armadillo_env

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

表6.10 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-IoT A6E

AT_SERIAL_NUMBER

個体番号

00C900010001


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

[container ~]# echo $AT_SERIAL_NUMBER
00C900010001

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


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

6.8.4.7. pod の選択

set_pod [ポッド名]

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

: set_pod mypod

6.8.4.8. ネットワークの選択

set_network [ネットワーク名]

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

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

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

: set_network mynetwork

6.8.4.9. IP アドレスの設定

set_ip [アドレス]

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

: set_ip 10.88.0.100

[ティップ]

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

6.8.4.10. 読み取り専用設定

set_readonly yes

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

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

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

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

set_pull [設定]

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

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

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

set_pull missingset_pull always

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

set_restart [設定]

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

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

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

: set_restart alwaysset_restart no

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

set_init no

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

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

: set_init no

6.8.4.14. podman logs 用のログサイズ設定

set_log_max_size <サイズ>

podman logs でログを表示するために /run にログファイルを保存しています。 そのログのサイズが設定したサイズを越えるとクリアされます。デフォルトは「1MB」です。

6.8.4.15. podman のフックの仕組み

add_hook --stage <ステージ> [--] コマンド [コマンド引数]

コンテナが起動されるなど、動作ステージの変化をフックとしてコマンドを実行します。 複数のステージで実行したい場合は --stage オプションを複数設定してください。

指定可能なステージは precreate, prestart, createRuntime, createContainer, startContainer, poststart, と poststop です。 ステージの意味や使用方法の詳細は podman のドキュメンテーションを参照してください。

[警告]

Armadillo Base OS 3.19.1-at.4 現在では set_restart によるコンテナの再起動でも 1 度目の停止時のみ poststop フックが実行されます。 2 度目以降の停止では実行されませんのでご注意ください。

6.8.4.16. ヘルスチェック機能の設定

set_healthcheck [引数] [--] コマンド [コマンド引数]

定期的にコマンドを実行して、コンテナの正常性を確認します。 指定可能な引数は以下のとおりです:

  • --retries <リトライ数>: エラーを検知するまでのリトライ回数。(デフォルト: 3)
  • --action <none|restart|kill|stop|reboot|rollback>: 指定したリトライ回数分連続でチェックが失敗したときのアクション (デフォルト: restart ):

    • none: set_healthcheck_fail_command に指定した処理を実行する以外何もしません。
    • restart: コンテナを再起動します。 set_restart オプションと異なり、コンテナを起動しなおし初期状態で再起動します。
    • kill/stop: コンテナを停止します。
    • reboot: Armadillo を再起動します。
    • rollback: ロールバック可能の場合はロールバックして Armadillo を再起動します。ロールバック不可能な場合はそのまま Armadillo を再起動します。
  • --interval <時間>: チェックする時間間隔です。(デフォルト: 1 min)
  • --start-period <時間>: 最初のチェックを実行する前の待ち時間です。(デフォルト: interval 設定の値)
  • --timeout <秒数>: 設定された時間以内にヘルスチェックが終了しなかった場合は失敗となります。(デフォルト: 無し)

また、いくつかのタイミングでコマンドを実行させることができます:

  • set_healthcheck_start_command コマンド [コマンド引数]: コンテナ起動後にヘルスチェックが初めて成功した際に実行されるコマンドです。
  • set_healthcheck_fail_command コマンド [コマンド引数]: ヘルスチェックが retries 回失敗した後に実行されるコマンドです。このコマンドは set_healthcheck--action 設定の前に実行されますので、コマンドだけを実行したい場合は --action none で無効化してください。
  • set_healthcheck_recovery_command コマンド [コマンド引数]: ヘルスチェックが retries 回失敗した後に再び成功した際に実行されるコマンドです。コンテナを起動する際に成功せずに失敗した場合は、その 1 回目の成功の際に set_healthcheck_start_command で設定されたコマンドのみが実行されます。

: set_healtcheck -- curl -s --fail http://localhost:8080/status
: set_healthcheck_start_command abos-ctrl rollback-clone

armadillo:~# grep podman_atmark /var/log/messages
Jun 20 11:33:21 armadillo user.notice podman_atmark: my_container healthcheck is now healthy (was starting)
Jun 20 11:33:21 armadillo user.notice podman_atmark: my_container first healthy check: running abos-ctrl rollback-clone
Jun 20 11:40:21 armadillo user.notice podman_atmark: my_container healthcheck failed (from healthy, 1 / 3)
Jun 20 11:41:21 armadillo user.notice podman_atmark: my_container healthcheck failed (from healthy, 2 / 3)
Jun 20 11:42:21 armadillo user.notice podman_atmark: my_container healthcheck failed (from healthy, 3 / 3)
Jun 20 11:42:21 armadillo user.notice podman_atmark: my_container is unhealthy, restarting container
Jun 20 11:43:21 armadillo user.notice podman_atmark: my_container healthcheck is now healthy (was failed)

図6.54 上記の例でエラーを発生させた際の起動ログ


6.8.4.17. 自動起動の無効化

set_autostart no または set_autostart create

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

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

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

[ティップ]

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

6.8.4.18. 実行コマンドの設定

set_command [コマンド]

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

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

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

add_args [引数]

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

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

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

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

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

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

  1. インストール用のプロジェクトを作成する

    VSCode の左ペインの [A6E] から [Atmark Container New Project] を実行し、 表示されるディレクトリ選択画面からプロジェクトを保存するディレクトリを選択してください。 保存先を選択すると、プロジェクト名を入力するダイアログが表示されるので、 任意のプロジェクト名を入力してエンターキーを押してください。 この操作により、選択した保存先に、入力したプロジェクト名と同名のディレクトリが作成されます。

    また、ここでは次のように設定しています。

    • 保存先 : ホームディレクトリ
    • プロジェクト名 : my_project

      images/abos-images/armadillo_setup_vscode_container_new_project_a6e.png

      図6.55 インストール用のプロジェクトを作成する


  2. SWU イメージを作成する

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

    images/abos-images/armadillo_setup_vscode_at_debian_image_container_setup.png

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


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

  3. SBOM 生成に関わる設定を行う

    ABOSDE から作成した場合は SBOM が同時に生成されます。 詳細は 「SBOM 生成に関わる設定を行う」 をご確認ください。 SBOM の生成には以下の二つのファイルが必要です。

    • コンフィグファイル
    • desc ファイル

      SBOM の生成にはライセンス情報を示したコンフィグファイルを使用します。 コンフィグファイルは container_setup/at-debian-image-armv7.sbom_config.yaml.tmpl になります。 SWU イメージ作成時にこのコンフィグファイルからバージョン番号をアップデートした container_setup/at-debian-image-armv7.sbom_config.yaml が生成されます。

      リリース時にはコンフィグファイルの内容を確認し、正しい内容に変更してください。 各項目の詳細な説明については SPDX specification v2.2.2 (https://spdx.github.io/spdx-spec/v2.2.2/) をご覧ください。 SBOM に含めるコンテナイメージ等の情報については desc ファイルに記載されています。 各項目の説明については 「desc ファイルを編集する」 をご覧ください。

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

Armadillo-IoT ゲートウェイ A6E コンテナ から 「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.57 Docker ファイルによるイメージのビルドの実行例


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

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

Armadillo-IoT ゲートウェイ A6E コンテナ から 「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.58 ビルド済みイメージを load する実行例


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

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

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

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

images/abos-images/armadillo_setup_vscode_alpine_container_setup.png

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


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

6.8.6.1. SBOM 生成に関わる設定を行う

ABOSDE から作成した場合は SBOM が同時に生成されます。 詳細は 「SBOM 生成に関わる設定を行う」 をご確認ください。 SBOM の生成には以下の二つのファイルが必要です。

  • コンフィグファイル
  • desc ファイル

SBOM の生成にはライセンス情報を示したコンフィグファイルを使用します。 コンフィグファイルは container_setup/alpine.sbom_config.yaml.tmpl になります。 SWU イメージ作成時にこのコンフィグファイルからバージョン番号をアップデートした container_setup/alpine.sbom_config.yaml が生成されます。

リリース時にはコンフィグファイルの内容を確認し、正しい内容に変更してください。 各項目の詳細な説明については SPDX specification v2.2.2 (https://spdx.github.io/spdx-spec/v2.2.2/) をご覧ください。 SBOM に含めるコンテナイメージ等の情報については desc ファイルに記載されています。 各項目の説明については 「desc ファイルを編集する」 をご覧ください。

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

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

6.8.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.60 コンテナの 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.61 ip コマンドを用いたコンテナの IP アドレス確認例


6.8.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.62 ユーザ定義のネットワーク作成例


コンテナを作成する際に、上記で作成したネットワークと設定したい 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.63 IP アドレス固定のコンテナ作成例


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

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

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


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

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

6.8.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.65 コンテナに 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.66 コンテナに lighttpd をインストールする例


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

6.8.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.67 コンテナに vsftpd をインストールする例


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

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

図6.68 ユーザを追加する例


作成したユーザで 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.69 設定ファイルの編集例


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

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

図6.70 vsftpd の起動例


6.8.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.71 コンテナに 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.72 ユーザを追加する例


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

[container ~]# smbd

図6.73 samba の起動例


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

6.8.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.74 コンテナに 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.75 sqlite の実行例


6.8.9. コンテナからの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.76 コンテナからshutdownを行う


6.8.10. 異常検知

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

6.8.10.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.77 ソフトフェアウォッチドッグタイマーを使うためのコンテナ作成例


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

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

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


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

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

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


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

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

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


6.9. ゲートウェイコンテナを動かす

Armadillo-IoT ゲートウェイ A6E にはゲートウェイコンテナがプリインストールされています。 本章は、ゲートウェイコンテナを動かす方法について記載しています。

ゲートウェイコンテナは 「ゲートウェイコンテナの概要」 に記載している通り、各インターフェースから取得するデータの設定や、接続するクラウドの情報を設定するだけで、 コンテナ内で動作するアプリケーションを修正することなく、クラウドにデータを送信することができます。

6.9.1. ゲートウェイコンテナ利用の流れ

以下では、必要機器の接続やネットワークの設定は完了しているものとして説明を進めます。 一連の流れは下記の通りです。

ゲートウェイコンテナでは AWS IoT Core と Azure IoT への接続をサポートしています。 それぞれについて、データの可視化までを行うことが出来る環境を構築するためのテンプレートを提供しています。

  1. ゲートウェイコンテナ起動確認
  2. 接続先の クラウド 環境を構築 (クラウドにデータを送信する場合)

    1. AWS IoT Core
    2. Azure IoT Hub
  3. コンフィグ 設定

    1. インターフェース設定
    2. 接続先クラウド設定
  4. コンテナ起動・実行
  5. コンテナ終了

6.9.2. ゲートウェイコンテナ起動確認

ゲートウェイコンテナは、デフォルトで Armadillo-IoT ゲートウェイ A6E に電源を入れると自動的に起動する設定となっています。 Armadillo が起動し、ゲートウェイコンテナが起動・実行されると、 アプリケーション LED が点滅します。

6.9.3. 接続先の クラウド 環境を構築 (AWS)

AWS では、 AWS IoT Core と Amazon CloudWatch を組み合わせてデータの可視化を行います。 本項では、 AWS 上で実施する設定を記載します。

手順中で使用するファイルは、Armadillo-IoT ゲートウェイ A6E ゲートウェイコンテナ から「Armadillo-IoT ゲートウェイ A6E クラウド設定データ」ファイル (a6e-gw-container-cloudsetting-[VERSION].zip) から予めダウンロードしておきます。

6.9.3.1. AWS アカウントを作成する

AWS アカウントの作成方法については、AWS 公式サイトの AWS アカウント作成の流れ https://aws.amazon.com/jp/register-flow/ を参照してください。

6.9.3.2. IAM ユーザーを作成する

AWS IAM (Identity and Access Management) は、AWS リソースへのアクセスを安全に管理するためのウェブサービスです。IAM により、誰を認証(サインイン)し、誰にリソースの使用を承認する(アクセス許可を持たせる)かを管理することができます。

  1. IAM へ移動し、「アクセス管理」→「ポリシー」を開き、「ポリシー作成」をクリックします。

    images/a6e-aws-create-policy.png
  2. 「JSON」を選択し、「Armadillo-IoT ゲートウェイ A6E クラウド設定データ」ファイル (a6e-gw-container-cloudsetting-[VERSION].zip) AWS フォルダ内の a6e_aws_iam_policy.json のファイルの内容を貼り付け、「次のステップ:タグ」をクリックします。

    images/a6e-aws-policy-json.png
  3. 何も選択せずに、「次のステップ:確認」をクリックします。
  4. ポリシー名を入力し、「ポリシーの作成」をクリックします。ここでは、ポリシー名を "policy_for_A6E" としています。

    images/a6e-aws-policy-confirm.png
  5. IAM から、「アクセス管理」→「ユーザー」を開き、「ユーザーを追加」をクリックします。

    images/a6e-aws-create-user.png
  6. 下記の通り入力、選択し、「次へ」をクリックします。

    • ユーザー名を入力する
    • 「AWS マネジメントコンソールへのユーザーアクセスを提供する - オプション」を選択する
    • コンソールパスワードは「自動生成されたパスワード」を選択する
    • 「ユーザーは次回のサインイン時に新しいパスワードを作成する必要があります (推奨)。」にチェックを入れる
    images/a6e-aws-user.png
  7. 「ポリシーを直接アタッチする」をクリックし、先ほど作成したポリシーを選択して、「次へ」をクリックします。

    images/a6e-aws-user-attach-policy.png
  8. 表示される内容を確認し、「ユーザーの作成」をクリックします。

    images/a6e-aws-user-confirm.png
  9. 「.csv ファイルをダウンロード」をクリックし、"<ユーザー名>_credentials.csv" をダウンロードして、「ユーザーリストに戻る」をクリックします。

    images/a6e-aws-user-success.png

6.9.3.3. アクセスキーを作成する

  1. 作成したユーザーをユーザーリストの中から選択します。

    images/a6e-aws-create-accesskey-userlist.png
  2. ユーザー情報画面の「セキュリティ認証情報」-「アクセスキーを作成」をクリックします。

    images/a6e-aws-create-accesskey-user.png
  3. 「AWS の外部で実行されるアプリケーション」を選択し、「次へ」をクリックします。

    images/a6e-aws-create-accesskey-usecase.png
  4. 「アクセスキーを作成」をクリックします。
  5. 「.csv ファイルをダウンロード」をクリックし、"<ユーザー名>_accessKeys.csv" をダウンロードして、「完了」をクリックします。

    images/a6e-aws-create-accesskey-success.png

6.9.3.4. Armadillo-IoT ゲートウェイ A6E のシリアル番号を取得する

AWS IoT Core に登録する Thing 名は Armadillo のシリアル番号を使用します。 環境設定時、パラメータに指定する必要があるため、下記のコマンドを実行しシリアル番号を取得します。

armadillo:~# hexdump -v -s 0xa0 -n 8 -e '/4 "%08X"' /sys/bus/nvmem/devices/imx-ocotp0/nvmem | cut -c 5-
00CD11112222 1

1

この場合、00CD11112222 がシリアル番号になります

6.9.3.5. AWS IoT Core と Amazon CloudWatch の設定を行う

AWS IoT Core に送信したデータを Amazon CloudWatch のダッシュボード上で可視化します。 ここでは、CloudFormation を用いて AWS IoT Core と Amazon CloudWatch の設定を行います。

  1. CloudFormation へ移動し、「スタックの作成」→「新しいリソースを使用(標準)」をクリックします。

    images/a6e-aws-cloudformation-create.png
  2. 「テンプレートファイルのアップロード」で「Armadillo-IoT ゲートウェイ A6E クラウド設定データ」ファイル (a6e-gw-container-cloudsetting-[VERSION].zip) AWS フォルダ内の a6e_aws_cfn_template.yml を選択し、「次へ」をクリックします。

    images/a6e-aws-cloudformation-upload.png
  3. スタック名を入力します。また、 「Armadillo-IoT ゲートウェイ A6E のシリアル番号を取得する」 で取得したシリアル番号をパラメータに指定し、「次へ」をクリックします。

    images/a6e-aws-cloudformation-param.png
  4. そのまま「次へ」をクリックします。
  5. チェックボックスを選択し、「スタックの作成」をクリックします。

    images/a6e-aws-cloudformation-stack.png
  6. 作成したスタックのステータスが"CREATE_COMPLETE" になったら作成完了です。

    images/a6e-aws-cloudformation-complete.png

6.9.3.6. 設定に必要となるパラメータを取得する

「接続先クラウド情報の設定」 で設定するパラメータを取得します。

  1. AWS IoT Core エンドポイント

    1. IoT Core へ移動し、サイドバー下部にある設定をクリックします。

      images/a6e-aws-check_endpoint1.png
    2. IoT Core エンドポイントが表示されます。

      images/a6e-aws-check_endpoint2.png
  2. アカウント ID

    1. AWS コンソール画面右上の ▼ をクリックします。

      images/a6e-aws-check_accountid1.png
    2. 下記画像の丸で囲んだマークをクリックすると、コピーすることができます。

      images/a6e-aws-check_accountid2.png

6.9.4. 接続先の クラウド 環境を構築 (Azure)

Azure の場合は、 Azure IoT Hub にデータを送信します。 本項では、 Azure portal 上で実施する設定を記載します。

手順中で使用するファイルは、Armadillo-IoT ゲートウェイ A6E ゲートウェイコンテナ から「Armadillo-IoT ゲートウェイ A6E クラウド設定データ」ファイル (a6e-gw-container-cloudsetting-[VERSION].zip) にアップロードしています。

6.9.4.1. Microsoft アカウントを作成する

Microsoft アカウントの作成については、Microsoft 公式ページ https://account.microsoft.com/ を参照してください。なお、サブスクリプションの設定も必要となります。

6.9.4.2. リソースグループを作成する

リソースグループの作成を行います。

  1. Azure portal から [リソース グループ] を開き、[作成] を選択します。
  2. サブスクリプションとリージョンを選択し、リソースグループ名を入力の後、[確認および作成] を選択します。

    images/a6e-azure-create-resource-group.png

6.9.4.3. Azure IoT Hub と Azure IoT Hub Device Provisioning Service の設定を行う

ここでは、データの送信先となる Azure IoT Hub と、デバイスプロビジョニングのヘルパーサービスである Azure IoT Hub Device Provisioning Service (以降、DPS と記載) の設定を行います。

[注記]

以下の手順はアットマークテクノが提供する設定ファイルを用いて設定を行っていますが、 Azure portal で作成した Azure IoT Hub / DPS に接続することも可能です。 DPS の個別登録機能を用いてデバイスプロビジョニングを行うため、以下のドキュメントを参考に DPS の設定を行ってください。 https://learn.microsoft.com/ja-jp/azure/iot-dps/quick-create-simulated-device-x509?tabs=windows&pivots=programming-language-ansi-c#create-a-device-enrollment

なお、上記手順中でアップロードするプライマリ証明書は、Armadillo 上の /var/app/volumes/gw_container/device/cert/device_cert.pem を使用してください。

[警告]

「Armadillo-IoT ゲートウェイ A6E クラウド設定データ」v2.1.0 から、DPS のデバイスプロビジョニング方法が個別登録に変更となりました。 v2.0.0 以前を使用してクラウド環境を構築および Azure portal で作成した DPS にグループ登録で設定を行った場合は、再度環境の構築および設定を行ってください。

  1. Azure portal https://account.microsoft.com/ にサインインします。
  2. Cloud Shell アイコンを選択し、 Azure Cloud Shell を起動します。

    images/a6e-azure-cloud-shell.png
  3. [Bash] を選択します。

    images/a6e-azure-cloud-shell-bash.png
  4. ストレージアカウントの設定を行います。サブスクリプションを選択し、ストレージの作成をクリックすると自動的にストレージアカウントが作成されます。

    images/a6e-azure-cloud-shell-storage.png
  5. Cloud Shell が起動したら、以下のコマンドで Armadillo-IoT ゲートウェイ A6E クラウド設定データをダウンロードします。

    [Azure: ~]$ wget https://armadillo.atmark-techno.com/files/downloads/armadillo-iot-a6e/container/a6e-gw-container-cloudsetting-[VERSION].zip
    [Azure: ~]$ unzip a6e-gw-container-cloudsetting-[VERSION].zip -d a6e-gw-container-cloud-setting
    [Azure: ~]$ cd a6e-gw-container-cloud-setting/Azure

    図6.81 Armadillo-IoT ゲートウェイ A6E クラウド設定データをダウンロードする


  6. Cloud Shell 上でエディタを開き、コンフィグファイルを編集します。

    [Azure: ~]$ code a6e_azure_create_hubdps.conf
    # Common Config
    resourceGroup="" 1
    certificateFilePath="./device_cert.pem"
    
    # IoT Hub Config
    iotHubName="" 2
    skuName="S1"
    skuUnit=1
    partitionCount=4
    
    # DPS Config
    provisioningServiceName="" 3

    図6.82 コンフィグファイルを編集する


    1

    リソースグループを指定します

    2

    作成する Azure IoT Hub 名を入力します

    3

    作成する DPS 名を入力します

    # Common Config
    resourceGroup="armadillo"
    certificateFilePath="./device_cert.pem"
    
    # IoT Hub Config
    iotHubName="armadillo-iothub"
    skuName="S1"
    skuUnit=1
    partitionCount=4
    
    # DPS Config
    provisioningServiceName="armadillo-dps"

    図6.83 コンフィグファイル設定例


    [注記]

    Azure IoT Hub 名、 DPS 名はそれぞれグローバルで一意である必要があります。既に使用されている名称を指定した場合、エラーとなります。

    コンフィグファイルの編集が終了したら、[保存] を行い、 [エディターを閉じる] を選択し、エディタを終了します。

    images/a6e-azure-cloud-shell-editor.png
  7. DPS に登録する証明書を Cloud Shell にアップロードします。

    証明書ファイルは Armadillo 上の /var/app/volumes/gw_container/device/cert/device_cert.pem を使用します。

    [ティップ]

    ゲートウェイアプリケーションのプロジェクト v1.1.0 以降を使用すると、 VSCode のタスクを使用してデバイス証明書を取得することができます。 手順詳細は 「ゲートウェイコンテナアプリケーションが使用するデバイス証明書の取得」 をご確認ください。

    開発 PC にコピーした後、Cloud Shell の以下のアイコンを選択し、アップロードを行います。

    images/a6e-azure-cloud-shell-fileupload.png

    アップロード完了後、スクリプトと同階層に証明書ファイルをコピーします。

    [Azure: ~]$ cp /home/<ユーザー名>/device_cert.pem .
  8. 設定スクリプトを実行し、 Azure IoT Hub と DPS の設定を行います。

    [Azure: ~]$ chmod +x a6e_azure_create_hubdps.sh
    [Azure: ~]$ ./a6e_azure_create_hubdps.sh
    Starting to create IoT Hub.
    :(省略)
    Starting to create DPS.
    {
    :(省略)
      "name": "xxxxx",
      "properties": {
    :(省略)
        "idScope": "0ne12345678", 1
    :(省略)
      },
    :(省略)
    }
    :(省略)
    Starting to link between IoT Hub and DPS.
    :(省略)
    Starting to create enrollment.
    :(省略)
    Completed!

    図6.84 Azure IoT Hub と DPS の設定を実行する


    1

    環境設定時に使用するため、控えておきます

6.9.5. ゲートウェイコンテナの設定ファイル

利用したい内容に合わせて、 設定ファイルを編集します。 設定内容はコンテナ起動時の内容が適用されるため、一度コンテナを終了させます。

[armadillo ~]# podman stop a6e-gw-container
a6e-gw-container

図6.85 ゲートウェイコンテナを終了する


[注記]

本マニュアルに記載しているゲートウェイコンテナの設定ファイルの内容は、最新バージョンの内容となります。

ご利用のゲートウェイコンテナのバージョンが最新ではない場合、ゲートウェイコンテナを最新のバージョンにアップデートするか、ゲートウェイコンテナのバージョンに対応した製品マニュアルをご参照ください。

製品マニュアルのバージョンとゲートウェイコンテナのバージョンについては Armadillo-IoT A6E の製品アップデートページをご参照ください。

設定ファイルの内容は「接続先クラウド情報の設定」及び「インターフェース設定」を参照ください。

6.9.6. コンテナ起動・実行

設定ファイルの修正が完了したら、コンテナを起動します。 コンテナが起動すると、設定に従ってコンテナ内のアプリケーションが実行される仕組みとなっています。

[armadillo ~]# podman_start a6e-gw-container
Starting 'a6e-gw-container'
a3b719c355de677f733fa8208686c29424be24e57662d3972bc4131ab7d145ad

表3.53「[DEFAULT] 設定可能パラメータ」 でクラウドにデータを送信する設定を行った場合は、クラウド接続後、アプリケーションLEDの状態が点滅から点灯に変化します。

6.9.6.1. Armadillo からクラウドに送信するデータ

Armadillo からクラウドに送信するデータは以下の通りです。

  • デバイス情報

    表6.11 デバイス情報データ一覧

    項目概要

    DevInfo_SerialNumber

    シリアル番号

    DevInfo_LAN_MAC_Addr

    LAN MAC アドレス

    DevInfo_ABOS_Ver

    Armadillo Base OS バージョン

    DevInfo_Container_Ver

    コンテナイメージバージョン


  • CPU 温度

    表6.12 CPU 温度データ一覧

    項目概要

    CPU_temp

    CPU 温度


  • 接点入力

    表6.13 接点入力データ一覧

    項目概要

    DI1_polling

    DI1 のポーリング結果

    DI2_polling

    DI2 のポーリング結果

    DI1_edge

    DI1 のエッジ検出結果

    DI2_edge

    DI2 のエッジ検出結果


  • 接点出力

    クラウドに送信するデータはありません。

  • RS-485

    表6.14 RS-485データ一覧

    項目概要

    RS485_Data1

    RS485_Data1 の読み出し値

    RS485_Data2

    RS485_Data2 の読み出し値

    RS485_Data3

    RS485_Data3 の読み出し値

    RS485_Data4

    RS485_Data4 の読み出し値


  • ユーザースイッチ

    表6.15 ユーザースイッチ関連データ一覧

    項目概要

    sw_state

    ユーザースイッチの状態


クラウドにデータが届いているかどうかは、次項の方法で確認することができます。

6.9.6.2. AWS 上でのデータ確認

Amazon CloudWatch ダッシュボードで、データが届いているかの確認を行う事ができます。

  1. CloudWatch に移動し、「ダッシュボード」を選択します。

    images/a6e-aws-cloudwatch.png
  2. 「AWS IoT Core と Amazon CloudWatch の設定を行う」 で CloudWatch ダッシュボードが作成されています。 ダッシュボード名は armadillo_iot_a6e_<シリアル番号> です。

    images/a6e-aws-cloudwatch-dashboard.png
  3. ダッシュボード名をクリックすると、下記のような画面が表示されます。

    images/a6e-aws-cloudwatch-dashboard-all.png
    • 接点入力

      images/a6e-aws-cloudwatch-dashboard-di.png
    • RS-485

      images/a6e-aws-cloudwatch-dashboard-rs485.png
    • CPU温度

      images/a6e-aws-cloudwatch-dashboard-cputemp.png
    • ユーザースイッチ

      images/a6e-aws-cloudwatch-dashboard-sw.png

また、実際にデバイスから届いているデータを確認する場合は、 AWS IoT Core の Device Shadow で確認を行います。

  1. AWS IoT Core に移動し、「管理」→「すべてのデバイス」→「モノ」を選択します。

    images/a6e-aws-iot-core.png
  2. デバイスの名前は 「Armadillo-IoT ゲートウェイ A6E のシリアル番号を取得する」 で取得したシリアル番号で登録されています。

    images/a6e-aws-iot-core-thing.png
  3. 「Device Shadow」の「Classic Shadow」を選択します。

    images/a6e-aws-iot-core-thing-detail.png
  4. 下記の通り、 Armadillo から送信されてきたデータを確認することができます。

    images/a6e-aws-iot-core-thing-shadow.png

6.9.6.3. Azure 上でのデータ確認

[注記]

以下では可視化の手順を記載していますが、実際にデバイスから届いているデータを確認する場合は、Azure IoT Explorer を用いて確認することが可能です。 詳細はこちらのドキュメント https://docs.microsoft.com/ja-jp/azure/iot-pnp/howto-use-iot-explorer をご参照ください。

Azure IoT Hub に登録されるデバイス ID は、デバイス認証に使用している証明書の CN となります。 以下のコマンドで確認することが可能です。

[armadillo ~]# openssl x509 -noout -subject -in /var/app/volumes/gw_container/device/cert/device_cert.pem | grep subject | awk '{print $NF}'

可視化の方法は様々ありますが、本書では一例として、Power BI を使用して Azure IoT Hub に送信したデータの可視化を行う方法を記載します。

以下の手順では、 「Armadillo からクラウドに送信するデータ」 のうち CPU_temp を例に記載します。

  1. こちらのページで https://powerbi.microsoft.com/ja-jp/ Power BI アカウントを作成します。なお、 Pro アカウントでの登録が必要となります。
  2. PowerBI にログインし、グループワークスペースを作成します。
  3. Azure IoT Hub にコンシューマーグループを追加します。 Azure portal から [IoT Hub] を開き、 「Azure IoT Hub と Azure IoT Hub Device Provisioning Service の設定を行う」 で作成した IoT Hub を選択します。 [組み込みのエンドポイント] を選択し、[コンシューマーグループ] の下のテキストボックスに、新しいコンシューマーグループの名前を入力、保存します。

    images/a6e-azure-iothub-consumer.png
  4. Azure IoT Hub のデータを Power BI のデータセットにルーティングする Azure Stream Analytics ジョブを作成します。

    Azure portal から [Stream Analytics ジョブ] を開き、 [Stream Analytics ジョブ] 概要ページで [作成] を選択します。

    images/a6e-azure-streamanalytics-create.png

    [基本] タブに、 表6.16「Azure Stream Analytics ジョブ設定値」 の情報を入力し、 [確認と作成] を選択した後、 [作成] を選択して Stream Analytics ジョブを作成します。

    images/a6e-azure-streamanalytics-create-setting.png

    表6.16 Azure Stream Analytics ジョブ設定値

    項目設定値

    サブスクリプション

    IoT Hub のサブスクリプション

    リソースグループ

    IoT Hub のサブスクリプション

    名前

    ジョブの名前(任意)

    リージョン

    IoT Hub のリージョン


  5. Stream Analytics ジョブに入力を追加します。

    作成した Stream Analytics ジョブを開きます。

    images/a6e-azure-streamanalytics-list.png

    [ジョブ トポロジ] - [入力] から [ストリーム入力の追加] を選択し、ドロップダウンリスト内の [IoT Hub] を選択します。

    images/a6e-azure-streamanalytics-input.png

    表6.17「Azure Stream Analytics ジョブ入力設定値」 の情報を入力し、それ以外の内容はデフォルトのまま [保存] を選択します。

    images/a6e-azure-streamanalytics-input-setting.png

    表6.17 Azure Stream Analytics ジョブ入力設定値

    項目設定値

    入力のエイリアス

    一意の名前を入力

    サブスクリプションから IoT Hub を選択する

    選択

    サブスクリプション

    IoT Hub 用のサブスクリプション

    IoT Hub

    使用する IoT Hub

    コンシューマーグループ

    作成したコンシューマーグループを選択

    共有アクセスポリシー名

    iothubowner


  6. Stream Analytics ジョブに出力を追加します。なお、複数の値を PowerBI で可視化する場合は、値の数分の出力設定が必要になります。

    [ジョブ トポロジ] - [出力] から [追加] を選択し、ドロップダウンリスト内の [Power BI] を選択します。

    images/a6e-azure-streamanalytics-output.png

    [認証モード] で「ユーザートークン」を選択、[接続を承認する] の [承認] を選択し、Power BI アカウントにサインインします。

    images/a6e-azure-streamanalytics-output-auth.png

    作成したグループワークスペースの ID を [グループワークスペース] に入力します。 グループワークスペースの ID は、グループワークスペースの URL から取得することができます。 [データセット名] と [テーブル名] は任意の値を指定してください。ここではそれぞれ cputemp を指定しています。 情報登録完了後、 [保存] を選択します。

    images/a6e-azure-streamanalytics-output-setting.png
  7. Stream Analytics ジョブのクエリを構成します。

    [ジョブ トポロジ] の [クエリ] を選択します。

    images/a6e-azure-streamanalytics-query.png

    赤枠内にクエリを指定します。入力完了後、[クエリの保存] を選択してください。 フォーマットは下記の通りです。 <パラメータ名> には、 「Armadillo からクラウドに送信するデータ」 の「項目」を指定してください。

    SELECT
        <パラメータ名>,
        DATEADD(hour, 9, System.Timestamp) AS time,
        IoTHub.ConnectionDeviceId AS DeviceID
    INTO
        [<ジョブ出力エイリアス名>]
    FROM
        [<ジョブ入力エイリアス名>] timestamp by dateadd(second, epoch, '1970-01-01T00:00:00Z')
    WHERE <パラメータ名> IS NOT NULL

    これに従い、CPU_temp の場合は以下の通りとなります。

    SELECT
        CPU_temp,
        DATEADD(hour, 9, System.Timestamp) AS time,
        IoTHub.ConnectionDeviceId AS DeviceID
    INTO
        [cputemp]
    FROM
        [<ジョブ入力エイリアス名>] timestamp by dateadd(second, epoch, '1970-01-01T00:00:00Z')
    WHERE CPU_temp IS NOT NULL

    なお、複数の出力がある場合は、クエリ入力欄に下記の通り複数のクエリを列挙してください。INTO 句で指定するパラメータ(データセット名)が異なることに注意してください。

    SELECT
        CPU_temp,
        DATEADD(hour, 9, System.Timestamp) AS time,
        IoTHub.ConnectionDeviceId AS DeviceID
    INTO
        [cputemp]
    FROM
        [<ジョブ入力エイリアス名>] timestamp by dateadd(second, epoch, '1970-01-01T00:00:00Z')
    WHERE CPU_temp IS NOT NULL
    
    SELECT
        DI1_polling,
        DATEADD(hour, 9, System.Timestamp) AS time,
        IoTHub.ConnectionDeviceId AS DeviceID
    INTO
        [di1polling]
    FROM
        [<ジョブ入力エイリアス名>] timestamp by dateadd(second, epoch, '1970-01-01T00:00:00Z')
    WHERE DI1_polling IS NOT NULL
  8. Stream Analytics ジョブを実行します。

    [概要] 画面で [開始] を選択します。

    images/a6e-azure-streamanalytics-overview.png

    [ジョブの開始] 画面の [ジョブ出力の開始時刻] で [現在] が選択されていることを確認し、 [開始] を選択します。 ジョブが正常に開始されると、[概要] 画面の [状態] が [実行中] に変わります。

    images/a6e-azure-streamanalytics-jobstart.png
  9. ゲートウェイコンテナを停止している場合、下記のコマンドを実行しゲートウェイコンテナを開始します。

    [armadillo ~]# podman_start a6e-gw-container
    Starting 'a6e-gw-container'
    a3b719c355de677f733fa8208686c29424be24e57662d3972bc4131ab7d145ad
  10. PowerBI アカウントにサインインし、使用したワークスペースを右側のメニューから選択すると、 Stream Analytics ジョブ出力で指定した名称のデータセットが作成されています。

    images/a6e-azure-powerbi-dataset.png
  11. データセットの [レポートの作成] を選択します。

    images/a6e-azure-powerbi-dataset-report.png
  12. [視覚化] で [折れ線グラフ] を選択、X軸に EventEnqueuedUtcTime 、 Y軸に CPU_temp を指定することにより、グラフ化を行うことが出来ます。各設定を行った後、 [保存] すると、レポートが作成されます。

    images/a6e-azure-powerbi-create-report.png
  13. 複数のデータセットが存在している場合は、それぞれについてレポートの作成を行います。なお、各レポートを一括して表示したい場合はダッシュボード機能を選択してください。手順についてはこちらのドキュメント https://learn.microsoft.com/ja-jp/power-bi/create-reports/service-dashboard-create を参照してください。

6.9.7. クラウドからの操作

6.9.7.1. クラウドからのデータ設定

各インターフェースの設定については、 「インターフェース設定」 に記載している通り Armadillo 上の設定ファイルで行いますが、クラウドから設定値を変更することも可能です。

なお、クラウドからデータ設定を行うためには、 表3.53「[DEFAULT] 設定可能パラメータ」cloud_config を true に設定する必要があります。

設定を変更できる項目は以下の通りです。

  • 接点入力設定
  • 接点出力設定
  • RS-485 レジスタ読み出し

下記の手順でデータを設定します。

  • AWS

    AWS IoT Core の Device Shadow を更新して設定を行います。

    1. AWS IoT Core に移動し、「管理」→「すべてのデバイス」→「モノ」を選択します。

      images/a6e-aws-iot-core.png
    2. デバイスの名前は 「Armadillo-IoT ゲートウェイ A6E のシリアル番号を取得する」 で取得したシリアル番号で登録されています。

      images/a6e-aws-iot-core-thing.png
    3. 「Device Shadow」の「Classic Shadow」を選択します。

      images/a6e-aws-iot-core-thing-detail.png
    4. Device Shadow ドキュメントの「編集」を選択します。

      images/a6e-aws-iot-core-thing-shadow-edit.png
    5. 入力画面が表示されるため、設定データを入力し「更新」をクリックします。

      images/a6e-aws-iot-core-thing-shadowupdate.png
  • Azure

    Azure IoT Hub のデバイスツインを更新して設定を行います。

    1. Azure portal から [IoT Hub] を開き、「Azure IoT Hub と Azure IoT Hub Device Provisioning Service の設定を行う」 で作成した IoT Hub を選択します。[デバイス] を選択し、一覧の中から該当するデバイスID を選択します。

      images/a6e-azure-iothub-device.png
    2. [デバイスツイン] を選択します。

      images/a6e-azure-iothub-device-info-twin.png
    3. デバイスツイン編集画面が表示されるため、設定データを入力し「保存」をクリックします。

      images/a6e-azure-iothub-devicetwin.png

各機能それぞれ、下記の通りのフォーマットとなっています。

  • 接点入力設定

    表6.18 接点入力設定値

    項目概要 設定値 内容

    type

    動作種別

    (空欄) or none

    接点入力状態取得を行わない

    polling

    ポーリング

    edge

    エッジ検出

    edge_type

    エッジ検出設定

    falling

    立ち下がりエッジ

    rising

    立ち上がりエッジ

    both

    両方

    interval

    データ取得間隔[sec]

    1~3600

    この値に従って、値を読み出します


    • AWS

      フォーマットは下記の通りです。

      {
        "state": {
          "desired": {
          "<制御ポート>_config": { 1
              "type" : <polling or edge>,
              "edge_type" : <falling or rising or both>,
              "interval" : <読み出し間隔>
            }
          }
        }
      }

      1

      制御ポートは DI1, DI2 のいずれかを指定してください

      {
        "state": {
          "desired": {
          "DI1_config": {
              "type" : "polling",
              "edge_type" : falling,
              "interval" : 5
            }
          }
        }
      }

      図6.86 接点入力制御シャドウ設定例


    • Azure

      フォーマットは下記の通りです。 デバイスツインの "desired" プロパティに設定します。

      {
        "properties": {
          "desired": {
          "<制御ポート>_config": { 1
              "type" : <polling or edge>,
              "edge_type" : <falling or rising or both>,
              "interval" : <読み出し間隔>
            },
            :
          }
        }
      }

      1

      制御ポートは DI1, DI2 のいずれかを指定してください

      {
        "properties": {
          "desired": {
          "DI1_config": {
              "type" : "polling",
              "edge_type" : falling,
              "interval" : 5
            },

      図6.87 接点入力制御デバイスツイン設定例


  • 接点出力設定

    クラウドから設定内容を受信したタイミングで接点出力動作を停止し、設定内容を更新します。

    表6.19 接点出力設定値

    項目概要 設定値 内容

    output_state

    出力状態

    high

    High

    low

    Low

    output_time

    出力時間[sec]

    1~3600

    出力コマンド実行後に output_state で指定したレベルを出力する時間。 0 を指定すると出力値を固定します。

    output_delay_time

    出力遅延時間[sec]

    0~3600

    出力コマンド実行後、指定した時間遅延して出力します。


    • AWS

      フォーマットは下記の通りです。

      {
        "state": {
          "desired": {
          "<制御ポート>_config": { 1
              "output_state" : <high or low>,
              "output_time" : <出力時間>,
              "output_delay_time" : <出力遅延時間>
            }
          }
        }
      }

      1

      制御ポートは DO1, DO2 のいずれかを指定してください

      {
        "state": {
          "desired": {
          "DO1_config": {
              "output_state" : "high",
              "output_time" : 10,
              "output_delay_time" : 10
            }
          }
        }
      }

      図6.88 接点出力制御シャドウ設定例


    • Azure

      フォーマットは下記の通りです。 デバイスツインの "desired" プロパティに設定します。

      {
        "properties": {
          "desired": {
          "<制御ポート>_config": { 1
              "output_state" : <high or low>,
              "output_time" : <出力時間>,
              "output_delay_time" : <出力遅延時間>
            },
            :
          }
        }
      }

      1

      制御ポートは DO1, DO2 のいずれかを指定してください

      {
        "properties": {
          "desired": {
            "DO1_config": {
              "output_state" : "high",
              "output_time" : 10,
              "output_delay_time" : 10
            },

      図6.89 接点出力制御デバイスツイン設定例


  • RS-485 レジスタ読み出し

    表6.20 RS-485レジスタ読み出し設定値

    項目概要 設定値 内容

    method

    通信種別

    none

    RS-485を利用しない

    rtu

    Modbus-RTU

    data_size

    データサイズ

    8

    baudrate

    ボーレート

    1200~38400[bps]

    通信速度を指定します

    parity

    パリティビット

    none

    None

    odd

    Odd

    even

    Even

    stop

    ストップビット

    1

    1

    2

    2

    device_id

    Modbusスレーブ機器のデバイスID

    0x01 〜 0xF7

    func_code

    ファンクションコード

    0x03 or 0x04

    register_addr

    レジスタアドレス

    機器依存

    値を読み出すレジスタのアドレスを指定

    register_count

    読み出しレジスタ数

    1 or 2

    一度に読み出すレジスタ数を指定

    endian

    エンディアン設定

    little

    リトルエンディアン

    big

    ビッグエンディアン

    interval

    データ取得間隔[sec]

    1~3600

    この値に従って、値を読み出します

    data_offset

    読み出し値に加算する値

    任意の値(整数値)

    指定は任意です。読み出したレジスタ値に加算する値を指定します

    data_multiply

    読み出し値と乗算する値

    任意の値(整数値)

    指定は任意です。読み出したレジスタ値と乗算する値を指定します

    data_divider

    読み出し値と除算する値

    任意の値(整数値)

    指定は任意です。読み出したレジスタ値と除算する値を指定します


    • AWS

      フォーマットは下記の通りです。

      {
        "state": {
          "desired": {
            "RS485_Data<1~4>_config": { 1
              "method" : <種別>,
              "baudrate" : <ボーレート>,
              "data_size": <データサイズ>,
              "parity" : <パリティ>,
              "stop" : <ストップビット>,
              "device_id" : <デバイス ID>,
              "func_code" : <ファンクションコード>,
              "register_addr" : <レジスタアドレス>,
              "register_count" : <読み出すレジスタ数>,
              "endian" : <エンディアン種別>,
              "interval" : <読み出し間隔>,
              "data_offset" : <データに加算する値>,
              "data_multiply" : <データに乗算する値>,
              "data_divider" : <データと除算する値>
            }
          }
        }
      }

      1

      1~4 のいずれかを指定してください

      {
        "state": {
          "desired": {
            "RS485_Data1_config": {
              "baudrate" : 9600,
              "parity" : "none",
              "stop" : 1,
              "device_id" : "01",
              "func_code" : "03",
              "register_addr" : "0000",
              "register_count" : 2,
              "endian" : "big",
              "interval" : 30,
              "data_offset" : 0,
              "data_multiply" : 0,
              "data_divider" : 0
            }
          }
        }
      }

      図6.90 RS-485レジスタ読み出しシャドウ設定例


    • Azure

      フォーマットは下記の通りです。 デバイスツインの "desired" プロパティに設定します。

      {
        "properties": {
          "desired": {
            "RS485_Data<1~4>_config": { 1
              "method" : <種別>,
              "baudrate" : <ボーレート>,
              "data_size": <データサイズ>,
              "parity" : <パリティ>,
              "stop" : <ストップビット>,
              "device_id" : <デバイス ID>,
              "func_code" : <ファンクションコード>,
              "register_addr" : <レジスタアドレス>,
              "register_count" : <読み出すレジスタ数>,
              "endian" : <エンディアン種別>,
              "interval" : <読み出し間隔>,
              "data_offset" : <データに加算する値>,
              "data_multiply" : <データに乗算する値>,
              "data_divider" : <データと除算する値>
            },
            :
          }
        }
      }

      1

      1~4 のいずれかを指定してください

      {
        "properties": {
          "desired": {
            "RS485_Data1_config": {
              "baudrate" : 9600,
              "parity" : "none",
              "stop" : 1,
              "device_id" : "01",
              "func_code" : "03",
              "register_addr" : "0000",
              "register_count" : 2,
              "endian" : "big",
              "interval" : 30,
              "data_offset" : 0,
              "data_multiply" : 0,
              "data_divider" : 0
            },

      図6.91 RS-485レジスタ読み出しデバイスツイン設定例


6.9.8. コンテナの終了

podman_start で起動したゲートウェイコンテナを終了させる場合は、以下のコマンドを実行してください。

[armadillo ~]# podman stop a6e-gw-container

6.9.9. ログ内容確認

「ゲートウェイコンテナの設定ファイル」 でログファイルにログを出力する設定にした場合、インターフェース部とクラウド部にわかれて、それぞれ以下のファイルに出力されます。

  • インターフェース部

    • /var/app/volumes/gw_container/device/log/sensing_mgr.log
  • クラウド部

    • /var/app/volumes/gw_container/device/log/cloud_agent.log

ログファイルは自動的にローテートされるように設定されています。 ローテートされると、各ファイルの末尾に番号が付与されます。 なお、ファイル数が10を超えた場合は古いファイルから削除されます。

また、ログファイルの内容はテキストデータであり、以下のようなフォーマットになっています。

出力日時 ログレベル : メッセージ

図6.92 ログファイルのフォーマット


6.9.10. ゲートウェイコンテナの構成

ゲートウェイコンテナは下記の通り構成されています。 コンテナ内外関わらず、誤ってファイルを削除した場合はインストールディスクで初期化を行ってください。

起動スクリプト

コンテナ起動時、下記のスクリプトを実行します。

  • /usr/bin/gw-app.sh
ゲートウェイコンテナアプリケーション

ゲートウェイコンテナアプリケーションは下記に配置されています。

  • /usr/lib/python3.10/site-packages/atgateway/
ボリュームマウント

以下のパスをコンテナ内でマウントしています。

ホストパス コンテナパス 概要

/var/app/rollback/volumes/gw_container/cert

/cert/ca

デバイス認証関連ファイル

/var/app/rollback/volumes/gw_container/config

/config

ゲートウェイコンテナコンフィグファイル

/var/app/rollback/volumes/gw_container/src

/root/gw_container

ゲートウェイコンテナ main 関数

/var/app/volumes/gw_container/device/cert

/cert/device

デバイス証明書関連ファイル

/var/app/volumes/gw_container/device/log

/log

ゲートウェイコンテナ ログ

6.10. ゲートウェイコンテナアプリケーションを改造する

「ゲートウェイコンテナアプリケーションの開発」で説明したとおり、VSCode 上でゲートウェイコンテナアプリケーションの設定を行えますが、メインファイルを変更することで独自のアプリケーションを開始することも可能です。 ゲートウェイコンテナアプリケーションの拡張例のファイルは app/example ディレクトリに配置してあります。 実行する場合は app/example ディレクトリのファイル一式を app/src ディレクトリにコピーしてください。 拡張例のゲートウェイコンテナでは以下の動作を実行します。

  • 5秒毎に Count_value のカウントアップ
  • Count_value が 100 に達すると 0 クリア

Count_value がカウントアップしていく様子はログファイルで確認できます。 ゲートウェイコンテナのログについての詳細は 「ログ内容確認」 をご参照ください。

2023-01-26 11:05:35,115 <INFO> : {'data': {'Count_value': 0, 'timestamp': 1674698730}}
2023-01-26 11:05:45,150 <INFO> : {'data': {'Count_value': 1, 'timestamp': 1674698735}}
2023-01-26 11:05:45,165 <INFO> : {'data': {'Count_value': 2, 'timestamp': 1674698740}}
2023-01-26 11:05:45,175 <INFO> : {'data': {'Count_value': 3, 'timestamp': 1674698745}}
2023-01-26 11:05:55,202 <INFO> : {'data': {'Count_value': 4, 'timestamp': 1674698750}}
2023-01-26 11:05:55,215 <INFO> : {'data': {'Count_value': 5, 'timestamp': 1674698755}}
2023-01-26 11:06:05,242 <INFO> : {'data': {'Count_value': 6, 'timestamp': 1674698760}}
2023-01-26 11:06:05,255 <INFO> : {'data': {'Count_value': 7, 'timestamp': 1674698765}}
2023-01-26 11:06:15,282 <INFO> : {'data': {'Count_value': 8, 'timestamp': 1674698770}}
2023-01-26 11:06:15,295 <INFO> : {'data': {'Count_value': 9, 'timestamp': 1674698775}}
2023-01-26 11:06:25,323 <INFO> : {'data': {'Count_value': 10, 'timestamp': 1674698780}}
2023-01-26 11:06:25,335 <INFO> : {'data': {'Count_value': 11, 'timestamp': 1674698785}}
2023-01-26 11:06:35,362 <INFO> : {'data': {'Count_value': 12, 'timestamp': 1674698790}}

図6.93 ログファイルの Count_value の出力例


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

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

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

6.11.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.11.2. ABOS Web の設定機能一覧と設定手順

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

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

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

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

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

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

6.11.3. コンテナ管理

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

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

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

図6.94 コンテナ管理


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

[注記]

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

6.11.4. SWUインストール

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

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

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

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

図6.95 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.96 SWU 管理対象ソフトウェアコンポーネントの一覧表示


6.11.5. 時刻設定

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

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

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

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

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


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

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

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


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

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

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


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

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

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


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

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

6.11.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.101 設定管理の Rest API トークン一覧表示


[ティップ]

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

6.11.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" '
[ティップ]

コンテナから ABOS Web には「https://host.containers.internal:58080」でアクセスできます。

[注記]

この章で説明する例では、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.11.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.11.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.11.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.11.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.11.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
  • ネットワークの接続
    POST "/api/connections/{connection}/up"
    必要権限: NetworkAdmin
    パラメータ: 無し
    出力: 無し

    [ATDE ~]$ curl_rest -X POST https://armadillo.local:58080/api/connections/Wired%20connection%201/up
    
    http code: 200
  • ネットワークの切断
    POST "/api/connections/{connection}/down"
    必要権限: NetworkAdmin
    パラメータ: 無し
    出力: 無し

    [ATDE ~]$ curl_rest -X POST https://armadillo.local:58080/api/connections/Wired%20connection%201/down
    
    http code: 200
    [ティップ]

    「LTE再接続サービス」が動作している状態で LTE を切断した場合、LTE 再接続サービスにより再度接続を試み、接続可能であれば接続状態へ戻ります。

  • ネットワーク設定の削除
    DELETE "/api/connections/{connection}"
    必要権限: NetworkAdmin
    パラメータ: 無し 出力: 無し

    [ATDE ~]$ curl_rest -X DELETE https://armadillo.local:58080/api/connections/178b8c95-fcad-4bb1-8040-5a02b9ad046f
    
    http code: 200
    [警告]

    通信に使用しているネットワークの設定を削除した場合は Armadillo へアクセスできなくなりますので、ご注意ください。

6.11.6.8. Rest API : WLAN

  • 無線ネットワークのリスト取得
    GET "/api/wlan/scan"
    必要制限: NetworkView
    パラメータ: (任意)rescan=true/false, false を指定するとキャッシュされているスキャン結果を出力します。
    出力: リスト

    [ATDE ~]$ curl_rest https://armadillo.local:58080/api/wlan/scan
    [{"id":"my_ap","signal":74,"bssid":"04:42:1A:E4:78:0C","chan":44,"rate":"540 Mbit/s","security":"WPA2 WPA3"},{"id":"other_ap","signal":65,"bssid":"AC:44:F2:56:22:38","chan":1,"rate":"130 Mbit/s","security":"WPA2"}]
    http code: 200
  • *無線ネットワークの接続
    POST "/api/wlan/connect"
    必要制限: NetworkAdmin
    パラメータ: ssid, passphrase, ifname, bssid, hidden. ssid 以外は任意です。
    出力: 生成した接続の uuid

    [ATDE ~]$ curl_rest https://armadillo.local:58080/api/wlan/connect -d ssid=my_ap -d passphrase=my_passphrase
    {"uuid":"178b8c95-fcad-4bb1-8040-5a02b9ad046f"}
    http code: 200
  • 無線ネットワーク アクセスポイントの設定
    POST "/api/wlan/ap"
    必要制限: NetworkAdmin
    パラメータ: ssid, passphrase, bridge_addr, hw_mode/channel, interface.
    interface は任意です。hw_mode:2.4GHz を使用する場合は "g"、5GHz を使用する場合は "a" を設定します。
    channel: 2.4GHz の場合は 1 〜 13、5GHz の場合は 36、40、44、48 を設定します。
    hw_mode/channel を設定しない場合は自動的に選択されますが、両方を未設定にすることはできません。
    出力: 無し

    [ATDE ~]$ curl_rest -d ssid=my_ap -d passphrase=my_passphrase -d bridge_addr=198.51.100.1/24 -d channel=3 https://armadillo.local:58080/api/wlan/ap
    
    http code: 200
    [警告]

    アクセスポイントを設定するとクライアントの接続が無効になります。

    [ティップ]

    クライアントの接続の削除は DELETE "/api/connections/{connection}" で行えます。

  • 無線ネットワーク アクセスポイントの削除
    DELETE "/api/wlan/ap"
    必要制限: NetworkAdmin
    パラメータ: interface (任意)
    出力: 無し

    [ATDE ~]$ curl_rest -X DELETE https://armadillo.local:58080/api/wlan/ap
    
    http code: 200

6.11.6.9. Rest API : WWAN の設定

  • WWAN の設定追加
    POST "/api/wwan"
    必要制限: NetworkAdmin
    パラメータ: apn, user, password, auth_type (CHAP/PAP, デフォルト CHAP), mccmnc, ipv6 (bool、デフォルト true)
    apn 以外は任意です。
    出力: 追加された接続の uuid

    [ATDE ~]$ curl_rest -d apn=provider.tld -d user=provider -d password=provider https://armadillo.local:58080/api/wwan
    {"uuid":"ce603d3e-838b-4ac8-b7fd-6a3f1abe4003"}
    http code: 200
  • WWAN の設定削除
    DELETE "/api/wwan"
    必要制限: NetworkAdmin
    パラメータ: 無し
    出力: 無し

    [ATDE ~]$ curl_rest -X DELETE https://armadillo.local:58080/api/wwan
    
    http code: 200
[注記]

WWAN の設定確認または一時的な切断は connection の API で行ってください。

6.11.6.10. Rest API : DHCP の設定

  • DHCP の設定確認
    GET "/api/dhcp"
    必要制限: NetworkView
    パラメータ: 無し
    出力: interface, ip_addr, start_addr, end_addr, lease_time のリスト

    [ATDE ~]$ curl_rest https://armadillo.local:58080/api/dhcp
    [{"interface":"br_ap","ip_addr":"198.51.100.1/24","start_addr":"198.51.100.10","end_addr":"198.51.100.20","lease_time":"3600"}]
    http code: 200
  • DHCP の設定
    POST "/api/dhcp/{interface}"
    必要制限: NetworkAdmin
    パラメータ: start_addr, end_addr, lease_time
    lease_time を設定しなかった場合は 3600 (秒)とする
    出力: 無し

    [ATDE ~]$ curl_rest https://armadillo.local:58080/api/dhcp/br_ap -d start_addr=198.51.100.10 -d end_addr=198.51.100.20
    
    http code: 200
  • DHCP の設定削除
    DELETE "/api/dhcp/{interface}"
    必要制限: NetworkAdmin
    パラメータ: 無し
    出力: 無し

    [ATDE ~]$ curl_rest -X DELETE https://armadillo.local:58080/api/dhcp/br_ap
    
    http code: 200

6.11.6.11. Rest API : NAT の設定

  • NAT (masquerade) の設定確認
    GET "/api/nat"
    必要制限: NetworkView
    パラメータ: 無し
    出力: NAT されている interface のリスト

    [ATDE ~]$ curl_rest https://armadillo.local:58080/api/nat
    [{"interface":"eth0"}]
    http code: 200
  • NAT の設定
    POST "/api/nat/{interface}"
    必要制限: NetworkAdmin
    パラメータ: 無し
    出力: 無し

    [ATDE ~]$ curl_rest -X POST https://armadillo.local:58080/api/nat/eth0
    
    http code: 200
  • NAT の削除
    DELETE "/api/nat/{interface}"
    必要制限: NetworkAdmin
    パラメータ: 無し
    出力: 無し

    [ATDE ~]$ curl_rest -X DELETE https://armadillo.local:58080/api/nat/eth0
    
    http code: 200
  • ポートフォワードの設定確認
    GET "/api/port_forwarding"
    必要制限: NetworkView
    パラメータ: 無し
    出力: フォワードされてるポート

    [ATDE ~]$ curl_rest https://armadillo.local:58080/api/port_forwarding
    [{"interface":"eth0","protocol":"tcp","dport":"22","destination":"127.0.0.1","destination_port":"2222"}]
    http code: 200
  • ポートフォワードの設定
    POST "/api/port_forwarding"
    必要制限: NetworkAdmin
    パラメータ: interface, protocol (デフォルト tcp), dport, destination, destination_port
    出力: 無し

    [ATDE ~]$ curl_rest https://armadillo.local:58080/api/port_forwarding -d interface=eth0  -d dport=22 -d de
    stination=127.0.0.1 -d destination_port=2222
    
    http code: 200
  • ポートフォワードの削除
    DELETE "/api/port_forwarding"
    必要制限: NetworkAdmin
    パラメータ: interface, protocol (デフォルト tcp), dport, destination, destination_port
    出力: 無し

    [ATDE ~]$ curl_rest https://armadillo.local:58080/api/port_forwarding -X DELETE -H "Content-Type: application/json" -d '{"interface":"eth0","protocol":"tcp","dport":"22","destination":"127.0.0.1","destination_port":"2222"}'
    
    http code: 200

6.11.6.12. 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.11.6.13. 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.11.6.14. 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.11.6.15. Rest API : ユーザー設定とユーザーデータの管理

  • ユーザー設定とユーザーデータの削除
    POST "/api/reset_default"
    必要権限: ResetDefault
    パラメータ: 無し
    出力: abos-ctrl reset-default の出力 (stdout または stderr)、および出力ステータス (exit_code または exit_signal)

    [ATDE ~]$ curl_rest -X POST https://armadillo.local:58080/api/reset_default
    {"stdout":"rm -f /etc/NetworkManager/system-connections/*\n"}
    {"stdout":"persist_file -r /etc/NetworkManager/system-connections\n"}
    {"stdout":"persist_file -r /etc/dnsmasq.d\n"}
    {"stdout":"rc-service dnsmasq restart\n"}
    {"stdout":"/etc/init.d/iptables save\n"}
    {"stdout":"sed -i -e '/NETAVARK/d' /etc/iptables/rules-save\n"}
    {"stdout":"persist_file /etc/iptables/rules-save\n"}
    {"stdout":"podman stop -a\n"}
    {"stdout":"find /var/app/volumes /var/log -mindepth 1 -delete\n"}
    {"stdout":"Starting clone to /dev/mmcblk0p1\n"}
    {"stdout":"Cloning rootfs\n"}
    {"stdout":"Updating appfs snapshots\n"}
    {"stdout":"Reusing up-to-date bootloader\n"}
    {"stdout":"Rollback clone successful\n"}
    {"stderr":"WARNING: Rebooting!\n"}
    {"exit_code":0}
    
    http code: 200

6.11.6.16. Rest API : カスタムスクリプトの実行

ユーザが Armadillo に追加したスクリプトを Rest API を使用して実行することができます。 実行したいスクリプトに実行権限を付与し、Armadillo の /etc/atmark/abos_web/customize_rest ディレクトリ下に置いてください。

実行に root 権限が必要なスクリプトの場合は、 以下のように /etc/doas.d/abos_web_customize.conf にスクリプトを追加してください。

[armadillo ~]# cat /etc/doas.d/abos_web_customize.conf
permit nopass abos-web-admin as root cmd /etc/atmark/abos_web/customize_rest/root_command.sh
  • 任意のスクリプト実行
    POST "/api/custom/{script}"
    必要制限: Custom パラメータ: args でスクリプトの引数を順番に指定できます。
    root を true に設定すると root 権限でスクリプトを実行します。
    出力: /etc/atmark/abos_web/customize_rest/{script} {args} {args...} を実行して、 そのスクリプトの出力を stdout/stderr で返します。スクリプトが終了した際の出力ステータスは exit_code または exit_signal (どちらも int) です。

    [armadillo ~]# cat /etc/atmark/abos_web/customize_rest/print_args.sh
    #!/bin/sh
    
    printf "arg: %s\n" "$@"
    [ATDE ~]$ curl_rest -X POST https://armadillo.local:58080/api/custom/print_args.sh \
            -H 'Content-type: application/json' -d '{"args": ["param", "second arg"], "root":false}'
    {"stdout":"arg: param\n"}
    {"stdout":"arg: second arg\n"}
    {"exit_code":0}
[警告]

標準の ABOS Web には最小限の権限しか与えていません。
root 権限でスクリプトを実行する場合、 Armadillo の故障やセキュリティにも関わりますので、十分注意して追加してください。

6.11.7. カスタマイズ

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

6.11.8. ユーザー設定とユーザーデータの削除

カスタマイズと Rest API トークン以外の設定内容と、 ユーザーデータを一括削除することができます。

ユーザーデータの削除では以下のデータを削除します。

  • /var/app/volumes ディレクトリ下のファイルを全て
  • /var/log ディレクトリ下のファイルを全て

ABOS Web のトップページから、「設定管理」ページへ移動し「ユーザー設定とユーザーデータの削除」にある 「削除」ボタンを押すと削除できます。削除後は Armadillo が再起動するので引き続き ABOS Web を使用する場合は、 再起動が完了してからアクセスしてください。

6.11.9. ABOS Web を停止する

図6.102「ABOS Web を停止する」に ABOS Web のサービスを停止する方法を示します。

[armadillo ~]# rc-update | grep abos-web 1
             abos-web |      default
[armadillo ~]# rc-service abos-web status 2
 * status: started
[armadillo ~]# rc-service abos-web stop 3
abos-web                 | * Stopping abos-web ... [ ok ]
[armadillo ~]# rc-update del abos-web 4
 * service abos-web deleted from runlevel default
[armadillo ~]# persist_file -d /etc/runlevels/default/abos-web 5

図6.102 ABOS Web を停止する


1

OpenRC に ABOS Web のサービスが登録されていることを確認します。

2

ABOS Web のサービスが起動していることを確認します。

3

ABOS Web のサービスを停止します。

4

サービスを管理している OpenRC から ABOS Web のサービスの登録を解除します。

5

サービス設定ファイルの削除を永続化します。

ABOS Web を停止すると ABOS Web の Rest API も使用できなくなります。

6.11.10. ABOS Web を起動する

図6.103「ABOS Web を起動する」に ABOS Web のサービスを起動する方法を示します。

[armadillo ~]# rc-update | grep abos-web 1
[armadillo ~]# rc-update add abos-web 2
* service abos-web added to runlevel default
[armadillo ~]# rc-service abos-web start 3
abos-web                 | * Starting abos-web ... [ ok ]
[armadillo ~]# persist_file /etc/runlevels/default/abos-web 4

図6.103 ABOS Web を起動する


1

OpenRC に ABOS Web のサービスが登録されていないことを確認します。何も出力されなければ登録されていません。

2

サービスを管理している OpenRC に ABOS Web のサービスを登録します。

3

ABOS Web のサービスを起動します。

4

サービス設定ファイルを永続化します。

6.12. 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.104「ABOSDE で ローカルネットワーク上の Armadillo をスキャンする」 の赤枠で囲まれているボタンをクリックすることで、ローカルネットワーク上で ABOS Web が動作している Armadillo をスキャンすることができます。 ただし、ATDE のネットワークを NAT に設定している場合は Armadillo がリストに表示されません。

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

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


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

images/abos-images/abosde_enter_abos_web_password.png

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


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

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

images/abos-images/abosde_get_swu_versions.png

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


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

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

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

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


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

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

images/abos-images/abosde_run_container.png

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


images/abos-images/abosde_stop_container.png

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


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

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

images/abos-images/abosde_get_container_log.png

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


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

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

images/abos-images/abosde_install_swu.png

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


6.13. ssh 経由で Armadillo Base OS にアクセスする

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

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

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

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

[注記]

Cat.1 モデルは、初期状態では LTE ネットワーク経由の ssh が使用できません。「Cat.1 モデル搭載 ELS31-J ファイアーウォール設定 (Cat.1 モデル)」 を参考にファイアーウォール設定を変更後ご利用ください。

6.14. コマンドラインからネットワーク設定を行う

ここでは、コマンドラインによるネットワークの設定方法について説明します。

6.14.1. 接続可能なネットワーク

表6.21 ネットワークとネットワークデバイス

ネットワーク 搭載モデル ネットワークデバイス 出荷時の設定

Ethernet

全モデル

eth0

DHCP

LTE

Cat.1

usb0

SIM / 料金プランに依存します

Cat.M1

ppp0

無線LAN

Cat.1[a], WLAN

wlan0

クライアントモード

[a] 型番によっては、搭載/非搭載が異なります。


6.14.2. ネットワークの設定方法

Armadillo-IoT ゲートウェイ A6E では、通常の Linux システムと同様、ネットワークインターフェースの設定は NetworkManager を使用します。 NetworkManager はすべてのネットワーク設定をコネクションとして管理します。コネクションには「どのようにネットワークへ接続するか」、 「どのようにネットワークを作成するか」を記述し、 /etc/NetworkManager/system-connections/ に保存します。 また、1つのデバイスに対して複数のコネクションを保存することは可能ですが、1つのデバイスに対して有効化にできるコネクションは1つだけです。

NetworkManager は、従来の /etc/network/interfaces を使った設定方法もサポートしていますが、本書では nmcli を用いた方法を中心に紹介します。

6.14.2.1. nmcli について

nmcli は NetworkManager を操作するためのコマンドラインツールです。 図6.112「nmcli のコマンド書式」nmcli の書式を示します。このことから、 nmcli は「オブジェクト (OBJECT) というものが存在し、 それぞれのオブジェクトに対してコマンド (COMMAND) を実行する。」という書式でコマンドを入力することがわかります。 また、オブジェクトそれぞれに help が用意されていることもここから読み取れます。

nmcli [ OPTIONS ] OBJECT { COMMAND | help }

図6.112 nmcli のコマンド書式


6.14.3. nmcli の基本的な使い方

ここでは nmcli の、基本的な使い方を説明します。

6.14.3.1. コネクションの一覧表示

登録されているコネクションの一覧表示するには、図6.113「コネクションの一覧表示」に示すコマンドを実行します。 [7]

[armadillo ~]# nmcli connection
NAME                UUID                                  TYPE      DEVICE
Wired connection 1  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  ethernet  eth0

図6.113 コネクションの一覧表示


表示された NAME については、以降 [ID] として利用することができます。

6.14.3.2. コネクションの有効化・無効化

コネクションを有効化するには、図6.114「コネクションの有効化」に示すコマンドを実行します。

[armadillo ~]# nmcli connection up [ID]

図6.114 コネクションの有効化


コネクションを無効化するには、図6.115「コネクションの無効化」に示すコマンドを実行します。

[armadillo ~]# nmcli connection down [ID]

図6.115 コネクションの無効化


6.14.3.3. コネクションの作成

コネクションを作成するには、図6.116「コネクションの作成」に示すコマンドを実行します。

[armadillo ~]# nmcli connection add con-name [ID] type [type] ifname [interface name]

図6.116 コネクションの作成


[ID] にはコネクションの名前(任意)、[type] には ethernet、wifi といった接続タイプ、 [interfacename] にはインターフェース名(デバイス)を入力します。 これにより /etc/NetworkManager/system-connections/ に[ID]の名前でコネクション ファイルが作成されます。このファイルを vi などで編集し、コネクションを修正する ことも可能です。

Armadillo-IoT ゲートウェイ A6E を再起動したときにコネクションファイルが消えてしまわないように、 persist_file コマンドで永続化する必要があります。 persist_file コマンドに関する詳細は 「persist_file について」 を参照してください。

[armadillo ~]# persist_file /etc/NetworkManager/system-connections/<コネクションファイル名>

図6.117 コネクションファイルの永続化


[注記]

別の Armadillo-IoT ゲートウェイ A6E からコネクションファイルをコピーした場合は、コネクションファイルの パーミッションを 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 イメージに関しては 「SWU イメージのインストール」 を参考にしてください。

6.14.3.4. コネクションの削除

コネクションを削除するには、図6.118「コネクションの削除」に示すコマンドを実行します。

[armadillo ~]# nmcli connection delete [ID]

図6.118 コネクションの削除


これにより /etc/NetworkManager/system-connections/ のコネクションファイルも同時に削除されます。 コネクションの作成と同様に persist_file コマンドで永続化する必要があります。

[armadillo ~]# persist_file -d /etc/NetworkManager/system-connections/<コネクションファイル名>

図6.119 コネクションファイル削除時の永続化


6.14.3.5. 固定 IP アドレスに設定する

表6.22「固定 IP アドレス設定例」の内容に設定する例を、 図6.120「固定 IP アドレス設定」に示します。

表6.22 固定 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.120 固定 IP アドレス設定


6.14.3.6. DHCP に設定する

DHCP に設定する例を、図6.121「DHCP の設定」に示します。

[armadillo ~]# nmcli connection modify [ID] ipv4.method auto

図6.121 DHCP の設定


[注記]

-ipv4.addresses のように、プロパティ名の先頭に "-" を付けることで設 定したプロパティを削除することができます。反対に "+" を付けることで プロパティを追加することができます。

6.14.3.7. DNS サーバーを指定する

DNS サーバーを指定する例を、図6.122「DNS サーバーの指定」に示します。

[armadillo ~]# nmcli connection modify [ID] ipv4.dns 192.0.2.1

図6.122 DNS サーバーの指定


6.14.3.8. コネクションの修正を反映する

有効化されているコネクションを修正した場合、かならず修正したコネクションを再度有効化してください。

[armadillo ~]# nmcli connection down [ID]
[armadillo ~]# nmcli connection up [ID]

図6.123 コネクションの修正の反映


6.14.3.9. デバイスの一覧表示

デバイスの一覧(デバイス名、タイプ、状態、有効なコネクション)を確認するには、図6.124「デバイスの一覧表示」に示すコマンドを実行します。

[armadillo ~]# nmcli device
DEVICE  TYPE      STATE        CONNECTION
eth0    ethernet  connected    Wired connection 1
lo      loopback  unmanaged    --

図6.124 デバイスの一覧表示


6.14.3.10. デバイスの接続

デバイスを接続するには、図6.125「デバイスの接続」に示すコマンドを実行します。

[armadillo ~]# nmcli device connect [ifname]

図6.125 デバイスの接続


[注記]

デバイスを接続するには、接続しようとしているデバイスの有効なコネクションが必要です。 "Error: neither a valid connection nor device given" というメッセージが表示された場合には、 nmcli connection などで有効なコネクションが存在するかを確認してください。

6.14.3.11. デバイスの切断

デバイスを切断するには、図6.126「デバイスの切断」に示すコマンドを実行します。

[armadillo ~]# nmcli device disconnect [ifname]

図6.126 デバイスの切断


6.14.4. 有線 LAN の接続を確認する

有線 LAN で正常に通信が可能かを確認します。設定を変更した場合、必ず変更したインターフェースを再度有効化してください。

同じネットワーク内にある通信機器と PING 通信を行います。以下の例では、通信機器が「192.0.2.20」という IP アドレスを持っていると想定しています。

[armadillo ~]# ping -c 3 192.0.2.20
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.127 有線 LAN の PING 確認


[注記]

有線 LAN 以外のインターフェースが有効化されている場合、ルーティングの設定などにより、ネットワーク通信に有線 LAN が使用されない場合があります。 確実に有線 LAN の接続確認をするために、有線 LAN 以外のインターフェースを無効化してください。

6.14.5. LTE (Cat.1/Cat.M1 モデル)

本章では、Armadillo-IoT ゲートウェイ A6E に搭載されている LTEモジュールの使用方法について説明します。

[ティップ]

Armadillo-IoT ゲートウェイ A6E Cat.1 モデルに搭載しております Telit 製 LTE 通信モジュール ELS31-J は、ドコモの相互接続性試験を完了しています。

[ティップ]

Armadillo-IoT ゲートウェイ A6E Cat.M1 モデルに搭載しております Telit 製 LTE 通信モジュール EMS31-J は、ドコモ/KDDI/ソフトバンクそれぞれの相互接続性試験を完了しています。

6.14.5.1. LTE データ通信設定を行う前に

LTEデータ通信を利用するには、通信事業者との契約が必要です。契約時に通信事業者から貸与されたnanoSIM(UIMカード)とAPN情報を準備します。

[警告]

Armadillo-IoT ゲートウェイ A6E Cat.1 及び Cat.M1 モデルでの動作検証済み nanoSIM (料金プラン)に関しては、 Armadillo サイトの「Armadillo-IoTゲートウェイ 動作確認済みSIM一覧」を確認ください。

Armadillo-IoTゲートウェイ 動作確認済みSIM一覧

[警告]

Armadillo-IoT ゲートウェイ A6E の電源が切断されていることを確認してから nanoSIM(UIMカード)を取り付けてください。

[警告]

本製品は、nanoSIMスロットを搭載しています。

標準/microSIMサイズのSIMカードをnanoSIMサイズにカットしたもの、サイズの異なるものを使用すると、nanoSIMスロットが故障する原因となります。 これらを使用し本製品が故障した場合は、保証期間内であっても保証適用外となります。

nanoSIM(UIMカード)の切り欠きを挿入方向に向け、刻印面を上にして挿入してください。挿入位置などは、図3.45「Armadillo-IoT ゲートウェイ A6Eの接続例」 を参照してください。

APNの設定を行うには、表6.23「APN 設定情報」に示す情報が必要です。モデル毎の文字長を超える設定はできませんので、SIM の料金プランを選択する際にはご注意ください。特に Cat.1 モデル (ELS31-J) の最大パスワード文字数が短いのでご注意ください。

表6.23 APN 設定情報

項目 Cat.1 モデル (ELS31-J) Cat.M1 モデル (EMS31-J)

APN

最大 99 文字

最大 99 文字

ユーザー名

最大 30 文字

最大 64 文字

パスワード

最大 20 文字

最大 64 文字

認証方式

PAP または CHAP

PDP Type

IP のみをサポート


6.14.5.2. Cat.1 モデルの LTE ネットワーク構成について (Cat.1 モデル)

Cat.1 モデル搭載の LTE モデム ELS31-J は、USB インターフェースで Armadillo のプロセッサと接続しています。USB インターフェースは USB CDC ACM、USB CDC Ethernet として動作します。

この USB CDC Ethernet によって LTE モジュールと Armadillo Base OS の間で LAN を構成します。

それぞれの IP アドレスの割り当てを、図6.128「Cat.1 モデル (ELS31-J) LTE ネットワーク構成」 に示します。Armadillo Base OS 側の IP アドレスを 24 ビットマスクのアドレス空間で示しているのは、 LTE モジュール内部で動作している DHCP サーバーがIPアドレスを提供するためです。

images/els31-nat.png

図6.128 Cat.1 モデル (ELS31-J) LTE ネットワーク構成


6.14.5.3. Cat.1 モデル搭載 ELS31-J ファイアーウォール設定 (Cat.1 モデル)

Cat.1 モデル搭載の LTE モデム ELS31-J は、デフォルトでファイアーウォールが有効となっており、外部からのアクセスが出来ないようになっております。

ELS31-J のファイアーウォール設定を変更したい場合、設定ファイル(/etc/atmark/els31.conf)を作成します。

設定ファイルの記載例として、サンプルファイル(/etc/atmark/els31.conf.example)がありますので、こちらをリネームまたはコピーしてご利用ください。

ファイアーウォールを有効にする場合は図6.129「ELS31-J ファイアーウォールを有効にする」 に示すとおり FIREWALL="enable" に設定します。

#!/bin/sh

FIREWALL="enable"

図6.129 ELS31-J ファイアーウォールを有効にする


無効にする場合は図6.130「ELS31-J ファイアーウォールを無効にする」に示すとおり FIREWALL="disable" に設定します。

#!/bin/sh

FIREWALL="disable"

図6.130 ELS31-J ファイアーウォールを無効にする


編集後、図6.131「ELS31-J ファイアーウォール設定の永続化」に示す設定ファイルの永続化を実施した後に Armadillo の再起動を行うことで ELS31-J のファイアーウォールの有効・無効を変更できます。

[armadillo ~]# persist_file /etc/atmark/els31.conf

図6.131 ELS31-J ファイアーウォール設定の永続化


ファイアーウォール設定を変更する必要がない場合は、図6.132「ELS31-J ファイアーウォール設定ファイルの削除」に示すとおり設定ファイル (/etc/atmark/els31.conf) を削除するか、図6.133「ELS31-J ファイアーウォール設定を行わない場合の設定ファイル」に示すとおり設定ファイル(/etc/atmark/els31.conf) の FIREWALL の行を # でコメントアウトしてください。

[armadillo ~]# persist_file -d /etc/atmark/els31.conf

図6.132 ELS31-J ファイアーウォール設定ファイルの削除


#!/bin/sh

#FIREWALL="enable"

図6.133 ELS31-J ファイアーウォール設定を行わない場合の設定ファイル


6.14.5.4. LTE モデム EMS31-J 省電力などの設定 (Cat.M1 モデル)

Cat.M1 モデル搭載の LTE モデム EMS31-J 起動時に設定する内容を、設定ファイル(/etc/atmark/ems31-boot.conf)に記載します。

設定ファイルの記載例として、サンプルファイル(/etc/atmark/ems31-boot.conf.example)がありますので、こちらをリネームまたはコピーしてご利用ください。

/etc/atmark/ems31-boot.conf に設定できる内容を表6.24「ems31-boot.conf の設定内容」に示します。

ems31-boot.conf のフォーマットは以下の通りです。

  • パラメータは、「パラメータ名=値」のフォーマットで記載してください。
  • fix_profile の値のみダブルクォテーションで囲む必要があります。
  • 行頭に # が存在する場合、その行を無視します。
  • パラメーターが存在しない場合、その項目に関して何も設定をしません。

表6.24 ems31-boot.conf の設定内容

パラメーター名 初期値 設定可能値 説明

fix_profile

"auto"

"docomojp","sbmjp","kddijp"

接続プロファイルの指定 "auto" で接続できないときに、設定を変更すると接続できることがあります。

suspend

disable

enable または disable

サスペンドの有効無効

psm

3m,1m

disable または tau,act-time

Power Save Mode の設定

edrx

20.48,5.12

disable または pcl,ptw

eDRX の設定


PSM (Power Save Mode) の設定値を表6.25「psm の tau と act-time に設定可能な値」に示します。disable にしない場合、tau (Periodic TAU cycle (T3412)) は act_time (Active time (T3324)) より大きい値にする必要があります。

表6.25 psm の tau と act-time に設定可能な値

パラメーター名 設定可能値

tau (s=秒,m=分,h=時間)

2s,4s,6s…62s,90s,120s,150s…930s,1m,2m,3m…31m,40m,50m,60m…310m, 1h,2h,3h…31h,40h,50h,60h…310h

act-time (s=秒,m=分,h=時間)

2s,4s,6s…62s,1m,2m,3m…31m,36m,42m,48m…186m


eDRX (extended Discontinuous Reception) の設定値を表6.26「edrx の pcl と ptw に設定可能な値」に示します。disable にしない場合、pcl (Paging Cycle Length) は ptw (Paging Time Window eDRX) より大きい値にする必要があります。

表6.26 edrx の pcl と ptw に設定可能な値

パラメーター名 設定可能値

pcl (秒)

5.12, 10.24, 20.48, 40.96, 61.44, 81.92, 102.4, 122.88, 143.36, 163.84, 327.68, 655.36, 1310.72, 2621.44

ptw (秒)

1.28, 2.56, 5.12, 6.40, 7.68, 8.96, 10.24, 11.52, 12.80, 14.08, 15.36, 16.64, 17.92, 19.20, 20.48


6.14.5.5. LTEのコネクションを作成する

表6.27「APN情報設定例」の内容に設定する例を図6.134「LTEのコネクションの作成」に示します。

表6.27 APN情報設定例

項目 設定

APN

[apn]

ユーザー名

[user]

パスワード

[password]

ネットワークデバイス

[wwan]


ネットワークデバイス [wwan] は、表6.28「通信モジュールのネットワークデバイス」 を参照ください。

表6.28 通信モジュールのネットワークデバイス

通信モジュール ネットワークデバイス

Telit 製 ELS31-J (Cat.1 モデル)

ttyCommModem

Telit 製 EMS31-J (Cat.M1 モデル)


[armadillo ~]# nmcli connection add type gsm ifname [wwan] apn [apn] user [user] password [password]
Connection 'gsm-[wwan]' (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) successfully added.

図6.134 LTEのコネクションの作成


コネクション設定を永続化するには、以下のコマンドを入力してください。設定を永続化すると、Armadillo 起動時に自動的にデータ接続を行うようになります。

同一インタフェースへの設定が複数存在する場合、 gsm-[wwan]-1.nmconnection など後ろに数値が付与されますので、図6.134「LTEのコネクションの作成」 入力時のメッセージで生成されたファイル名を確認した上で永続化を実施ください。

[armadillo ~]# persist_file /etc/NetworkManager/system-connections/gsm-[wwan].nmconnection

図6.135 LTEのコネクションの設定の永続化


6.14.5.6. ユーザー名とパスワード設定が不要な LTE のコネクションを作成する

ユーザー名とパスワード設定が不要な SIM カードをご利用の場合、図6.136「ユーザー名とパスワード設定が不要な LTE のコネクションの作成」 に示すとおり user と password を省略して設定してください。

[armadillo ~]# nmcli connection add type gsm ifname [wwan] apn [apn]
Connection 'gsm-[wwan]' (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) successfully added.

図6.136 ユーザー名とパスワード設定が不要な LTE のコネクションの作成


6.14.5.7. MCC/MNC を指定した LTE のコネクションを作成する (Cat.M1 モデルのみ)

マルチキャリア SIM などを使用する際、MCC (Mobile Country Code) と MNC (Mobile Network Code) を指定してコネクションを作成すると LTE ネットワークに接続できることがあります。指定する場合は 図6.137「MCC/MNC を指定した LTE コネクションの作成」 に示すコマンドを実行してください。

[mccmnc] には 44010 などの数字を入力してください。実際に設定する値に関しては、ご契約の通信事業者へお問い合わせください。

Cat.1 モデルに搭載の LTE モデム ELS31-J はドコモ網のみに接続可能ですので、この設定は不要です。

[armadillo ~]# nmcli connection add type gsm ifname [wwan] apn [apn] user [user] password [password] gsm.network-id [mccmnc]

図6.137 MCC/MNC を指定した LTE コネクションの作成


6.14.5.8. PAP認証を有効にしたLTEのコネクションを作成する

LTEのコネクションの認証方式は、デフォルトで CHAP に設定されています。PAP認証を有効にしたコネクションを作成する場合は図6.138「PAP認証を有効にしたLTEコネクションの作成」 に示すコマンドを実行してください。

[armadillo ~]# nmcli connection add type gsm ifname [wwan] apn [apn] user [user] password [password] ppp.refuse-eap true ppp.refuse-chap true ppp.refuse-mschap true ppp.refuse-mschapv2 true ppp.refuse-pap false

図6.138 PAP認証を有効にしたLTEコネクションの作成


[警告]

すでにLTEコネクションを作成済みの場合はコネクション設定を削除した後に、図6.138「PAP認証を有効にしたLTEコネクションの作成」を実施してください。

6.14.5.9. LTEコネクションを確立する

LTEコネクションの作成直後や設定変更後に再起動をせずにコネクションを確立するには、図6.139「LTEのコネクション確立」に示すコマンドを実行します。

[armadillo ~]# nmcli connection up gsm-[wwan]
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/x)

図6.139 LTEのコネクション確立


6.14.5.10. LTE の接続を確認する

ご利用になるサービスとの通信を検証する、ICMP に対応しているアドレス (8.8.8.8など) と PING 通信を行うなどの方法で LTE の接続を確認してください。

[armadillo ~]# ping -c 3 8.8.8.8 -I [network device]

図6.140 LTE の PING 確認


[network device] には、表6.21「ネットワークとネットワークデバイス」を参照し、ご使用の製品モデルで使用しているLTEのネットワークデバイスを指定してください。

6.14.5.11. LTEコネクションを切断する

LTEコネクションを切断するには、図6.141「LTEコネクションを切断する」に示すコマンドを実行します。 LTEコネクションを切断する前に、LTE 再接続サービスを停止しないと再接続処理が実行される為、事前に停止します。

[armadillo ~]# rc-service connection-recover stop 1
connection-recover| * Stopping connection-recover ... [ ok ]
[armadillo ~]# nmcli connection down gsm-[wwan] 2

図6.141 LTEコネクションを切断する


1

LTE 再接続サービスを停止します。

2

LTE コネクションを切断します。

6.14.5.12. LTE再接続サービス

LTE 再接続サービスは、LTE のデータ接続の状態を定期的に監視し、切断を検出した場合に再接続を行うサービスです。

Cat.1 モデルは初期状態でこのサービスが有効になっております。

[ティップ]

Cat.M1 モデルでは、LTE モデムの省電力動作のため、初期状態では LTE 再接続サービスを無効にしております。有効にする手順は、図6.148「LTE 再接続サービスを有効にする」を参照ください。LTE 再接続サービスを有効にした場合、定期的に ping 導通確認を実施するため、スリープ状態の LTE モデムが都度起床する、サスペンド状態の LTE モデムですと ping 導通が確認できないなど、制約が発生しますので、その辺りを考慮された上でのご利用をお願いします。

[警告]

閉塞 LTE 網を使用する料金プランをご契約で本サービスをご利用になられる際の注意点。

コネクション状態確認時 PING 送付先の初期値は 8.8.8.8 ですが、この IP アドレスに対して ping 導通ができない場合、 ping 導通可能な IP アドレスを指定する必要があります。

SIM カードが挿入されており、NetworkManager に有効な LTE コネクションの設定がされているとき、初期設定では 120 秒に一度コネクションの状態を監視します。オプションで SIM カードの認識ができないときに Armadillo の再起動を実施することも可能です。

コネクションが無効になっている場合、切断状態と判定しコネクションを有効にします。

コネクションが有効になっている場合、特定の宛先に PING を実行します。PING がエラーになったとき切断状態と判定し、コネクションの無効化・有効化を行うことで再接続を実施します。

コネクションの無効化・有効化による再接続を実施しても PING がエラーになる場合、電波のオン・オフまたは LTE モジュールの電源をオン・オフを実施して LTE 再接続を試みます。どちらを実施するかは設定ファイルの WWAN_FORCE_RESTART_COUNT に依存します。

WWAN_FORCE_RESTART_COUNT が初期値の 10 である場合、1 から 9 回目は電波のオン・オフを実施し、10 回目はLTE モジュールの電源オン・オフを実施します。それ以降も NG が続く場合、同じく 10 回に一度 LTE モジュールの電源オン・オフを実施します。

LTE モジュールが検出できない状態が 2 回連続で発生した場合、LTE モジュールの再起動を実施します。(Armadillo Base OS 3.18.5-at.7 以降)

LTE 接続中状態が 3 回連続で発生した場合、LTE モジュールの再起動を実施します。(Armadillo Base OS 3.19.1-at.2 以降)

Cat.1 モデルの場合、工場出荷状態で本サービスは有効化されており、システム起動時にサービスが自動的に開始されます。PING を実行する宛先は、初期設定では "8.8.8.8" です。

atmark-wwan-utils のバージョンが 1.5.0-r0 以降の場合は、設定ファイルは /etc/atmark/connection-recover.conf を使用します。

設定ファイルの記載例として、サンプルファイル(/etc/atmark/connection-recover.conf.example)がありますので、こちらをリネームまたはコピーしてご利用ください。

[ティップ]

atmark-wwan-utils 1.5.0-r0 (Armadillo Base OS 3.17.3-at.6) 以降、旧設定ファイル Cat.1 モデル:/etc/atmark/connection-recover/gsm-ttyACM0_connection-recover.conf、Cat.M1 モデル:/etc/atmark/connection-recover/gsm-ttyMux0_connection-recover.conf が存在する場合、/etc/atmark/connection-recover.conf よりも優先して設定ファイルとして使用します。

旧設定ファイルが不要である場合は、図6.142「再接続サービス 旧設定ファイルの削除」に示すとおりに削除してご利用ください。

[armadillo ~]# persist_file -d /etc/atmark/connection-recover/<設定ファイル名>

図6.142 再接続サービス 旧設定ファイルの削除


設定ファイルの概要を表6.29「再接続サービス設定パラメーター」に示します。必要に応じて設定値を変更してください。

設定ファイルが存在しない場合は初期値で動作します。

表6.29 再接続サービス設定パラメーター

パラメーター名 初期値 意味 変更

PRODUCT_NAME

-

製品名

不可

CHECK_INTERVAL_SEC

120

監視周期(秒)

PING_DEST_IP

8.8.8.8

コネクション状態確認時 PING 送付先

DEVICE

-

ネットワークデバイス名

不可

TYPE

-

ネットワークタイプ

不可

NETWORK_IF

-

ネットワーク I/F 名

不可

FORCE_REBOOT

FALSE

TRUE に設定すると PING 導通チェックが 4 回連続 NG だった場合、 Armadillo を再起動します。

REBOOT_IF_SIM_NOT_FOUND

FALSE

TRUE に設定すると SIM を検出できない状態が 2 回連続で発生した場合、 Armadillo を再起動します。

WWAN_FORCE_RESTART_COUNT

10

PING 導通確認を設定した回数連続で失敗した場合 LTE モジュールを再起動します。設定した回数に満たない場合 、電波のオフ・オン実施のみで LTE 再接続を試みます。


設定ファイル変更後、変更内容を永続化するには図6.143「LTE 再接続サービスの設定値を永続化する」に示すコマンドを実行してください。

[armadillo ~]# persist_file /etc/atmark/connection-recover.conf

図6.143 LTE 再接続サービスの設定値を永続化する


LTE再接続サービスの状態を確認するには、図6.144「LTE 再接続サービスの状態を確認する」に示すコマンドを実行してください。

[armadillo ~]# rc-service connection-recover status
 * status: started

図6.144 LTE 再接続サービスの状態を確認する


LTE再接続サービスを停止するには、図6.145「LTE 再接続サービスを停止する」に示すコマンドを実行してください。

[armadillo ~]# rc-service connection-recover stop
connection-recover| * Stopping connection-recover ... [ ok ]

図6.145 LTE 再接続サービスを停止する


LTE再接続サービスを開始するには、図6.146「LTE 再接続サービスを開始する」に示すコマンドを実行してください。

[armadillo ~]# rc-service connection-recover start
connection-recover| * Starting connection-recover ... [ ok ]

図6.146 LTE 再接続サービスを開始する


独自に接続状態を確認するサービスを実装されるなどの理由で標準のLTE再接続サービスが不要な場合、図6.147「LTE 再接続サービスを無効にする」に示す手順で再接続サービスを永続的に無効にできます。

[armadillo ~]# rc-service connection-recover stop 1
connection-recover| * Stopping connection-recover ... [ ok ]
[armadillo ~]# rc-update del connection-recover default 2
service connection-recover removed from runlevel default
[armadillo ~]# persist_file -d /etc/runlevels/default/connection-recover 3

図6.147 LTE 再接続サービスを無効にする


1

再接続サービスを停止します。

2

再接続サービスを無効にします。

3

サービス設定ファイルの削除を永続化します。

LTE再接続サービスを無効化した後、再度有効にする場合、図6.148「LTE 再接続サービスを有効にする」に示す手順を実行してください。

[armadillo ~]# rc-update add connection-recover default 1
service connection-recover added to runlevel default
[armadillo ~]# rc-service connection-recover start 2
connection-recover| * Starting connection-recover ... [ ok ]
[armadillo ~]# persist_file /etc/runlevels/default/connection-recover 3

図6.148 LTE 再接続サービスを有効にする


1

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

2

再接続サービスを開始します。

3

サービス設定ファイルを永続化します。

6.14.5.13. ModemManager - mmcli について

ここでは ModemManager と mmcli について説明します。

Armadillo-IoT ゲートウェイ A6E にはネットワークを管理する NetworkManager とは別に、モデムを管理する ModemManager がインストールされています。 ModemManager はモバイルブロードバンドデバイス(LTEモジュールなど)の操作および、接続状況の管理などを行います。

ModemManager のコマンドラインツールである mmcli を使用することで、LTE通信の電波強度やSIMカードの情報(電話番号やIMEIなど)を取得することが可能です。mmcli の詳しい使いかたについては man mmcli を参照してください。

ModemManager はモデムデバイスに応じたプラグインを選択して動作します。Cat.M1 モデルでは、cinterion-ems31 という名称のプラグインで動作しています。

6.14.5.14. mmcli - 認識されているモデムの一覧を取得する

認識されているモデムの一覧を取得するには、図6.149「認識されているモデムの一覧を取得する」に示すコマンドを実行します。

[armadillo:~]# mmcli -L
    /org/freedesktop/ModemManager1/Modem/0 [Cinterion] EMS31-J

図6.149 認識されているモデムの一覧を取得する


6.14.5.15. mmcli - モデムの情報を取得する

モデムの情報を取得するには、図6.150「モデムの情報を取得する」に示すコマンドを実行します。

armadillo:~# mmcli -m 0
  --------------------------------
  General  |                 path: /org/freedesktop/ModemManager[number1]/Modem/[number2]
           |            device id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  --------------------------------
  Hardware |         manufacturer: Cinterion
           |                model: EMS31-J
           |    firmware revision: XXXXXXXXXXXXXXXXXXXX
           |            supported: lte
           |              current: lte
           |         equipment id: XXXXXXXXXXXXXXX
: (省略)

図6.150 モデムの情報を取得する


[ティップ]

モデムの情報を取得するには、SIM カードが取り付けられている必要があります。正しく SIM カードが取り付けられていることを確認してください。

6.14.5.16. mmcli - SIMの情報を取得する

SIM の情報を取得するには、図6.151「SIMの情報を取得する」に示すコマンドを実行します。

[armadillo ~]# mmcli -m 0
: (省略)
SIM      |     primary sim path: /org/freedesktop/ModemManager1/SIM/[number] # [number] を次のコマンドで使用
: (省略)

[armadillo ~]# mmcli -i [number]
  -------------------------------
  General    |              path: /org/freedesktop/ModemManager1/SIM/0
  -------------------------------
  Properties |            active: yes
             |              imsi: XXXXXXXXXXXXXXX
             |             iccid: XXXXXXXXXXXXXXXXXXX
             |       operator id: XXXXX
             |     operator name: XXXXXXXXXXX

図6.151 SIMの情報を取得する


6.14.5.17. mmcli - 回線情報を取得する

回線情報を取得するには、図6.152「回線情報を取得する」に示すコマンドを実行します。

[armadillo ~]# mmcli -m 0
: (省略)
  Bearer   |                paths: /org/freedesktop/ModemManager1/Bearer/[number] # [number] を次のコマンドで使用
: (省略)

[armadillo ~]# mmcli -b [number]
  ------------------------------------
  General            |           path: /org/freedesktop/ModemManager1/Bearer/[bearer number]
                     |           type: default
  ------------------------------------
  Status             |      connected: yes
                     |      suspended: XX
                     |    multiplexed: XX
                     |     ip timeout: XX
  ------------------------------------
  Properties         |            apn: XXXXXXXXXXX
                     |        ip type: XXXXX

図6.152 回線情報を取得する


6.14.6. 無線LAN

本章では、Armadillo-IoT ゲートウェイ A6E に搭載されている無線LANモジュールの使用方法について説明します。

例として、WPA2-PSK(AES)のアクセスポイントに接続します。WPA2-PSK(AES)以外のアクセスポイントへの接続方法などについては、man nm-settings を参考にしてください。 また、以降の説明では、アクセスポイントのESSIDを[essid]、パスフレーズを[passphrase]と表記します。

6.14.6.1. 無線LANアクセスポイントに接続する

無線LANアクセスポイントに接続するためには、次のようにコマンドを実行してコネクションを作成します。

[armadillo ~]# nmcli device wifi connect [essid] password [passphrase]

図6.153 無線LANアクセスポイントに接続する


作成されたコネクションの ID は nmcli connection コマンドで確認できます。

[armadillo ~]# nmcli connection
NAME                UUID                                  TYPE      DEVICE
atmark-4f           e051a1df-6bd7-4bcf-9c71-461af666316d  wifi      wlan0
Wired connection 1  f147b8e8-4a17-312d-a094-8c9403007f6a  ethernet  --

図6.154 無線LANのコネクションが作成された状態


[注記]

NetworkManagerの仕様により、無線LANの接続にはランダムなMACアドレスが使用されます。搭載されている無線LANモジュール固有のMACアドレスを使用したい場合は、以下の例のようにNetworkManagerの設定を変更し、再起動を行ってください。

[armadillo ~]# echo "[device-mac-randomization]" > /etc/NetworkManager/conf.d/no-random-mac.conf
[armadillo ~]# echo "wifi.scan-rand-mac-address=no" >> /etc/NetworkManager/conf.d/no-random-mac.conf
[armadillo ~]# echo "[connection-mac-randomization]" >> /etc/NetworkManager/conf.d/no-random-mac.conf
[armadillo ~]# echo "wifi.cloned-mac-address=permanent" >> /etc/NetworkManager/conf.d/no-random-mac.conf
[armadillo ~]# persist_file /etc/NetworkManager/conf.d/no-random-mac.conf

6.14.6.2. 無線LANの接続を確認する

無線LANで正常に通信が可能か確認します。

同じネットワーク内にある通信機器とPING通信を行います。以下の例では、通信機器が「192.0.2.20」というIPアドレスを持っていると想定しています。

[armadillo ~]# ping 192.0.2.20

図6.155 無線LANのPING確認


[ティップ]

無線LAN以外のコネクションが有効化されている場合、ネットワーク通信に無線LANが使用されない場合があります。 確実に無線LANの接続確認をする場合は、事前に無線LAN以外のコネクションを無効化してください。

6.14.7. 無線 LAN アクセスポイント (AP) として設定する

WLAN+BT コンボ搭載モデルの無線 LAN をアクセスポイント (以降 AP) として設定する方法を説明します。AP 設定は hostapd というソフトウェアと、 DNS/DHCP サーバである dnsmasq というソフトウェアを使用します。

hostapd と dnsmasq は Armadillo Base OS にデフォルトでインストール済みとなっているため、インストール作業は不要です。インストールされていない場合は、 Armadillo Base OS を最新バージョンに更新してください。

[警告]

アクセスポイントモード (AP) と ステーションモード (STA) の同時利用はできません。

6.14.7.1. bridge インターフェースを追加する

NetworkManager を使用し bridge インターフェース (br0) を追加します。同時に AP の IP アドレスも設定します。ここでは 192.0.2.1 を設定しています。

[armadillo ~]# nmcli con add type bridge ifname br0
[armadillo ~]# nmcli con mod bridge-br0 ipv4.method manual ipv4.address "192.0.2.1/24"
[armadillo ~]# nmcli con up bridge-br0
[armadillo ~]# persist_file /etc/NetworkManager/system-connections/bridge-br0.nmconnection 1

図6.156 bridge インターフェースを作成する


1

設定ファイルを永続化します。

また、NetworkManager のデフォルト状態では定期的に wlan0 のスキャンを行っています。スキャン中は AP の性能が低下するため wlan0 を NetworkManager の管理から外します。

[armadillo ~]# vi /etc/NetworkManager/conf.d/90_disable_wlan0.conf
[device_wlan0]
match-device=interface-name:wlan0
managed=0

[armadillo ~]# persist_file /etc/NetworkManager/conf.d/90_disable_wlan0.conf
[armadillo ~]# nmcli d set wlan0 managed no 1

図6.157 wlan0 インターフェースを NetworkManager の管理から外す


1

nmcli で NetworkManager をリスタートせずに設定します。

6.14.7.2. hostapd を設定する

hostapd の設定ファイルの雛形として用意してある /etc/hostapd/hostapd.conf.example をコピーして使用します。

[armadillo ~]# cp /etc/hostapd/hostapd.conf.example /etc/hostapd/hostapd.conf
[armadillo ~]# vi /etc/hostapd/hostapd.conf
hw_mode=a 1
channel=44 2
ssid=myap 3
wpa_passphrase=myap_pass 4
interface=wlan0 5
bridge=br0
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
driver=nl80211
country_code=JP
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
disassoc_low_ack=1
preamble=1
wmm_enabled=1
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
ieee80211ac=1
ieee80211ax=1
ieee80211n=1
ieee80211d=1
ieee80211h=1
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2

[armadillo ~]# persist_file /etc/hostapd/hostapd.conf 6
[armadillo ~]# rc-service hostapd start 7
[armadillo ~]# rc-update add hostapd 8
[armadillo ~]# persist_file /etc/runlevels/default/hostapd 9

図6.158 hostapd.conf を編集する


1

5GHz であれば a を、2.4GHz であれば g を設定します。

2

使用するチャンネルを設定します。

3

子機から接続するための任意の SSID を設定します。この例では myap を設定しています。

4

子機から接続するための任意のパスフレーズを設定します。この例では myap_pass を設定しています。

5

Armadillo-IoT ゲートウェイ A6E では interface には wlan0 を設定します。

6

設定ファイルを永続化します。

7

hostapd を起動します。

8

Armadillo 起動時に hostapd が自動的に起動されるようにします。

9

hostapd 自動起動の設定を永続化します。

6.14.7.3. dnsmasq を設定する

dnsmasq の設定ファイルを以下の内容で作成し /etc/dnsmasq.d/ 下に配置します。ファイル名は任意ですが、拡張子は .conf としてください。ここでは dhcp.conf としています。

[armadillo ~]# vi /etc/dnsmasq.d/dhcp.conf
interface=br0
bind-dynamic
dhcp-range=192.0.2.10, 192.0.1.2, 24h 1

[armadillo ~]# persist_file /etc/dnsmasq.d/dhcp.conf 2
[armadillo ~]# rc-service dnsmasq restart 3

図6.159 dnsmasq の設定ファイルを編集する


1

子機に割り当てる IP アドレスの範囲とリース期間を設定します。

2

設定ファイルを永続化します。

3

dnsmasq を再起動します。

hostapd と dnsmasq の起動完了後、子機から hostapd.conf で設定した SSID とパスフレーズで接続できます。

6.14.8. ファイアウォールの設定方法

開放しているポートが存在すると攻撃者の標的になる可能性があります。 開発したサーバーが使用するポートに対して、アクセスできる IP アドレスを制限することでセキュリティ上のリスクを低減することができます。

ここでは、iptables コマンドを使用した、パケットフィルタリングによるアクセス制限方法を紹介します。

図6.160「特定のポートに対する IP アドレスのフィルタリング」の例では、Armadillo の特定のポートに対して、特定の IP アドレスからのアクセスのみを受け入れるようにします。 この例では、<送信元 IP アドレス> は Armadillo にパケットを送信する IP アドレス、<ポート番号> はパケットを受け入れる Armadillo のポート番号、<プロトコル> は通信プロトコルのことを指します。 また、<ポート番号> はパケットを受け入れる Armadillo のポート番号のことを指します。

[armadillo ~]# iptables -I INPUT -s <送信元 IP アドレス> -p <プロトコル> --dport <ポート番号> -j ACCEPT 1
[armadillo ~]# iptables -A INPUT -p <プロトコル> --dport <ポート番号> -j REJECT 2
[armadillo ~]# iptables -L 3
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     <プロトコル>  --  <送信元 IP アドレス> anywhere             <プロトコル> dpt:<ポート番号>
REJECT     <プロトコル>  --  anywhere             anywhere             <プロトコル> dpt:<ポート番号> reject-with icmp-port-unreachable
... 省略

[armadillo ~]# /etc/init.d/iptables save 4
[armadillo ~]# persist_file /etc/iptables/rules-save 5

図6.160 特定のポートに対する IP アドレスのフィルタリング


1

<ポート番号> に <送信元 IP アドレス> から送られてきたパケットを受け入れるように設定します。

2

<ポート番号> に <送信元 IP アドレス> 以外から送信されてきたパケットを拒否するように設定します。

3

想定通りに設定されているか確認します。

4

上記の設定を設定ファイル /etc/iptables/rules-save に保存します。

5

保存した設定ファイルを永続化します。

図6.160「特定のポートに対する IP アドレスのフィルタリング」はあくまで一例ですが、このように iptables コマンドを用いることで開発したサーバーにアクセスできる IP アドレスを制限することができます。

上記の設定を削除する場合は図6.161「特定のポートに対する IP アドレスのフィルタリングの設定を削除」に示すコマンドを実行してください。

[armadillo ~]# armadillo:~# iptables -L --line-number 1
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     <プロトコル>  --  <送信元 IP アドレス> anywhere             <プロトコル> dpt:<ポート番号>
2    REJECT     <プロトコル>  --  anywhere             anywhere             <プロトコル> dpt:<ポート番号> reject-with icmp-port-unreachable
... 省略

[armadillo ~]# iptables -D INPUT 2 2
[armadillo ~]# iptables -D INPUT 1 3
[armadillo ~]# /etc/init.d/iptables save 4
[armadillo ~]# persist_file /etc/iptables/rules-save 5

図6.161 特定のポートに対する IP アドレスのフィルタリングの設定を削除


1

削除する設定の番号(num)を確認します。 ここでは 1 番と 2 番の設定を削除します。

2

2 番の設定を削除します。

3

1 番の設定を削除します。

4

上記の設定を設定ファイル /etc/iptables/rules-save に保存します。

5

保存した設定ファイルを永続化します。

6.15. コマンドラインからストレージを使用する

ここでは、SDHCカードを接続した場合を例にストレージの使用方法を説明します。以降の説明では、共通の操作が可能な場合に、SD/SDHC/SDXCカードをSDカードと表記します。

[ティップ]

SDXC/microSDXCカードを使用する場合は、事前に「ストレージのパーティション変更とフォーマット」を参照してフォーマットを行う必要があります。これは、LinuxカーネルがexFATファイルシステムを扱うことができないためです。通常、購入したばかりのSDXC/microSDXCカードはexFATファイルシステムでフォーマットされています。

Linuxでは、アクセス可能なファイルやディレクトリは、一つの木構造にまとめられています。あるストレージデバイスのファイルシステムを、この木構造に追加することを、マウントするといいます。マウントを行うコマンドは、 mount です。

mount コマンドの典型的なフォーマットは、次の通りです。

mount [-t fstype] device dir

図6.162 mountコマンド書式


-t オプションに続く fstype には、ファイルシステムタイプを指定します。ファイルシステムタイプの指定は省略可能です。省略した場合、mount コマンドはファイルシステムタイプを推測します。この推測は必ずしも適切なものとは限りませんので、事前にファイルシステムタイプが分かっている場合は明示的に指定してください。FAT32ファイルシステムの場合は vfat 、EXT3ファイルシステムの場合はext3を指定します。

[注記]

通常、購入したばかりのSDHCカードはFAT32 または exFATファイルシステムでフォーマットされています。

device には、ストレージデバイスのデバイスファイル名を指定します。microSDカードのパーティション1の場合は /dev/mmcblk1p1 、パーティション2の場合は /dev/mmcblk1p2 となります。

dir には、ストレージデバイスのファイルシステムをマウントするディレクトリを指定します。

microSDスロット (CON1) にSDHCカードを挿入し、以下に示すコマンドを実行すると、 /media ディレクトリにSDHCカードのファイルシステムをマウントすることができます。microSDカード内のファイルは、/media ディレクトリ以下に見えるようになります。

[armadillo ~]# mount -t vfat /dev/mmcblk1p1 /media
[armadillo ~]# ls /media
  :
  :

図6.163 ストレージのマウント


ストレージを安全に取り外すには、アンマウントという作業が必要です。アンマウントを行うコマンドは、 umount です。オプションとして、アンマウントしたいデバイスがマウントされているディレクトリを指定します。

[armadillo ~]# umount /media

図6.164 ストレージのアンマウント


6.15.1. ストレージのパーティション変更とフォーマット

通常、購入したばかりのSDHCカードやUSBメモリは、一つのパーティションを持ち、FAT32ファイルシステムでフォーマットされています。

パーティション構成を変更したい場合、 fdisk コマンドを使用します。 fdisk コマンドの使用例として、一つのパーティションで構成されている microSDカードのパーティションを、2つに分割する例を図6.165「fdiskコマンドによるパーティション変更」に示します。一度、既存のパーティションを削除してから、新たにプライマリパーティションを二つ作成しています。先頭のパーティションには100MByte、二つめのパーティションに残りの容量を割り当てています。先頭のパーティションは /dev/mmcblk1p1 、二つめは /dev/mmcblk1p2 となります。 fdisk コマンドの詳細な使い方は、manページ等を参照してください。

[armadillo ~]# fdisk /dev/mmcblk1

Welcome to fdisk (util-linux 2.29.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-7744511, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-7744511, default 7744511): +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-7744511, default 206848):
Last sector, +sectors or +size{K,M,G,T,P} (206848-7744511, default 7744511):

Created a new partition 2 of type 'Linux' and of size 3.6 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
[  447.905671]  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. コマンドラインから CPU の測定温度を取得する

Armadillo-IoT ゲートウェイ A6E の温度センサーは、i.MX6ULL の TEMPMON(Temperature Monitor)を利用しています。

起動直後の設定では、i.MX6ULL の測定温度が 100℃以上になった場合、Linuxカーネルが /sbin/poweroff コマンドを実行し、システムを停止します。

6.16.1. 温度を取得する

/sys/class/thermal/thermal_zone0/temp ファイルの値を読み出すことによって、i.MX6ULL の測定温度を取得することができます。

[armadillo ~]# cat /sys/class/thermal/thermal_zone0/temp
50000 1

図6.167 i.MX6ULL の測定温度を取得する


1

温度はミリ°C の単位で表示されます。この例では 50.000°C を示しています。

6.17. SMS を利用する (Cat.1/Cat.M1 モデル)

Armadillo-IoT ゲートウェイ A6E は、LTE モジュール を使用した SMS の送受信を行うことができます。 SMS の送信、受信した SMS の確認および削除などの操作は ModemManager の mmcli コマンドで行うことができます。

本章では mmcli コマンドでの SMS の使用方法について説明します。

[警告]

「スリープ(SMS 起床可能)モードへの遷移と起床」 の手順でスリープモードへ遷移する際、LTE モジュールのストレージから 1 件 SMS を削除してからスリープモードへ遷移します。

SMS で受信した内容が必要な場合は、 SMS の内容を別なファイルなどに保存してから aiot-sleep-sms を実施してください。

6.17.1. 初期設定

SMS が利用可能な SIM を挿入して Armadillo-IoT ゲートウェイ A6E の電源を入れると、 ModemManager が必要な初期設定を行い、 SMS が利用可能になります。

SMS の受信は自動的に行われます。

図6.168「言語設定」に示すコマンドを実行し、言語設定を行います。

[armadillo ~]# export LANG="ja_JP.UTF-8"

図6.168 言語設定


6.17.2. SMS を送信する

SMS を作成するには、図6.169「SMS の作成」に示すコマンドを実行します。

[armadillo ~]# mmcli -m 0 --messaging-create-sms="number=[送信先電話番号],text='[SMS 本文]'"

図6.169 SMS の作成


SMSの作成に成功すると、以下のようにSMS番号が表示されます。SMS番号は送信時に使用します。

Successfully created new SMS: /org/freedesktop/ModemManager1/SMS/[SMS 番号]

図6.170 SMS 番号の確認


図6.171「SMS の送信」に示すコマンドを実行し、SMS 送信を行います。 [SMS番号] には、 SMS の作成時に表示された番号を指定します。

[armadillo ~]# mmcli -s [SMS 番号] --send

図6.171 SMS の送信


6.17.3. SMS を受信する

SMS を送信可能な端末から Armadillo-IoT ゲートウェイ A6E に SMS を送信すると、 Armadillo-IoT ゲートウェイ A6E は自動的に SMS を受信します。

また、 ELS31-J/EMS31-J の内蔵ストレージに 10 件 SMS を保存した状態で Armadillo-IoT ゲートウェイ A6E に SMS を送信した場合は、Armadillo-IoT ゲートウェイ A6E は受信を行いません。

受信を行うには、 ELS31-J/EMS31-J の内蔵ストレージに保存している SMS を削除するか、他のストレージに移動する必要があります。

6.17.4. SMS 一覧を表示する

図6.172「SMS の一覧表示」のコマンドを実行することで、 SMS 一覧を表示できます。

末尾が "(sent)" となっているものが送信した SMS で "(received)" となっているものが受信した SMS です。

[armadillo ~]# mmcli -m 0 --messaging-list-sms
Found 7 SMS messages:
         /org/freedesktop/ModemManager1/SMS/0 (received)
         /org/freedesktop/ModemManager1/SMS/1 (received)
         /org/freedesktop/ModemManager1/SMS/2 (received)
         /org/freedesktop/ModemManager1/SMS/3 (received)
         /org/freedesktop/ModemManager1/SMS/4 (sent)
         /org/freedesktop/ModemManager1/SMS/5 (received)
         /org/freedesktop/ModemManager1/SMS/6 (sent)

図6.172 SMS の一覧表示


6.17.5. SMS の内容を表示する

SMS の内容を表示するには、図6.173「SMSの内容を表示」に示すコマンドを実行します。

[armadillo ~]# mmcli -s [SMS 番号]
  ----------------------------------
  Content    |              number: XXXXXXXXXXX
             |                text: hello world
  ----------------------------------
  Properties |            PDU type: deliver
             |               state: received
             |             storage: me
             |                smsc: +XXXXXXXXXXXX
             |           timestamp: XXXXXXXXXXXX+XX

図6.173 SMSの内容を表示


受信した SMS は自動的に LTE モジュールの内蔵ストレージに保存されます。Armadillo-IoT ゲートウェイ A6E に搭載されている、 ELS31-J/EMS31-J は、最大 10 件まで SMS を保存することが可能です。

SMS の内容を表示した際の「storage: me」は、 LTE モジュールの内蔵ストレージに SMS が保存されていることを意味しています。

「storage: sm」と表示された場合、 SIM カードのストレージに SMS が保存されています。 SIM カードのストレージに保存できる SMS の件数は SIM カードによって異なります。

ストレージに保存されている SMS は、Armadillo-IoT ゲートウェイ A6E の電源を切断してもデータが保持されます。

6.17.6. SMS を削除する

SMS を削除するには、図6.174「SMSの削除」に示すコマンドを実行します。

[armadillo ~]# mmcli -m 0 --messaging-delete-sms=[SMS 番号]

図6.174 SMSの削除


6.17.7. SMS を他のストレージに移動する

SIM カードのストレージに SMS を移動するには、図6.175「SIM カードのストレージに SMS を移動」に示すコマンドを実行します。

[armadillo ~]# mmcli -s [SMS 番号] --store-in-storage="sm"

図6.175 SIM カードのストレージに SMS を移動


LTE モジュールの内蔵ストレージに SMS を移動するには、図6.176「LTE モジュールの内蔵ストレージに SMS を移動」に示すコマンドを実行します。

[armadillo ~]# mmcli -s [SMS 番号] --store-in-storage="me"

図6.176 LTE モジュールの内蔵ストレージに SMS を移動


6.18. ボタンやキーを扱う

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.18.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.177 buttond で SW1 を扱う


1

buttond の設定ファイルを編集します。この例では、短押しの場合 /tmp/shotpress に、5 秒以上の長押しの場合 /tmp/longpress に日付を出力します。

2

設定ファイルを保存します。

3

buttond サービスを再起動させます。ここでは再起動後短押しを 2 回、長押しを 1 回行ったとします。

4

押された回数を確認します。

6.18.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.178 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.179 buttond で USB キーボードを扱う


6.18.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.180 buttond で SW1 を Armadillo 起動時のみ受け付ける設定例


1

SW1 の入力を /dev/input/by-path/platform-gpio-keys-event ファイルの PROG1 として認識できます。

2

buttond 起動後 10 秒経過すると終了します。

3

SW1 を一度検知した後すぐに終了します。

4

サービスとして動作させる必要がないため & を付けてバックグラウンド起動します。

6.19. 動作中の Armadillo の温度を測定する

この章では、Armadillo Base OS 搭載製品を組み込んだユーザー製品の熱設計時に役立つ温度プロファイラツールである「atmark-thermal-profiler」について紹介します。

6.19.1. 温度測定の重要性

Armadillo は製品ごとに動作温度範囲が設定されていますが、それらはあくまでも標準筐体に放熱材と共に取り付けて使用した場合の目安であり、実運用時には自作の筐体の使用や放熱の有無などで記載のスペック通りにならない場合があります。 また、 Armadillo には CPU または SoC が特定の温度以上になると、自動的にシャットダウンするサーマルシャットダウン機能が搭載されています。 そのため、現実的には Armadillo を組み込んだ製品を運用時と同等の環境で動作させつつ、実際に温度を計測して実運用時の CPU 及び SoC 温度がどの程度まで上がるか、サーマルシャットダウンは起こらないかを確かめる必要があります。

Armadillo Base OS 搭載製品では、動作中の Armadillo の各種温度等を取得しCSV形式で出力する atmark-thermal-profiler を利用することができますので、温度測定に役立てることができます。

6.19.2. atmark-thermal-profiler をインストールする

atmark-thermal-profiler は apk パッケージで公開されていますので、apk add コマンドでインストールすることが可能です。

[armadillo ~]# apk upgrade
[armadillo ~]# apk add atmark-thermal-profiler

図6.181 atmark-thermal-profiler をインストールする


[警告]

atmark-thermal-profiler はデバッグ(開発)用途で温度情報を収集及び解析するツールです。 atmark-thermal-profiler は、他の apk パッケージと同様に persist_file -a コマンドで永続的にインストールしておくことが可能ですが、 ログの保存のために Armadillo が起動している間 eMMC への書き込みを続けるので、 Armadillo を組み込んだ製品の運用時に動かしたままにしておくことは推奨しません。

atmark-thermal-profiler を永続的にインストールする場合は、運用時には必ず削除してください。

6.19.3. atmark-thermal-profiler を実行・停止する

図6.182「atmark-thermal-profiler を実行する」に示すコマンドを実行することで、 atmark-thermal-profiler が動作を開始します。

[armadillo ~]# rc-service atmark-thermal-profiler start

図6.182 atmark-thermal-profiler を実行する


図6.183「atmark-thermal-profiler を停止する」に示すコマンドを実行することで、 atmark-thermal-profiler が動作を停止します。

[armadillo ~]# rc-service atmark-thermal-profiler stop

図6.183 atmark-thermal-profiler を停止する


6.19.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.184 ログファイルの内容例


thermal_profile.csv の1行目はヘッダ行です。 各列についての説明を表6.30「thermal_profile.csvの各列の説明」に記載します。

表6.30 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.19.5. 温度測定結果の分析

atmark-thermal-profiler を使用して得られたログファイルの内容を分析してみます。

6.19.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.185 サーマルシャットダウン温度の確認(Armadillo-IoT ゲートウェイ G4を例に)


1

CPU のサーマルシャットダウン温度です。ミリ℃で表記されているので、105℃でサーマルシャットダウンすることがわかります。

2

SoC のサーマルシャットダウン温度です。ミリ℃で表記されているので、105℃でサーマルシャットダウンすることがわかります。

6.19.5.2. 温度測定結果のグラフ化

atmark-thermal-profiler が出力するログ(thermal_profile.csv)はCSVファイルなので、各種表計算ソフトでインポートしてグラフ化することが可能です。 これにより Armadillo 動作中の温度の変化が可視化され、得られる情報が見やすくなります。

図6.186「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.186 Armadillo-IoT ゲートウェイ G4で取得した温度のグラフ


グラフの縦軸は温度(℃)で、横軸は時間です。青い線は CPU の温度、赤い線は SoC の温度を表しています。 このグラフと、「サーマルシャットダウン温度の確認」で得たサーマルシャットダウン温度を見比べると、 CPU に負荷をかけた際であっても SoC の温度は 60℃ 前後ほどまでしか上がらず、 この条件で動く Armadillo が温度的にどれほど余裕を持っているかをひと目で確認できます。

6.19.5.3. CPU使用率の確認

atmark-thermal-profiler は、時間毎の温度だけでなく CPU 使用率と CPU 使用率の高いプロセスについても取得して記録します。 CPU 使用率については thermal_profile.csv の CPU_1〜CPU_5 列と、 USE_1〜USE_5 列を参照してください。 各列について詳しくは表6.30「thermal_profile.csvの各列の説明」にまとまっています。

一般的に CPU 使用率が高くなると、 CPU 周辺の温度も高くなります。 そのため、測定した温度が高い場合は、 CPU 使用率の高いプロセスに注目して、 CPU を無駄に使用している意図しない処理が行なわれていないかなどを確認することをおすすめします。

6.19.6. Armadillo Twin から Armadillo の温度を確認する

atmark-thermal-profiler の他に、Armadillo Twin からも温度や CPU 負荷率等の情報を確認することができます。 詳細は Armadillo Twin ユーザーマニュアル 「デバイス監視アラートを管理する」 をご確認ください。

6.20. 電源を安全に切るタイミングを通知する

Armadillo Base OS には、シャットダウン中に電源を切っても安全なタイミングで通知する機能があります。通知は GPIO 出力を用いて行います。どの GPIO 出力ピンを使うのかを Device Tree で設定します。Device Tree で通知用に設定された GPIO 出力ピンの出力レベルを変化させる動作は、シャットダウン中に実行される signal_indicator が行います。通知用に設定した GPIO 出力ピンに割り当てた名前を、signal_indicator の設定ファイルに記述することにより、電源を切っても安全なタイミングで、その GPIO 出力ピンの出力が変化します。

以下、signal_indicator の設定手順と、通知用の Device Tree の設定手順を順に述べます。Device Tree の設定は、DTS overlays を使用して行います。

[注記]

以下の手順は Armadillo Base OS v3.17.2-at.4 以降に存在します /boot/armadillo-iotg-a6e-stdwn-ind-do1.dtbo または /boot/armadillo-iotg-a6e-stdwn-ind-con8-pin7.dtbo を使用します。v3.17.2-at.4 より前のバージョンをご利用の場合はアップデートしてのご利用をお願いします。

6.20.1. signal_indicator の設定

signal_indicator を設定するには、/etc/conf.d ディレクトリに indicator_signals という名前で、次の内容のテキストファイルを作成してください。

stdwn_led=STDWN_IND

図6.187 /etc/conf.d/indicator_signals の記述内容


図6.188「/etc/conf.d/indicator_signals の永続化」 に示すコマンドで /etc/conf.d/indicator_signals の追加を永続化します。

[armadillo ~]# persist_file -vp /etc/conf.d/indicator_signals

図6.188 /etc/conf.d/indicator_signals の永続化


6.20.2. DTS overlays の設定

以下の 「CON6(入出力インターフェース)の接点出力 1 を使用する」「CON8(拡張インターフェース)の7番ピンを使用する」 どちらかの設定を行ってください。これ以外のピンを使用する場合はデバイスツリーを記載してビルドする必要があります。

6.20.2.1. CON6(入出力インターフェース)の接点出力 1 を使用する

[ティップ]

CON6(入出力インターフェース)の接点出力ピンは、ゲートウェイコンテナアプリケーションも使用しており、接点出力1を本機能に割り当てると、ゲートウェイコンテナアプリケーションでは、そのピンを使用できなくなります。本機能に接点出力1を割り当てる場合は、ゲートウェイコンテナアプリケーションで接点出力1を使わないように設定してください。

接点出力に対するゲートウェイコンテナアプリケーションの設定は、「ゲートウェイコンテナの設定ファイル」 を参照してください。ゲートウェイコンテナアプリケーションで接点出力1を使用する場合、本機能には CON8(拡張インターフェース)のピンを割り当ててください。

「DTS overlays によるカスタマイズ」 を参考にして /boot/overlays.txt に armadillo-iotg-a6e-stdwn-ind-do1.dtbo を追加してください。

6.20.2.2. CON8(拡張インターフェース)の7番ピンを使用する

「DTS overlays によるカスタマイズ」 を参考にして /boot/overlays.txt に armadillo-iotg-a6e-stdwn-ind-con8-pin7.dtbo を追加してください。

6.20.3. 動作確認

ここまで述べた設定を行うと、シャットダウン動作中に通知が行われるようになります。シャットダウン動作の最後の方で、以下のメッセージを出力するのと同じタイミングで通知を行います。つまり、通知用に割り当てた GPIO 出力ピンの出力レベルが、0/Low から 1/High に変わります。シャットダウンが完了して SoC (CPU) への給電がオフすると、出力レベルが 0/Low に戻ります。出力レベルが 0/Low から 1/High に変化した時点以降であれば、Armadillo-IoT A6E の電源を切っても安全です。

indicator_signals        | * Signaling external devices we are shutting down ...

図6.189 indicator_signals のコンソール出力


6.21. Armadillo Base OS をアップデートする

Armadillo Base OS は SWUpdate によってアップデートすることができます。

アップデートする際には、rootfs ファイルシステムにインストールされたファイルをすべて消して、アップデートの中身と /etc/swupdate_preserve_files に記載されているファイルで新しい rootfs を作ります。「swupdate_preserve_files について」 を参照してください。

アップデートでファイルを削除してしまった場合に abos-ctrl mount-old で前のシステムを read-only でマウントして、 削除されたファイルをコピーすることもできます。

6.22. ロールバック状態を確認する

Armadillo Base OS のルートファイルシステムが破損し起動できなくなった場合、自動的に以前のバージョンで再起動します。

abos-ctrl status コマンドでロールバックされてるかどうかを確認できます。

[armadillo ~]# abos-ctrl status
Currently booted on /dev/mmcblk2p1
Last update on Fri Jun  7 16:03:37 JST 2024, updated: 1
  boot: 2020.4-at23-00001-g01508f65b8 -> 2020.4-at23
  base_os: 3.19.1-at.3.20240523.pc.gtr -> 3.19.1-at.4
rollback-status: OK: available, no auto-rollback 2

図6.190 abos-ctrl status の例


1

最新のアップデートの日付と内容が出力されています。

2

表6.31「rollback-status の出力と意味」表6.32「rollback-status 追加情報の出力と意味」 に示す状態と追加情報が出力されています。

表6.31 rollback-status の出力と意味

出力説明

OK

ロールバックされていません。

rolled back

ロールバックされています。


表6.32 rollback-status 追加情報の出力と意味

出力説明

no fallback (fresh install)

初期化状態。

no fallback

何かの理由でB面が起動できない状態になっています(アップデート失敗後等)。

auto-rollback enabled (post-update)

アップデート直後でまだ再起動していない状態です。再起動して失敗した場合にロールバックが発生します。

auto-rollback enabled (cloned)

abos-ctrl rollback-clone コマンドを実行した後の状態です。同じくロールバック可能です。

available, no auto-rollback

アップデートの後に正常に起動できたので、自動ロールバックが無効になっていますが abos-ctrl rollback --allow-downgrade コマンドで手動ロールバック可能です。


[注記]

Armadillo Base OS 3.19.1-at.4 以下のバージョンでは「アップデート直後」の概念がなかったため、ステータスは「no fallback」(B面がない状態)、 「optimal」(ロールバック可能)、と「rolled back」の3択だけでした。

必要な場合(例えば、自分のアプリケーションがアップデート直後に問題があった場合)、 abos-ctrl rollback で手動のロールバックも可能です。ロールバックにエラーがなければ、再起動してロールバックを完了します。

なお、/var/at-log/atlog に切り替えの際に必ずログを書きますので、調査の時に使ってください。 以下の例では、Armadillo Base OS を更新した後に起動できないカーネルをインストールして、起動できなかったためにロールバックされました。

[armadillo ~]# cat /var/at-log/atlog
Jun  7 16:03:37 armadillo NOTICE swupdate: Installed update to /dev/mmcblk0p2: \
boot: 2020.4-at22 -> 2020.4-at23, base_os: 3.19.1-at.3 -> 3.19.1-at.4
Jun  7 16:11:39 armadillo NOTICE swupdate: Installed update to /dev/mmcblk0p1: \
extra_os.kernel: unset -> 5.10.218-1
Jun  7 16:12:18 armadillo WARNING uboot: reset by wdt
Jun  7 16:12:42 armadillo WARNING uboot: reset by wdt
Jun  7 16:13:06 armadillo WARNING uboot: reset by wdt
Jun  7 16:13:09 armadillo WARNING uboot: Counted 3 consecutive unfinished boots
Jun  7 16:13:09 armadillo WARNING uboot: Rolling back to mmcblk0p2

図6.191 /var/at-log/atlog の内容の例


6.23. 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.192 local サービスの実行例


1

スクリプトを作ります。

2

スクリプトを実行可能にします。

3

スクリプトを保存して、再起動します。

4

実行されたことを確認します。

6.24. 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.193 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.33 u-bootの主要な環境変数

環境変数説明デフォルト値

console

コンソールのデバイスノードと、UARTのボーレート等を指定します。

ttymxc2,115200

bootcount

起動回数を示します。初回起動時に1となり、起動に失敗する度にインクリメントされます。ユーザーランドのreset_bootcountサービスが起動されると、この値はクリアされます。この値が"bootlimit"を越えた場合はロールバックします。ロールバックの詳細については、「ロールバック(リカバリー)」を参照してください。

1

bootlimit

"bootcount"のロールバックを行うしきい値を指定します。

3

upgrade_available

1以上の場合は bootcount を管理してロールバック可能になります。0 か空の場合はロールバックできません。値を abos-ctrl status で確認できます。

状況による

bootdelay

保守モードに遷移するためのキー入力を待つ時間を指定します(単位:秒)。次の値は特別な意味を持ちます。

  • -1: キー入力の有無に関らず保守モードに遷移します。
  • -2: キー入力の有無に関らず保守モードに遷移しません。
  • -3: キー入力の有無に関らず保守モードに遷移しません。ただし、SW1が押下されている場合は保守モードに遷移します。

0

image

Linuxカーネルイメージファイルのパスです。"mmcdev"で指定されたデバイスの、"mmcpart"で指定されたパーティションのルートディレクトリからの相対パスで指定します。

boot/uImage

fdt_file

DTBファイルのパスです。"mmcdev"で指定されたデバイスの、"mmcpart"で指定されたパーティションのルートディレクトリからの相対パスで指定します。

boot/armadillo.dtb

overlays_list

DT overlayの設定ファイルのパスです。"mmcdev"で指定されたデバイスの、"mmcpart"で指定されたパーティションのルートディレクトリからの相対パスで指定します。DT overlayの詳細については、「DTS overlays によるカスタマイズ」を参照してください。

boot/overlays.txt

mmcautodetect

mmcデバイスの自動検出機能の有効/無効を指定します。yesを指定した場合のみ、u-bootが起動されたmmcデバイスが自動的にmmcdevとして利用されます。

yes

mmcdev

"image"や"fdt_file"で指定されたファイルが配置してあるmmcデバイスのインデックスを指定します。インデックスとmmcデバイスの対応は次の通りです。

  • 0: eMMC
  • 1: microSD/microSDHC/microSDXC カード

"mmcautodetect"にyesが指定されている場合は、u-bootの起動時に上書きされます。

0

mmcpart

"image"や"fdt_file"で指定されたファイルが配置してある、"mmcdev"で指定されたmmcデバイスのパーティション番号を指定します。"mmcautodetect"にyesが指定されている場合は、u-bootの起動時に上書きされます。

1

mmcroot

ルートファイルシステムが配置されているデバイスノードと、マウントオプションを指定します。"mmcautodetect"にyesが指定されている場合は、u-bootの起動時に上書きされます。overlayfsが正しく機能しなくなる場合があるので、roの指定は変更しないでください。

/dev/mmcblk0p1 rootwait ro

optargs

Linuxカーネル起動時パラメータを指定します。"quiet"を削除すると、コンソールに起動ログが出力されるようになりますが、起動時間が長くなります。

quiet

loadaddr

LinuxカーネルがRAMにロードされる物理アドレスを指定します。

0x80800000

fdt_addr

DTBがRAMにロードされる物理アドレスを指定します。

0x83500000

overlay_addr

DT overlayのワーク領域として利用されるRAMの物理アドレスを指定します。

0x83520000


6.24.1. u-boot の環境変数の変更を制限する

u-boot のソースに含まれる u-boot-[VERSION]/configs/armadillo-iotg-a6e_defconfig に CONFIG_ENV_WRITEABLE_LIST=y を追加すると、変更可能と明示したもの以外の環境変数を変更不可にすることができます。 変更可能とする環境変数のリストは u-boot-[VERSION]/include/configs/armadillo-640.h ファイルの CFG_ENV_FLAGS_LIST_STATIC で設定します。

デフォルトのコンフィグでは、以下の環境変数が変更可能です:

  • upgrade_availablebootcount: ロールバック機能に必要な変数です。ロールバック機能を無効に する場合は必ず upgrade_available のデフォルト値も空にしてください。
  • ethaddr: ネットワークコマンド関連の変数です。デフォルトのブー トコマンドはネットワークを使用してませんので動作に影響ありません。

u-boot のソースの取得方法、ビルド方法およびインストール方法については 「ブートローダーをビルドする」 を参照してください。 ビルドしたものをインストールすると CFG_ENV_FLAGS_LIST_STATIC で設定した環境変数以外は変更できなくなります。

6.25. SDブートの活用

本章では、microSD カードから直接起動(以降「SDブート」と表記します)する手順を示します。 SD ブートを活用すると、microSD カードを取り替えることでシステムイメージを変更することができます。 本章に示す手順を実行するためには、容量が 8Gbyte 以上の microSD カードを必要とします。

[ティップ]

SD ブートを行った場合、ブートローダーの設定は microSDカード に保存されます。

[警告]

WLAN 搭載モデルでは、SD コントローラ(uSDHC2) を WLAN/BT コンボモジュールが使用するため SD ブートができません。

6.25.1. ブートディスクの作成

  1. ブートディスクイメージをビルドします

    「Alpine Linux ルートファイルシステムをビルドする」 で説明されているソースツリー alpine/build-rootfs にあるスクリプト build_image「ブートローダーをビルドする」 でビルドした u-boot-dtb.imx を利用します。

[ATDE ~/build-rootfs-[VERSION]]$ sudo ./build_image.sh --board a6e \
          --boot ~/u-boot-[VERSION]/u-boot-dtb.imx
: (省略)
[ATDE ~/build-rootfs-[VERSION]]$ ls baseos-6e*img
baseos-6e-[VERSION].img
  1. ATDE に microSD カードを接続します。詳しくは 「取り外し可能デバイスの使用」 を参考にしてください。
  2. 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
    : (省略)
  3. 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.194 自動マウントされたmicroSDカードのアンマウント


  4. ブートディスクイメージの書き込み

    [ATDE ~]$ sudo dd if=~/build-rootfs-[VERSION]/baseos-6e-[VERSION].img \
                      of=/dev/sdb bs=1M oflag=direct status=progress

    microSDカードの性能にもよりますが、書き込みには5分程度かかります。

[ティップ]

microSDカードのパーティション構成は次のようになっています。

表6.34 microSDカードのパーティション構成

パーティション オフセット サイズ 説明

-

0

10MiB

ブートローダー

1

10MiB

300MiB

A/B アップデートのA面パーティション

2

310MiB

300MiB

A/B アップデートのB面パーティション

3

610MiB

50MiB

ログ用パーティション

4

660MiB

200MiB

ファームウェア

5

860MiB

残り

アプリケーション用パーティション


gdiskで確認すると次のようになります。

[ATDE ~]$ sudo gdisk -l /dev/sdb
GPT fdisk (gdisk) version 1.0.6

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/sdb: 60506112 sectors, 28.9 GiB
Model: VMware Virtual I
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 44B816AC-8E38-4B71-8A96-308F503238E3
Partition table holds up to 128 entries
Main partition table begins at sector 20448 and ends at sector 20479
First usable sector is 20480, last usable sector is 60485632
Partitions will be aligned on 2048-sector boundaries
Total free space is 0 sectors (0 bytes)

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        60485632   28.0 GiB    8300  app

6.25.2. SDブートの実行

「ブートディスクの作成」で作成したブートディスクから起動する方法を説明します。

  1. Armadillo-IoT ゲートウェイ A6Eに電源を投入する前に、ブートディスクをCON1(SD インターフェース)に挿入します。 また、SW2 を 起動デバイスは microSD 側設定します。SW2 に関しては、図3.118「スイッチの状態と起動デバイス」 を参照ください。
  2. 電源を投入します。

    U-Boot 2020.04 (Oct 25 2022 - 10:37:29 +0900)
    
    CPU:   i.MX6ULL rev1.1 at 396 MHz
    Model: Atmark Techno Armadillo-IoT Gateway A6E Board
    DRAM:  512 MiB
    PMIC: PFUZE3000 DEV_ID=0x30 REV_ID=0x11
    MMC:   FSL_SDHC: 0, FSL_SDHC: 1
    Loading Environment from MMC... *** Warning - bad CRC, using default environment
    
    In:    serial
    Out:   serial
    Err:   serial
    Saving Environment to MMC... Writing to redundant MMC(1)... OK
    switch to partitions #0, OK
    mmc1 is current device
    flash target is MMC:1
    Net:
    Warning: ethernet@2188000 using MAC address from ROM
    eth0: ethernet@2188000
    Fastboot: Normal
    Normal Boot
    Hit any key to stop autoboot:  0
    switch to partitions #0, OK
    mmc1 is current device
    11660400 bytes read in 524 ms (21.2 MiB/s)
    Booting from mmc ...
    38603 bytes read in 22 ms (1.7 MiB/s)
    Loading fdt boot/armadillo.dtb
    ## Booting kernel from Legacy Image at 80800000 ...
    
    ...中略...
    
    Welcome to Alpine Linux 3.16
    Kernel 5.10.149-1-at on an armv7l (/dev/ttymxc2)
    
    armadillo login:

6.25.3. ゲートウェイコンテナのインストール

「ブートディスクの作成」で作成したブートディスクには、ゲートウェイコンテナが含まれていません。 必要な場合は、ゲートウェイコンテナの SWU イメージを作成してインストールする必要があります。

  1. 「SWUイメージの作成」 記載の手順で、最初の書き込み用の SWU イメージ initial_setup.swu を作成します。
  2. ゲートウェイコンテナの SWU イメージを作成

    1. Armadillo-IoT ゲートウェイ A6E ゲートウェイコンテナ から「SWU イメージ作成アーカイブ」ファイル (a6e-gw-container-[version].tar.gz) を図6.195「ゲートウェイコンテナ SWU イメージアーカイブをダウンロードし、 SWU イメージを作成する」に示す手順でダウンロードし、 SWU イメージを作成します。

      [ATDE ~]$ wget https://armadillo.atmark-techno.com/files/downloads/armadillo-iot-a6e/container/a6e-gw-container-[version].tar.gz 1
      [ATDE ~]$ mkdir a6e-gw-container-swu
      [ATDE ~]$ tar xf a6e-gw-container-[version].tar.gz -C a6e-gw-container-swu
      [ATDE ~]$ cd a6e-gw-container-swu
      [ATDE ~]$ mkswu a6e-gw-container.desc 2
      Enter pass phrase for /home/atmark/mkswu/swupdate.key:
      以下のファイルをUSBメモリにコピーしてください:
      '/path/to/a6e-gw-container.swu'
      '/path/to/a6e-gw-container-image-[version].tar'
      '/path/to/.a6e-gw-container/a6e-gw-container-image-[version].tar.sig'

      図6.195 ゲートウェイコンテナ SWU イメージアーカイブをダウンロードし、 SWU イメージを作成する


      1

      ゲートウェイコンテナ SWU イメージアーカイブをダウンロードします

      2

      mkswu コマンドで SWU イメージを作成します

  3. SWU イメージのインストール

    「SWU イメージのインストール」 の手順に従い、最初の書き込み用の SWU イメージと、ゲートウェイコンテナ SWU イメージをインストールします。 なお、必ず最初の書き込み用の SWU イメージを先にインストールするよう注意してください。

6.26. Device Treeをカスタマイズする

拡張基板を追加するなど、拡張インターフェース(CON8)のピンを使用する場合、ATDE 上のアプリケーション at-dtweb を利用して Device Tree をカスタイマイズすることが可能です。

at-dtweb は、 Web ブラウザ上のマウス操作で dtbo ファイルおよび desc ファイルを生成することができます。

カスタマイズの対象は拡張インターフェース(CON8)です。

[警告]

拡張インターフェース(CON8) の 12、13 ピン は I2C4 として予約しています。

6.26.1. at-dtweb のインストール

ATDE9 に at-dtweb パッケージをインストールします。

[ATDE ~]$ sudo apt update
[ATDE ~]$ sudo apt install at-dtweb

インストール済みの場合は、以下のコマンドを実行し最新版への更新を行ってください。

[ATDE ~]$ sudo apt update
[ATDE ~]$ sudo apt upgrade

6.26.2. at-dtweb の起動

  1. at-dtweb の起動開始

    at-dtweb の起動を開始するには、デスクトップ左上のアプリケーションの「システムツール」から「at-dtweb」を選択してください。

    images/at-dtweb-activity.png

    図6.196 at-dtweb の起動開始


コマンドライン上からでも、at-dtweb コマンドで起動できます。

[ATDE ~]$ at-dtweb
  1. ボードの選択

    ボードを選択します。Armadillo-IoT_A6E を選択して、「OK」をクリックします。

    images/at-dtweb-board-select.png

    図6.197 ボード選択画面


  2. Linux カーネルディレクトリの選択

    Linux カーネルディレクトリを選択します。コンフィギュレーション済みの Linux カーネルディレクトリを選択して、「OK」をクリックします。

    images/at-dtweb-kernel-select.png

    図6.198 Linux カーネルディレクトリ選択画面


  3. at-dtweb の起動完了

    at-dtweb が起動し、次のように画面が表示されます。

    images/at-dtweb-main.png

    図6.199 at-dtweb 起動画面


[ティップ]

Linux カーネルは、事前にコンフィギュレーションされている必要があります。コンフィギュレーションの手順については「Armadilloのソフトウェアをビルドする」を参照してください。

6.26.3. Device Tree をカスタマイズ

6.26.3.1. 機能の選択

機能の選択は、ドラッグ&ドロップで行います。画面左上の「Available features」から有効にしたい機能をドラッグし、画面右側の「Armadillo-IoT Gateway A6E」の白色に変化したピンにドロップします。例として CON8 8/9 ピンを UART1(RXD/TXD) に設定します。

[ティップ]

何も機能が選択されていないピンには GPIO の機能が割り当てられます。

images/at-dtweb-enable-feature1.png

図6.200 UART1(RXD/TXD) のドラッグ


images/at-dtweb-enable-feature2.png

図6.201 CON8 8/9 ピンへのドロップ


6.26.3.2. 信号名の確認

画面右側の「Armadillo-IoT Gateway A6E」にドロップして設定したピンを左クリックすると信号名が表示されます。 どのピンがどの信号に対応しているのかを確認することができます。

例として UART1(RXD/TXD) の信号名を確認します。

images/at-dtweb-show-signal-name.png

図6.202 信号名の確認


[ティップ]

再度ピンを左クリックすると機能名の表示に戻ります。

6.26.3.3. プロパティの設定

いくつかの機能にプロパティを設定することができます。画面右側の「Armadillo-IoT Gateway A6E」に選択した機能を左クリックすると、画面左下の「Properties」からプロパティを選択することができます。

例としてCON8 29-32 ピンの ECSPI1 の spi-max-frequency プロパティを設定します。

images/at-dtweb-set-property.png

図6.203 プロパティの設定


設定したプロパティを確定させるには「Apply」をクリックします。

images/at-dtweb-apply-property.png

図6.204 プロパティの保存


6.26.3.4. 機能の削除

全ての機能を削除する場合は、画面右上の「Reset configuration」をクリックします。機能ごとに削除する場合は、画面右側の「Armadillo-IoT Gateway A6E」のピンを右クリックして「Remove」をクリックします。

images/at-dtweb-reset-configuration.png

図6.205 全ての機能の削除


images/at-dtweb-remove-configuration.png

図6.206 ECSPI1 の削除


6.26.3.5. dtbo/desc の生成

dtbo ファイルおよび desc ファイルを生成するには、画面右上の「Save」をクリックします。

images/at-dtweb-save-configuration.png

図6.207 dtbo/desc ファイルの生成


以下の画面ようなメッセージが表示されると、dtbo ファイルおよび desc ファイルの生成は完了です。

images/at-dtweb-save-complete-dtbo.png

図6.208 dtbo/desc の生成完了


ビルドが終了すると、ホームディレクトリ下の mkswu/at-dtweb-Armadillo-IoT_A6E/ ディレクトリに、DTS overlays ファイル(dtboファイル)と desc ファイルが生成されます。 Armadillo-IoT ゲートウェイ A6E 本体に書き込む場合は、mkswu コマンドで desc ファイルから SWU イメージを生成してアップデートしてください。

[ATDE ~]$ ls ~/mkswu/at-dtweb-Armadillo-IoT_A6E/
armadillo-iotg-a6e-at-dtweb.dtbo  update_overlays.sh
at-dtweb.desc                     update_preserve_files.sh
[ATDE ~]$ cd ~/mkswu/at-dtweb-Armadillo-IoT_A6E/
[ATDE ~/mkswu/at-dtweb-Armadillo-IoT_A6E]$ mkswu at-dtweb.desc 1
Enter pass phrase for /home/atmark/mkswu/swupdate.key:
at-dtweb.swu を作成しました。

1

SWU イメージを生成します。

SWU イメージを使ったアップデートの詳細は 「SWU イメージのインストール」 を参照してください。

6.26.4. DTS overlays によるカスタマイズ

Device Treeは「DTS overlay」(dtbo) を使用することでも変更できます。

DTS overlay を使用することで、通常の dts の更新が自動的に入りつづける状態で dts の変更でしかできない設定を行うことができます。

/boot/overlays.txtfdt_overlays を dtbo 名で設定することで、 u-bootが起動時にその DTS overlay を通常の dtb と結合して起動します。

複数の DTS overlay を使う場合は以下の例のようにスペースで別けたファイル名を記載することができます。

[armadillo ~]# ls /boot/ 1
armadillo-iotg-a6e-at-dtweb.dtbo  armadillo-iotg-a6e.dtb  uImage
armadillo-iotg-a6e-ems31.dtbo     armadillo.dtb           uboot_env.d
armadillo-iotg-a6e-lwb5plus.dtbo  overlays.txt

[armadillo ~]# persist_file /boot/armadillo-iotg-a6e-at-dtweb.dtbo 2
[  441.860885] EXT4-fs (mmcblk0p1): re-mounted. Opts: (null)

[armadillo ~]# vi /boot/overlays.txt 3
fdt_overlays=armadillo-iotg-a6e-ems31.dtbo armadillo-iotg-a6e-at-dtweb.dtbo

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

[armadillo ~]# reboot 5
: (省略)
Applying fdt overlay: armadillo-iotg-a6e-ems31.dtbo 6
Applying fdt overlay: armadillo-iotg-a6e-at-dtweb.dtbo
: (省略)

図6.209 /boot/overlays.txt の変更例


1

at-dtweb で作成した dtbo ファイルを USB メモリや microSD カード等の外部記憶装置を用いて転送し、 /boot/ ディレクトリ下に配置します。

2

配置した dtbo ファイルを保存します。

3

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

4

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

5

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

6

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

6.26.4.1. 提供している DTS overlay

以下の DTS overlay を用意しています:

  • armadillo-iotg-a6e-els31.dtbo: LTE Cat.1 モジュール搭載モデルで自動的に使用します。
  • armadillo-iotg-a6e-ems31.dtbo: LTE Cat.M1 モジュール搭載モデルで自動的に使用します。
  • armadillo-iotg-a6e-lwb5plus.dtbo: WLAN+BT コンボモジュール搭載モデルで自動的に使用します。
  • armadillo-iotg-a6e-stdwn-ind-do1.dtbo: /boot/overlays.txt に記載することで使用できます。使用方法は「電源を安全に切るタイミングを通知する」を参照ください。
  • armadillo-iotg-a6e-stdwn-ind-con8-pin7.dtbo: /boot/overlays.txt に記載することで使用できます。使用方法は「電源を安全に切るタイミングを通知する」を参照ください。

6.26.5. 独自の DTS overlay を追加する

標準イメージで提供している DTS overlay や at-dtweb で作成できないような DTS overlay が必要となった場合に、独自の DTS overlay を作成し Armadillo へ適用する手順を示します。

  1. 「Linux カーネルをビルドする」 を参照の上、最新版カーネルのビルドまで実施してください。

    以下、ATDE のホームディレクトリに linux-[VERSION] ディレクトリができている前提で進めます。

  2. カスタマイズ用に用意しています arch/arm/boot/dts/armadillo-600-customize.dts を編集します。

    [ATDE ~/linux-[VERSION]]$ vi arch/arm/boot/dts/armadillo-600-customize.dts

    図6.210 armadillo-600-customize.dts の編集


  3. 編集したファイルをビルドします。

    [ATDE ~/linux-[VERSION]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
      DTC     arch/arm/boot/dts/armadillo-600-customize.dtbo

    図6.211 編集した dts ファイルのビルド


  4. ビルドしてできた armadillo-600-customize.dtbo を Armadillo の /boot/ に配置します。

    [armadillo ~]# ls /boot/armadillo-600-customize.dtbo
    /boot/armadillo-600-customize.dtbo

    図6.212 ビルドした DTS overlay ファイルを Armadillo に配置


  5. 配置した dtbo を永続化します。

    [armadillo ~]# persist_file /boot/armadillo-600-customize.dtbo

    図6.213 ビルドした DTS overlay ファイルを永続化


  6. /boot/overlays.txt に armadillo-600-customize.dtbo を追記し、/boot/overlays.txt を永続化します。

    [armadillo ~]# vi /boot/overlays.txt
    fdt_overlays=armadillo-iotg-a6e-ems31.dtbo armadillo-600-customize.dtbo 1
    [armadillo ~]# persist_file /boot/overlays.txt

    図6.214 /boot/overlays.txt の編集と永続化


    1

    Cat.M1 モデルの例です。すでに別の dtbo ファイルが記載されている場合、スペースを挿入して後ろに追加してください。

  7. Armadillo を再起動し、動作確認をします。

6.27. Armadilloのソフトウェアをビルドする

ここでは、Armadillo-IoT ゲートウェイ A6E で使用するソフトウェアのビルド方法を説明します。

6.27.1. ブートローダーをビルドする

ここでは、ATDE 上で Armadillo-IoT ゲートウェイ A6E 向けのブートローダーイメージをビルドする方法を説明します。

  1. ソースコードの取得

    Armadillo-IoT ゲートウェイ A6E ブートローダー から「ブートローダー ソース」ファイル (u-boot-[VERSION].tar.gz) を図6.215「ブートローダーのソースコードをダウンロードする」に示す手順でダウンロードします。

    [ATDE ~]$ wget https://download.atmark-techno.com/armadillo-iot-a6e/bootloader/u-boot-[VERSION].tar.gz
    [ATDE ~]$ tar xf u-boot-[VERSION].tar.gz
    [ATDE ~]$ cd u-boot-[VERSION]

    図6.215 ブートローダーのソースコードをダウンロードする


  2. デフォルトコンフィギュレーションの適用

    図6.216「デフォルトコンフィギュレーションの適用」に示すコマンドを実行します。

    [ATDE ~/u-boot-[VERSION]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- armadillo-iotg-a6e_defconfig
      HOSTCC  scripts/basic/fixdep
      HOSTCC  scripts/kconfig/conf.o
      YACC    scripts/kconfig/zconf.tab.c
      LEX     scripts/kconfig/zconf.lex.c
      HOSTCC  scripts/kconfig/zconf.tab.o
      HOSTLD  scripts/kconfig/conf
    #
    # configuration written to .config
    #

    図6.216 デフォルトコンフィギュレーションの適用


  3. ビルド

    ブートローダーのビルドを実行するには、図6.217「ブートローダーのビルド」に示すコマンドを実行します。

    [ATDE ~/u-boot-[VERSION]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
    :
    : (省略)
    :
      SHIPPED dts/dt.dtb
      FDTGREP dts/dt-spl.dtb
      CAT     u-boot-dtb.bin
      CFGS    u-boot-dtb.cfgout
      MKIMAGE u-boot-dtb.imx
      OBJCOPY u-boot.srec
      COPY    u-boot.bin
      SYM     u-boot.sym
      COPY    u-boot.dtb
      CFGCHK  u-boot.cfg

    図6.217 ブートローダーのビルド


  4. インストール

    ビルドしたブートローダーは、以下に示すどちらかの方法でインストールしてください。

    • 「SWU イメージのインストール」 でインストールする

      mkswu の初期化を行った後に 提供されているスクリプトを使ってSWUイメージを作成してください。

      [ATDE ~/u-boot-[VERSION]]$ echo 'swdesc_boot u-boot-dtb.imx' > boot.desc
      [ATDE ~/u-boot-[VERSION]]$ mkswu boot.desc
      boot.swu を作成しました。

      図6.218 ブートローダーを SWU でインストールする方法


      作成された boot.swu のインストールについては 「SWU イメージのインストール」 を参照ください。

    • 「ブートディスクの作成」 でインストールする

      手順を参考にして、ビルドされた u-boot-dtb.imx を使ってください。

6.27.2. Linux カーネルをビルドする

ここでは、Armadillo-IoT ゲートウェイ A6E 向けのLinuxカーネルイメージをビルドする方法を説明します。

[ティップ]

Armadillo-IoT ゲートウェイ A6Eでは、基本的にはLinuxカーネルイメージをビルドする必要はありません。 「Alpine Linux ルートファイルシステムをビルドする」の手順を実施することで、標準のLinuxカーネルイメージがルートファイルシステムに組み込まれます。

標準のLinuxカーネルイメージは、アットマークテクノが提供する linux-at というAlpine Linux用のパッケージに含まれています。

カスタマイズしたLinuxカーネルイメージを利用する場合は、 以下に示す手順を参照してください。

  1. ソースコードの取得

    Armadillo-IoT ゲートウェイ A6E Linuxカーネル から「Linuxカーネル」ファイル (linux-at-a6-[VERSION].tar) をダウンロードして、図6.219「Linux カーネルソースコードの展開」に示すコマンドを実行して展開します。

    [ATDE ~]$ tar xf linux-at-a6-[VERSION].tar
    [ATDE ~]$ tar xf linux-at-a6-[VERSION]/linux-[VERSION].tar.gz
    [ATDE ~]$ cd linux-[VERSION]

    図6.219 Linux カーネルソースコードの展開


  2. デフォルトコンフィギュレーションの適用

    図6.220「Linux カーネルデフォルトコンフィギュレーションの適用」に示すコマンドを実行します。

    [ATDE ~/linux-[VERSION]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- armadillo-iotg-a6e_defconfig

    図6.220 Linux カーネルデフォルトコンフィギュレーションの適用


  3. Linux カーネルコンフィギュレーションの変更

    コンフィギュレーションの変更を行わない場合はこの手順は不要です。 変更する際は、図6.221「Linux カーネルコンフィギュレーションの変更」に示すコマンドを実行します。

    [ATDE ~/linux-[VERSION]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

    図6.221 Linux カーネルコンフィギュレーションの変更


    コマンドを実行するとカーネルコンフィギュレーション設定画面が表示されます。 カーネルコンフィギュレーションを変更後、"Exit"を選択して「Do you wish to save your new kernel configuration? (Press <ESC><ESC> to continue kernel configuration.)」で "Yes" を選択し、 カーネルコンフィギュレーションを確定します。

     .config - Linux/arm 5.10.145 Kernel Configuration
     ─────────────────────────────────────────────
      ┌──────────  Linux/arm 5.10.145 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  --->                                                  │ │
      │ │         System Type  --->                                                    │ │
      │ │         Bus support  --->                                                    │ │
      │ │         Kernel Features  --->                                                │ │
      │ │         Boot options  --->                                                   │ │
      │ │         CPU Power Management  --->                                           │ │
      │ │         Floating point emulation  --->                                       │ │
      │ │         Power management options  --->                                       │ │
      │ │         Firmware Drivers  --->                                               │ │
      │ │     [ ] ARM 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 >              │
      └──────────────────────────────────────────┘

    図6.222 Linux カーネルコンフィギュレーション設定画面


    [ティップ]

    Linux Kernel Configuration メニューで"/"キーを押下すると、カーネルコンフィギュレーションの検索を行うことができます。 カーネルコンフィギュレーションのシンボル名(の一部)を入力して"Ok"を選択すると、部分一致するシンボル名を持つカーネルコンフィギュレーションの情報が一覧されます。

  4. ビルド

    Linux カーネルをビルドするには、図6.223「Linux カーネルのビルド」に示すコマンドを実行します。

    [ATDE ~/linux-[VERSION]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x82000000 uImage
    [ATDE ~/linux-[VERSION]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

    図6.223 Linux カーネルのビルド


  5. インストール

    ビルドしたカーネルは、以下に示すどちらかの方法でインストールしてください。

    • 「SWU イメージのインストール」 でインストールする

      mkswu の初期化を行った後に 提供されているスクリプトを使ってSWUイメージを作成してください。

      [ATDE ~/linux-[VERSION]]$ /usr/share/mkswu/examples/kernel_update_plain.install.sh ~/mkswu/kernel.desc
      Installing kernel in /home/atmark/mkswu/kerneltest ...
      'arch/arm/boot/uImage' -> '/home/atmark/mkswu/kernel/uImage'
      'arch/arm/boot/dts/armadillo-610-at-dtweb.dtb' -> '/home/atmark/mkswu/kernel/armadillo-610-at-dtweb.dtb'
      : (省略)
        INSTALL arch/arm/crypto/chacha-neon.ko
        INSTALL arch/arm/crypto/curve25519-neon.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.224 Linux カーネルを SWU でインストールする方法


      作成された kernel.swu のインストールについては 「SWU イメージのインストール」 を参照ください。

      [注記]

      この kernel.swu をインストールする際は /etc/swupdate_preserve_files の更新例 の様に /boot/lib/modules を維持するように追加します。 カーネルをインストールした後に Armadillo Base OS を更新しても、この kernel.swu のカーネルが維持されます。

      標準のカーネルに戻りたいか、以下の 図6.225「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/a6e/packages" 2
      [ATDE ~/linux-[VERSION]]$ cp -v arch/arm/boot/uImage "$BROOTFS/a6e/resources/boot/"
      'arch/arm/boot/uImage' -> '/home/atmark/build-rootfs-v3.17-at.3/a6e/resources/boot/uImage'
      [ATDE ~/linux-[VERSION]]$ cp -v arch/arm/boot/dts/armadillo*.{dtb,dtbo} "$BROOTFS/a6e/resources/boot/"
      'arch/arm/boot/dts/armadillo-610-at-dtweb.dtb' -> '/home/atmark/build-rootfs-v3.17-at.3/a6e/resources/boot/armadillo-610-at-dtweb.dtb'
      : (省略)
      [ATDE ~/linux-[VERSION]]$ rm -rfv "$BROOTFS/a6e/resources/lib/modules" 3
      [ATDE ~/linux-[VERSION]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH="$BROOTFS/a6e/resources" -j5 modules_install
        INSTALL arch/arm/crypto/chacha-neon.ko
        INSTALL arch/arm/crypto/curve25519-neon.ko
      : (省略)
        DEPMOD  [VERSION]

      図6.225 Linux カーネルを build_rootfs でインストールする方法


      1

      build_rootfs のディレクトリ名を設定します。これによって、長いディレクトリ名を何度も入力する必要が無くなります。

      2

      アットマークテクノが提供するカーネルをインストールしない様に、 linux-at-a6@atmark と記載された行を削除します。

      3

      別のカーネルをすでにインストールしている場合は、新しいモジュールをインストールする前に古いモジュールを削除する必要があります。

6.27.3. Alpine Linux ルートファイルシステムをビルドする

ここでは、build-rootfs を使って、 Alpine Linux ルートファイルシステムを構築する方法を説明します。

build-rootfs は、ATDE 上で Armadillo-IoT ゲートウェイ A6E 用の Alpine Linux ルートファイルシステムを構築することができるツールです。

  1. ルートファイルシステムのビルドに必要な Podman のインストール

    次のコマンドを実行します。

    [ATDE ~]$ sudo apt install podman btrfs-progs xxhash
  2. build-rootfs の入手

    Armadillo-IoT ゲートウェイ A6E 開発用ツール から 「Alpine Linuxルートファイルシステムビルドツール」 ファイル (build-rootfs-[VERSION].tar.gz) を次のようにダウンロードします。

    [ATDE ~/]$ wget https://download.atmark-techno.com/armadillo-iot-a6e/tool/build-rootfs-latest.tar.gz
    [ATDE ~/]$ tar xf build-rootfs-latest.tar.gz
    [ATDE ~/]$ cd build-rootfs-[VERSION]
  3. Alpine Linux ルートファイルシステムの変更

    a6eディレクトリ以下のファイルを変更することで、 ルートファイルシステムをカスタマイズすることができます。

    [ティップ]

    commonとa6e ディレクトリ直下にあるfixupやpackagesなどの同名ファイルは、それぞれのファイルを連結して利用されます。パッケージの削除などを行う場合は、commonディレクトリ以下のファイルも確認してください。

    commonとa6e内のサブディレクトリにある同名ファイルは、a6eのファイルが利用されます。

    build-rootfsに含まれるファイルの説明は次の通りです。

    表6.35 build-rootfsのファイル説明

    ファイル説明

    a6e/resources/*

    配置したファイルやディレクトリは、そのままルートファイルシステム直下にコピーされます。 ファイルを追加する場合は、このディレクトリに入れてください。

    a6e/packages

    このファイルに記載されているパッケージはルートファイルシステムにインストールされます。 パッケージを追加する場合はこのファイルに追加してください。

    a6e/fixup

    このファイルに記載されているコマンドはパッケージのインストールが完了した後に実行されます。

    a6e/image_firstboot/*

    配置したファイルやディレクトリは、「ブートディスクの作成」「初期化インストールディスクの作成」の手順 のようにブートディスクイメージを作成する際、そのままルートファイルシステム直下にコピーされます。

    a6e/image_installer/*

    配置したファイルやディレクトリは、「初期化インストールディスクの作成」の手順 のようにインストールディスクイメージを作成する際、 そのままインストーラーにコピーされます。ルートファイルシステムに影響はありません。

    a6e/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 -b a6e
    use default(outdir=/home/atmark/git/build-rootfs)
    use default(output=baseos-6e-ATVERSION.tar.zst)
    :
    : (略)
    :
    > Creating rootfs archive
    -rw-r--r--    1 root     root     231700480 Oct 11 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 を引数に追加してください。

    [ティップ]

    任意のパス、ファイル名で結果を出力することもできます。

    [ATDE ~/build-rootfs-[VERSION]]$ ./build_rootfs.sh -b a6e ~/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. インストール

    ビルドしたルートファイルシステムは、以下に示すどちらかの方法でインストールしてください。

    • 「SWU イメージのインストール」 でインストールする

      mkswu の初期化を行った後に 提供されているスクリプトを使ってSWUイメージを作成してください。

      [ATDE ~/build-rootfs-[VERSION]]$ vi OS_update.desc
      swdesc_tar --version base_os [VERSION] \
          --preserve-attributes baseos-6e-[VERSION].tar.zst
      [ATDE ~/build-rootfs-[VERSION]]$ mkswu OS_update.desc
      OS_update.swu を作成しました。

      作成された OS_update.swu のインストールについては 「SWU イメージのインストール」 を参照ください。

    • 「ブートディスクの作成」 でインストールする

      手順を実行すると、ビルドされた baseos-6e-[VERSION].tar.zst が自動的に利用されます。

6.28. SBOM の提供

アットマークテクノでは ABOS 及び ABOS 上で動作する標準ソフトウェアの SBOM を提供しています。 また、開発したソフトウェアの SWU イメージを作成するタイミングで SBOM を生成することができます。 SBOM 生成手順は 「ビルドしたルートファイルシステムの SBOM を作成する」 もしくは 「SWU イメージと同時に SBOM を作成する」 を参照ください。

6.28.1. SBOM について

SBOM(Software Bill of Materials: ソフトウェア部品表) は、 ソフトウェアを構成するコンポーネントやソフトウェア間の依存関係、ライセンス情報を記したリストです。 経済産業省は、ソフトウェアサプライチェーンが複雑化する中で、 急激に脅威が増しているソフトウェアのセキュリティを確保するための管理手法の一つとして SBOM の導入を推進しています。 SBOM の導入はソフトウェアのトレーサビリティを確保し、脆弱性残留リスクの低減、脆弱性対応期間の低減に繋がります。 アットマークテクノが提供する SBOM は ISO/IEC5962で国際標準となっているSPDX2.2のフォーマットに準拠しています。

SPDX2.2 の詳細については以下のドキュメントをご参照ください。

The Software Package Data Exchange® (SPDX®) Specification Version 2.2.2

アットマークテクノの提供する mkswu コマンドでは SWU を作成するタイミングで SBOM を生成することができます。

6.28.2. SBOM の利点

SBOM の利点はソフトウェアのサプライチェーン攻撃への対応です。 ソフトウェアのセキュリティ対策は日々見直されており、 トレーサビリティが明らかになることで、ソフトウェアに含まれる脆弱性に速やかに対処することが可能になります。 SBOM はトレーサビリティを辿るのに優れており、加えて、脆弱性スキャンツールを用いることで、 表面化していない脆弱性の発見に利用できます。 脆弱性スキャンツールには例として、Google が提供する osv-scanner が挙げられます。 脆弱性に関する詳細なリンクや、脆弱性の深刻度を示す CVSS(Common Vulnerability Scoring System) を出力します。 アットマークテクノが提供する SBOM は osv-scanner のスキャンに対応しています。

osv-scanner の詳細については以下をご参照ください。

OSV-Scanner

アットマークテクノが提供している ABOS は GPLv3(GNU General Public License 第3版)のソフトウェアを含まない構成で提供しています。 OSS(オープンソース・ソフトウェア)利用者に広く普及しているGPLv3は、 インストール用情報の開示義務、関連する特許ライセンスの許諾について定める条項が含まれ、 組み込み機器に適用する際の妨げになる場合があります。 SBOM にはパッケージのライセンス情報が含まれているため、GPLv3 ライセンスが含まれているかどうかの検出を可能にします。

6.28.3. ビルドしたルートファイルシステムの SBOM を作成する

「Alpine Linux ルートファイルシステムをビルドする」 を実行すると、OS_update.swu と同じ場所に SBOM を作成します。 SBOM を作成するには、作成する対象のファイルとライセンス情報等を記載するためのコンフィグファイルが必要となります。 また、baseos-6e-[VERSION].tar.zst から、アーカイブに含まれるパッケージ情報やファイル情報を SBOM に記載します。

ライセンス情報等を記載するためのコンフィグファイルの例は以下のコマンドで確認することができます。 各項目に関する説明はコメントに記載しておりますので、必要に応じて値を変更してください。 各項目の詳細な説明については SPDX specification v2.2.2 (https://spdx.github.io/spdx-spec/v2.2.2/) をご覧ください。

[ATDE ~/build-rootfs-[VERSION]]$ cat submodules/make-sbom/config.yaml

作成したコンフィグファイルと、baseos-6e-[VERSION].tar.zst から OS_update.swu の SBOM を作成します。

[ATDE ~/build-rootfs-[VERSION]]$ ./build_sbom.sh -i OS_update.swu -c <コンフィグファイル> -f baseos-6e-[VERSION].tar.zst
INFO:root:created OS_update.swu.spdx.json

作成される SBOM は OS_update.swu.spdx.json になります。 json 形式で ISO/IEC5962で国際標準となっているSPDX2.2のフォーマットに準拠しています。

アットマークテクノが提供しているソフトウェアの SBOM は ソフトウェアダウンロード の各ソフトウェアダウンロードページからダウンロードすることができます。

6.28.4. SWU イメージと同時に SBOM を作成する

「SWUイメージの作成」 の実行時に SBOM を作成する方法について説明します。 SWU イメージは desc ファイルから作成されます。この desc ファイルに SBOM 作成に必要な情報についても記載します。

6.28.4.1. コンフィグファイルを作成する

SBOM を作成するには、作成する対象のファイルとライセンス情報等を記載するためのコンフィグファイルが必要となります。 コンフィグファイルについて指定がない場合はデフォルトのコンフィグファイルで SBOM を作成します。 デフォルトのコンフィグファイルは /usr/share/make-sbom/config/config.yaml にあります。 このファイルは SBOM 作成ツールによって配置されます。 コンフィグファイルを編集するために、例としてカレントディレクトリにコピーします。 リリース時には正しいコンフィグファイルの内容を記載してください。

[ATDE ~]$ cp /usr/share/make-sbom/config/config.yaml .
[ATDE ~]$ vi config.yaml

ライセンス情報等を記載するためのコンフィグファイルの例は以下のコマンドで確認することができます。 各項目に関する説明はコメントに記載しておりますので、必要に応じて値を変更してください。 各項目の詳細な説明については SPDX specification v2.2.2 (https://spdx.github.io/spdx-spec/v2.2.2/) をご覧ください。

「desc ファイルを編集する」 で desc ファイルに編集したコンフィグファイルのパスを指定します。

6.28.4.2. desc ファイルを編集する

SBOM 作成のために、desc ファイルに記載する項目を以下に示します。

表6.36 descファイルの設定項目

項目設定値説明

swdesc_option BUILD_SBOM=<mode>

auto(デフォルト): SBOM 作成ツールがある場合作成する

SBOM を作成するかどうか。記載がない場合は auto が選択される

yes: SBOMを作成する。SBOM 作成ツールがない場合はエラーする

no: SBOM を作成しない

swdesc_option sbom_config_yaml=<path>

ファイルパス

コンフィグファイルのパスを指定する。記載がない場合はデフォルトのコンフィグファイルを使用する

swdesc_sbom_source_file <path>

ファイルパス

SBOM に含めるファイルを指定する。記載がない場合は SBOM に含まれない


以下に desc ファイルの記載例について示します。

swdesc_option component=make_sbom
swdesc_option version=1
swdesc_option BUILD_SBOM=yes1
swdesc_option sbom_config_yaml=config.yaml2

swdesc_sbom_source_file manifest.json3

図6.226 descファイルの追加例


1

SBOM を作成するように設定します。例として必ず作成するように "yes" を指定します。

2

コンフィグファイルのパスを設定します。例としてカレントディレクトリにある config.yaml を指定します。

3

SBOM に含めたいファイルがある場合に指定します。例として manifest.json を指定します。

desc ファイルの作成が出来たら 「SWUイメージの作成」 を実行すると、SWU イメージと同じ場所に SBOM が作成されます。 desc ファイルの内容によっては SBOM 作成に数分かかります。 作成される SBOM のファイル名は <SWU イメージ名>.spdx.json になります。 json 形式で ISO/IEC5962で国際標準となっているSPDX2.2のフォーマットに準拠しています。

6.29. eMMC のデータリテンション

eMMC は主に NAND Flash メモリから構成されるデバイスです。NAND Flash メモリには書き込みしてから1年から3年程度の長期間データが読み出されないと電荷が抜けてしまう可能性があります。その際、電荷が抜けて正しくデータが読めない場合は、eMMC 内部で ECC (Error Correcting Code) を利用してデータを訂正します。しかし、訂正ができないほどにデータが化けてしまう場合もあります。そのため、一度書いてから長期間利用しない、高温の環境で利用するなどのケースでは、データ保持期間内に電荷の補充が必要になります。電荷の補充にはデータの読み出し処理を実行し、このデータの読み出し処理をデータリテンションと呼びます。

Armadillo-IoT ゲートウェイ A6Eに搭載のeMMCは、eMMC自身にデータリテンション機能が備わっており、A6Eに電源が接続されてeMMCに電源供給されている状態で、eMMC内部でデータリテンション処理が自動実行されます。

6.30. 動作ログ

6.30.1. 動作ログについて

Armadillo-IoT ゲートウェイ A6E ではシステムが出力するログの一部は、 一般的な /var/log ディレクトリではなく、/var/at-log ディレクトリに出力されます。 /var/at-log は、ルートファイルシステムとは別のパーティションになっているので、 ルートファイルシステムに障害が発生した場合でも、/var/at-log のパーティションが無事であれば、 ログファイルを取り出して、不具合等の解析に利用することができます。

Armadillo-IoT ゲートウェイ A6E で /var/log 配下に出力するログに関しては 「/var/log/ 配下のログに関して」 を参照ください。

6.30.2. 動作ログを取り出す

ログファイルは /var/at-log ディレクトリ内に atlog というファイル名で作成されているので、 これを任意のディレクトリにコピーすることで取り出せます。 もし、eMMC 上のルートファイルシステムが壊れてしまい起動できない場合は、 microSD カードから起動することでログファイルを取り出すことができます。

[ティップ]

/var/at-log/atlog はファイルサイズが 3MiB になるとローテートされ /var/at-log/atlog.1 に移動されます。

/var/at-log/atlog.1 が存在する状態で、更に /var/at-log/atlog のファイルサイズが 3MiB になった場合は、 /var/at-log/atlog の内容が /var/at-log/atlog.1 に上書きされます。 /var/at-log/atlog.2 は生成されません。

6.30.3. ログファイルのフォーマット

ログファイルの内容はテキストデータであり、以下のようなフォーマットになっています。

日時 armadillo ログレベル 機能: メッセージ

図6.227 動作ログのフォーマット


atlog には以下の内容が保存されています。

  • インストール状態のバージョン情報
  • swupdate によるアップデートの日付とバージョン変更
  • abos-ctrl / uboot の rollback 日付
  • uboot で wdt による再起動があった場合にその日付

6.30.4. ログ用パーティションについて

ログ出力先である /var/at-log ディレクトリには、 GPP である /dev/mmcblk0gp1 パーティションがマウントされています。 このパーティションに論理的な障害が発生した場合は、/dev/mmcblk0gp1 の データを /dev/mmcblk0gp2 にコピーし、/dev/mmcblk0gp1 は FAT ファイルシステムで フォーマットされます。 このパーティションの障害チェックはシステム起動時に自動的に実行されます。

6.30.5. /var/log/ 配下のログに関して

表6.37「/var/log/ 配下のログ」 に Armadillo-IoT ゲートウェイ A6E で /var/log/ 配下に出力するログを示します。

最大ファイルサイズを超えると 表6.37「/var/log/ 配下のログ」 の「ファイル名」の 2 行目に記載されたファイル名にコピーします。

その状態から更に最大ファイルサイズを超えた場合、 表6.37「/var/log/ 配下のログ」 の「ファイル名」の 2 行目に記載されたファイル名に上書きします。

表6.37 /var/log/ 配下のログ

ファイル名 説明 最大ファイルサイズ 最大ファイル数

/var/log/messages

/var/log/messages.0

通常のログです。

4MiB

2

/var/log/connection-recover.log

/var/log/connection-recover.log.0

3G/LTE 搭載モデルで 3G/LTE 再接続サービスを稼働させているときに出力されるログです。

Armadillo Base OS バージョン 3.19.1-at5 以降で対応しております。

128KiB

2

/var/log/armadillo-twin-agent/agent_log

/var/log/armadillo-twin-agent/agent_log.1

Armadillo Twin Agent の動作ログです。

1MiB

2


6.31. シリアル通信ソフトウェア(minicom)のセットアップ

[注記]

ATDE9 v20240925 以降の ATDE では以下の設定を実施した状態のイメージを配布しています。 これより前のバージョンの場合は、次の手順に沿って minicom のシリアル通信設定を実施してください。

minicom を使用して Armadillo とシリアルコンソール経由で通信を行うためには、 表6.38「シリアル通信設定」 のとおりにあらかじめ設定しておく必要があります。 ここでは、その設定手順について説明します。 また、minicomを起動する端末の横幅を80文字以上にしてください。横幅が80文字より小さい場合、コマンド入力中に表示が乱れることがあります。

表6.38 シリアル通信設定

項目設定

転送レート

115,200bps

データ長

8bit

ストップビット

1bit

パリティ

なし

フロー制御

なし


  1. 図6.228「minicomの設定の起動」に示すコマンドを実行し、minicomの設定画面を起動してください。

    [ATDE ~]$ sudo LANG=C minicom --setup

    図6.228 minicomの設定の起動


  2. 図6.229「minicomの設定」が表示されますので、「Serial port setup」を選択してください。

                +-----[configuration]------+
                | Filenames and paths      |
                | File transfer protocols  |
                | Serial port setup        |
                | Modem and dialing        |
                | Screen and keyboard      |
                | Save setup as dfl        |
                | Save setup as..          |
                | Exit                     |
                | Exit from Minicom        |
                +--------------------------+

    図6.229 minicomの設定


  3. 図6.230「minicomのシリアルポートの設定」が表示されますので、Aキーを押してSerial Deviceを選択してください。

        +-----------------------------------------------------------------------+
        | A -    Serial Device      : /dev/ttyUSB0                              |
        | B - Lockfile Location     : /var/lock                                 |
        | C -   Callin Program      :                                           |
        | D -  Callout Program      :                                           |
        | E -    Bps/Par/Bits       : 115200 8N1                                |
        | F - Hardware Flow Control : No                                        |
        | G - Software Flow Control : No                                        |
        |                                                                       |
        |    Change which setting?                                              |
        +-----------------------------------------------------------------------+

    図6.230 minicomのシリアルポートの設定


  4. Serial Device に使用するデバイスファイル名として /dev/ttyUSB0 を入力してEnterキーを押してください。

    [注記]デバイスファイル名の確認方法

    デバイスファイル名は、環境によって /dev/ttyS0/dev/ttyUSB1 など、本書の実行例とは異なる場合があります。

    その場合は以下の方法でデバイスファイル名を確認してください。

    Linux で PC と Armadillo 側のシリアルポートを接続した場合、コンソールに以下のようなログが表示されます。 ログが表示されなくても、dmesgコマンドを実行することで、ログを確認することができます。

    usb 2-2.1: new full-speed USB device number 4 using uhci_hcd
    usb 2-2.1: New USB device found, idVendor=10c4, idProduct=ea60, bcdDevice= 1.00
    usb 2-2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
    usb 2-2.1: Product: CP2102N USB to UART Bridge Controller
    usb 2-2.1: Manufacturer: Silicon Labs
    usb 2-2.1: SerialNumber: 6a9681f80272eb11abb4496e014bf449
    usbcore: registered new interface driver usbserial_generic
    usbserial: USB Serial support registered for generic
    usbcore: registered new interface driver cp210x
    usbserial: USB Serial support registered for cp210x
    usb 2-2.1: cp210x converter now attached to ttyUSB0

    図6.231 例. シリアルポート接続時のログ


    上記の例では Armadillo 側のシリアルポートが ttyUSB0 に割り当てられたことが分かります。

  5. Fキーを押してHardware Flow ControlをNoに設定してください。
  6. Gキーを押してSoftware Flow ControlをNoに設定してください。
  7. キーボードのEキーを押してください。 図6.232「minicomのシリアルポートのパラメータの設定」 が表示されます。

                          +---------[Comm Parameters]----------+
                          |                                    |
                          |     Current: 115200 8N1            |
                          | Speed            Parity      Data  |
                          | A: <next>        L: None     S: 5  |
                          | B: <prev>        M: Even     T: 6  |
                          | C:   9600        N: Odd      U: 7  |
                          | D:  38400        O: Mark     V: 8  |
                          | E: 115200        P: Space          |
                          |                                    |
                          | Stopbits                           |
                          | W: 1             Q: 8-N-1          |
                          | X: 2             R: 7-E-1          |
                          |                                    |
                          |                                    |
                          | Choice, or <Enter> to exit?        |
                          +------------------------------------+

    図6.232 minicomのシリアルポートのパラメータの設定


  8. 図6.232「minicomのシリアルポートのパラメータの設定」では、転送レート、データ長、ストップビット、パリティの設定を行います。
  9. 現在の設定値は「Current」に表示されています。 それぞれの値の内容は図6.233「minicomシリアルポートの設定値」を参照してください。

    minicomシリアルポートの設定値

    図6.233 minicomシリアルポートの設定値


  10. Eキーを押して、転送レートを115200に設定してください。
  11. Qキーを押して、データ長を8、パリティをNone、ストップビットを1に設定してください。
  12. Enterキーを2回押して、図6.229「minicomの設定」に戻ってください。
  13. 図6.229「minicomの設定」から、「Save setup as dfl」を選択し、設定を保存してください。
  14. 「Exit from Minicom」を選択し、minicomの設定を終了してください。
[注記]

Ctrl-a に続いて z キーを入力すると、minicomのコマンドヘルプが表示されます。

6.32. viエディタを使用する

viエディタは、Armadilloに標準でインストールされているテキストエディタです。本書では、Armadilloの設定ファイルの編集などにviエディタを使用します。

viエディタは、ATDEにインストールされてるgeditやemacsなどのテキストエディタとは異なり、モードを持っていることが大きな特徴です。viのモードには、コマンドモードと入力モードがあります。コマンドモードの時に入力した文字はすべてコマンドとして扱われます。入力モードでは文字の入力ができます。

本章で示すコマンド例はATDEで実行するよう記載していますが、Armadilloでも同じように実行することができます。

6.32.1. viの起動

viを起動するには、以下のコマンドを入力します。

[ATDE ~]# vi [file]

図6.234 viの起動


file にファイル名のパスを指定すると、ファイルの編集( file が存在しない場合は新規作成)を行います。viはコマンドモードの状態で起動します。

6.32.2. 文字の入力

文字を入力するにはコマンドモードから入力モードへ移行する必要があります。コマンドモードから入力モードに移行するには、表6.39「入力モードに移行するコマンド」に示すコマンドを入力します。入力モードへ移行後は、キーを入力すればそのまま文字が入力されます。

表6.39 入力モードに移行するコマンド

コマンド動作

i

カーソルのある場所から文字入力を開始

a

カーソルの後ろから文字入力を開始


「i」、「a」それぞれのコマンドを入力した場合の文字入力の開始位置を図6.235「入力モードに移行するコマンドの説明」に示します。

images/common-images/vi-insert-command.svg

図6.235 入力モードに移行するコマンドの説明


入力モードからコマンドモードに戻りたい場合は、ESCキーを入力することで戻ることができます。現在のモードが分からなくなった場合は、ESCキーを入力し、一旦コマンドモードへ戻ることにより混乱を防げます。

[警告]

日本語変換機能をOFFに

viのコマンドを入力する時はATDEの日本語入力システム(Mozc)をOFFにしてください。日本語入力システムのON/OFFは、半角/全角キーで行うことができます。

[ティップ]

viでの文字削除

コンソールの環境によってはBS(Backspace)キーで文字が削除できず、「^H」文字が入力される場合があります。その場合は、「文字の削除」で説明するコマンドを使用し、文字を削除してください。

6.32.3. カーソルの移動

方向キーでカーソルの移動ができますが、コマンドモードで表6.40「カーソルの移動コマンド」に示すコマンドを入力することでもカーソルを移動することができます。

表6.40 カーソルの移動コマンド

コマンド動作

h

左に1文字移動

j

下に1文字移動

k

上に1文字移動

l

右に1文字移動


6.32.4. 文字の削除

文字を削除する場合は、コマンドモードで表6.41「文字の削除コマンド」に示すコマンドを入力します。

表6.41 文字の削除コマンド

コマンド動作

x

カーソル上の文字を削除

dd

現在行を削除


「x」コマンド、「dd」コマンドを入力した場合に削除される文字を図6.236「文字を削除するコマンドの説明」に示します。

images/common-images/vi-delete-command.svg

図6.236 文字を削除するコマンドの説明


6.32.5. 保存と終了

ファイルの保存、終了を行うコマンドを表6.42「保存・終了コマンド」に示します。

表6.42 保存・終了コマンド

コマンド動作

:q!

変更を保存せずに終了

:w[file]

ファイルを file に指定して保存

:wq

ファイルを上書き保存して終了


保存と終了を行うコマンドは「 : 」(コロン)からはじまるコマンドを使用します。" : "キーを入力すると画面下部にカーソルが移り入力したコマンドが表示されます。コマンドを入力した後Enterキーを押すことで、コマンドが実行されます。

6.33. オプション品

本章では、Armadillo-IoT ゲートウェイ A6Eのオプション品について説明します。

表6.43 Armadillo-IoT ゲートウェイ A6E 関連のオプション品

名称型番

ACアダプタ(12V/2.0A φ2.1mm)温度拡張品 効率レベルVI品

OP-AC12V4-00

Armadillo-IoTゲートウェイA6E 標準ケースセットロング(9M)

OP-CASEA6E-PLA-20


6.33.1. Armadillo-IoTゲートウェイA6E 標準ケースセットロング(9M)

6.33.1.1. 概要

Armadillo-IoTゲートウェイA6E用のプラスチック製ケースです。

images/op-casea6e-pla-20.svg

図6.237 ケース外観図


[ティップ]

Armadillo-IoTゲートウェイA6E 標準ケースセットロング(9M)はArmadillo-IoTゲートウェイA6E +Di8+Ai4 に付属しています。 ケースのみ必要なお客様のためにオプション品として別売りもしています。

表6.44 Armadillo-IoTゲートウェイA6E 標準ケースセットロング(9M)について

商品名

Armadillo-IoTゲートウェイA6E 標準ケースセットロング(9M)

型番

OP-CASEA6E-PLA-20

内容

ケース(トップ/ボトム)、カバーパーツ(A(アンテナ穴有り)/A(アンテナ穴無し)/B(アンテナ穴有り)/B(アンテナ穴無し)/C/D)、LEDライトパイプ、フック


表6.45 ケース(トップ/ボトム)の仕様

材質

PC/ABS 混合樹脂

難燃性

UL94 V-0

グレー

使用温度範囲

-20〜90℃


表6.46 フックの仕様

材質

PRO 樹脂

難燃性

UL94 V-0

使用温度範囲

-20〜90℃


表6.47 カバーパーツ A/B/C/Dの仕様

材質

PC 樹脂

難燃性

UL94 V-0

グレー

使用温度範囲

-20〜90℃


[警告]

最高使用温度よりも高い温度で保管または使用した場合、樹脂ケースが変形する可能性があります。

6.33.1.2. 組み立て

組み立て方法についてはArmadillo-IoT ゲートウェイ A6E +Di8+Ai4 製品マニュアルの「組み立てと分解」の章をご参照ください。

6.33.1.3. 形状図

images/9M_Case_layout.svg

図6.238 形状図 ケース外形(トップとボトムを組み合わせた状態)


images/9m_case_inner_dimension.svg

図6.239 形状図 ケース内高さおよび開口部寸法


images/9m_case_cover_a.svg

図6.240 形状図 カバーパーツA (アンテナ穴有り)


images/9m_case_cover_a_non_hole.svg

図6.241 形状図 カバーパーツA (アンテナ穴無し)


images/9m_case_cover_b.svg

図6.242 形状図 カバーパーツB (アンテナ穴有り)


images/9m_case_cover_b_non_hole.svg

図6.243 形状図 カバーパーツB (アンテナ穴無し)


images/9m_case_cover_c.svg

図6.244 形状図 カバーパーツC


images/9m_case_cover_d.svg

図6.245 形状図 カバーパーツD




[7] nmcli connection show [ID] によって、より詳細な情報を表示することもできます。