| | Armadillo-IoT ゲートウェイ A6E にはゲートウェイコンテナがプリインストールされています。
本章は、ゲートウェイコンテナを動かす方法について記載しています。 ゲートウェイコンテナは 「ゲートウェイコンテナとは」 に記載している通り、各インターフェースから取得するデータの設定や、接続するクラウドの情報を設定するだけで、
コンテナ内で動作するアプリケーションを修正することなく、クラウドにデータを送信することができます。 以下では、必要機器の接続やネットワークの設定は完了しているものとして説明を進めます。
一連の流れは下記の通りです。 ゲートウェイコンテナでは AWS IoT Core への接続をサポートしています。
それぞれについて、データの可視化までを行うことが出来る環境を構築するためのテンプレートを提供しています。 -
ゲートウェイコンテナ起動確認
接続先の クラウド 環境を構築 (クラウドにデータを送信する場合)
コンフィグ 設定
-
コンテナ起動・実行
-
コンテナ終了
ゲートウェイコンテナは、デフォルトで Armadillo-IoT ゲートウェイ A6E に電源を入れると自動的に起動する設定となっています。
Armadillo が起動し、ゲートウェイコンテナが起動・実行されると、 アプリケーション LED が点滅します。 10.1.3. 接続先の クラウド 環境を構築 (AWS)AWS では、 AWS IoT Core と Amazon CloudWatch を組み合わせてデータの可視化を行います。
本項では、 AWS 上で実施する設定を記載します。 手順中で使用するファイルは、Armadillo-IoT ゲートウェイ A6E ゲートウェイコンテナ から「クラウド設定データ」ファイル (a6e-gw-container-cloudsetting-[VERSION].zip) から予めダウンロードしておきます。 AWS IAM (Identity and Access Management) は、AWS リソースへのアクセスを安全に管理するためのウェブサービスです。IAM により、誰を認証(サインイン)し、誰にリソースの使用を承認する(アクセス許可を持たせる)かを管理することができます。
IAM へ移動し、「アクセス管理」→「ポリシー」を開き、「ポリシー作成」をクリックします。
「JSON」を選択し、「クラウド設定データ」ファイル (a6e-gw-container-cloudsetting-[VERSION].zip) AWS フォルダ内の a6e_aws_iam_policy.json のファイルの内容を貼り付け、「次のステップ:タグ」をクリックします。
-
何も選択せずに、「次のステップ:確認」をクリックします。
ポリシー名を入力し、「ポリシーの作成」をクリックします。ここでは、ポリシー名を "policy_for_A6E" としています。
IAM から、「アクセス管理」→「ユーザー」を開き、「ユーザーを追加」をクリックします。
下記の通り入力、選択し、「次のステップ:アクセス権限」をクリックします。
-
ユーザー名を入力する
-
AWS 認証情報タイプは両方選択する
-
コンソールのパスワードは「自動生成パスワード」を選択する
-
パスワードのリセットが必要にチェックを入れる
「既存のポリシーを直接アタッチ」をクリックし、先ほど作成したポリシーを選択して、「次のステップ:タグ」をクリックします。
-
何も選択せずに、「次のステップ:確認」をクリックします。
-
内容を確認し、「ユーザーの作成」をクリックします。
「.csv のダウンロード」をクリックし、"new_user_credentials.csv" をダウンロードして、「閉じる」をクリックします。
10.1.3.3. 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 |
この場合、00CD11112222 がシリアル番号になります
|
10.1.3.4. AWS IoT Core と Amazon CloudWatch の設定を行うAWS IoT Core に送信したデータを Amazon CloudWatch のダッシュボード上で可視化します。
ここでは、CloudFormation を用いて AWS IoT Core と Amazon CloudWatch の設定を行います。
CloudFormation へ移動し、「スタックの作成」→「新しいリソースを使用(標準)」をクリックします。
「テンプレートファイルのアップロード」で「クラウド設定データ」ファイル (a6e-gw-container-cloudsetting-[VERSION].zip) AWS フォルダ内の a6e_aws_cfn_template.yml を選択し、「次へ」をクリックします。
スタック名を入力します。また、 「Armadillo-IoT ゲートウェイ A6E のシリアル番号を取得する」 で取得したシリアル番号をパラメータに指定し、「次へ」をクリックします。
-
そのまま「次へ」をクリックします。
チェックボックスを選択し、「スタックの作成」をクリックします。
作成したスタックのステータスが"CREATE_COMPLETE" になったら作成完了です。
10.1.3.5. 設定に必要となるパラメータを取得する「接続先の クラウド 情報の設定」 で設定するパラメータを取得します。
AWS IoT Core エンドポイント
IoT Core へ移動し、サイドバー下部にある設定をクリックします。
IoT Core エンドポイントが表示されます。
アカウント ID
AWS コンソール画面右上の ▼ をクリックします。
下記画像の丸で囲んだマークをクリックすると、コピーすることができます。
利用したい内容に合わせて、 コンフィグを設定します。
コンフィグ はコンテナ起動時の内容が適用されるため、一度コンテナを終了させます。 [armadillo ~]# podman stop a6e-gw-container
a6e-gw-container インターフェースの動作設定を行います。
設定ファイルは /var/app/rollback/volumes/gw_container/config/sensing_mgr.conf です。
全体動作設定
全体的な動作設定を行います。
設定ファイル中の以下の箇所が該当します。 [DEFAULT]
; cloud_config=true or false
cloud_config=false
; send_cloud=true or false
send_cloud=false
; cache=true or false
cache=false
; send_interval[sec]
send_interval=10
; data_send_oneshot=true or false
data_send_oneshot=false
; wait_container_stop[sec]
wait_container_stop=0 表10.1 [DEFAULT] 設定可能パラメータ 項目 | 概要 | 設定値 | 内容 |
---|
cloud_config | クラウドからの設定変更を許容するか | true | 許容する | (デフォルト)false | 無視する | send_cloud | クラウドにデータを送信するか | true | 送信する | (デフォルト)false | 送信しない | cache | キャッシュ実施可否 | true | キャッシュを実施する | (デフォルト)false | キャッシュを実施しない | send_interval | データ送信間隔[sec] | 1 | この値に従って、クラウドへデータを送信する | data_send_oneshot | データ取得後コンテナを終了させるか | true | 1回データを取得し、コンテナを終了します。コンテナ終了通知をトリガに間欠動作を行う( 「状態遷移トリガにコンテナ終了通知を利用する」 )場合は、この設定にする必要があります。 | (デフォルト)false | コンテナの実行を継続する (設定したインターバルでデータを取得する) | wait_container_stop | コンテナ終了までの待ち時間[sec] | 1 | data_send_oneshot が true の場合、クラウドへのデータ送信後、設定した時間 wait してからコンテナを終了する |
ログ出力
取得したデータのログを ログファイルに保存したり、コンソールに出力することが可能です。
設定ファイル中の以下の箇所が該当します。 [LOG]
file=true
stream=true 表10.2 [LOG] 設定可能パラメータ 項目 | 概要 | 設定値 | 内容 |
---|
FILE_LOG | ログファイルに出力するか | (デフォルト)true | 出力する | false | 出力しない | STREAM_LOG | コンソールに出力するか | (デフォルト)true | 出力する | false | 出力しない |
CPU_temp
CPU 温度読み出しに関する設定を行います。
設定ファイル中の以下の箇所が該当します。 [CPU_temp]
; polling_interval[sec]
polling_interval=1
send_cloud=true 表10.3 [CPU_temp] 設定可能パラメータ 項目 | 概要 | 設定値 | 内容 |
---|
polling_interval | データ取得間隔[sec] | 1~3600 | この値に従って、CPU 温度を読み出します | send_cloud | クラウドデータ送信可否 | (デフォルト)true | 送信する | false | 送信しない |
接点入力
接点入力に関する設定を行います。
設定ファイル中の以下の箇所が該当します。 [DI1]
; type=polling or edge
type=
; interval[sec]
interval=
; edge_type=falling or rising or both
edge_type=
[DI2]
; type=polling or edge
type=
; interval[sec]
interval=
; edge_type=falling or rising or both
edge_type= 表10.4 [DI1,DI2] 設定可能パラメータ 項目 | 概要 | 設定値 | 内容 |
---|
type | 動作種別 | (空欄) | 接点入力状態取得を行わない | polling | ポーリング | edge | エッジ検出 | interval | データ取得間隔[sec] | 1~3600 | この値に従って、値を読み出します | edge_type | エッジ検出設定 | falling | 立ち下がりエッジ | rising | 立ち上がりエッジ | both | 両方 |
接点出力
接点出力に関する設定を行います。
設定ファイル中の以下の箇所が該当します。
表10.1「[DEFAULT] 設定可能パラメータ」 において、クラウドと通信しない場合は
ゲートウェイコンテナ起動後に設定した内容を出力します。クラウドと通信する場合は、「クラウドからのデバイス制御」 がトリガとなり、出力を開始します。 [DO1]
; output_state=high or low
output_state=
; output_time[sec]
output_time=
; output_delay_time[sec]
output_delay_time=
[DO2]
; output_state=high or low
output_state=
; output_time[sec]
output_time=
; output_delay_time[sec]
output_delay_time= 表10.5 [DO1,DI2] 設定可能パラメータ 項目 | 概要 | 設定値 | 内容 |
---|
output_state | 出力状態 | high | High | low | Low | output_time | 出力時間[sec] | 1~3600 | 出力コマンド実行後に output_state で指定したレベルを出力する時間。 0 を指定すると永続的に出力します。 | output_delay_time | 出力遅延時間[sec] | 0 | 出力コマンド実行後、指定した時間遅延して出力します。 |
RS485
RS485 に関する設定を行います。
設定ファイル中の以下の箇所が該当します。
なお、RS485_Data1 から RS485_Data4 まで、4個のデータについて設定することができます。
デフォルトでは RS485_Data1 のみファイルに記載されているため、RS485_Data2, RS485_Data3, RS485_Data4 については適宜コピーして記載してください。 [RS485_Data1]
;[RS485_Data1] ~ [RS485_Data4]
method=none
baudrate=
data_size=
; parity=none or odd or even
parity=
; stop=1 or 2
stop=
device_id=
func_code=
register_addr=
register_count=
; endian=little or big
endian=
; interval[sec]
interval=
; data_offset is option
data_offset=
; data_multiply is option
data_multiply=
; data_devider is option
data_devider= 表10.6 [RS485_Data1, RS485_Data2, RS485_Data3, RS485_Data4] 設定可能パラメータ 項目 | 概要 | 設定値 | 内容 |
---|
method | 通信種別 | none | RS485を利用しない | 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_devider | 読み出し値と除算する値 | 任意の値(整数値) | 指定は任意です。読み出したレジスタ値と除算する値を指定します |
10.1.4.2. 接続先の クラウド 情報の設定クラウド と連携する場合、接続先の クラウド の情報を入力する必要があります。
設定ファイルは /var/app/rollback/volumes/gw_container/config/cloud_agent.conf です。
接続先の クラウドサービス 種別
ゲートウェイコンテナが接続するクラウドサービスの種別を指定します。
設定ファイル中の以下の箇所が該当します。 [CLOUD]
SERVICE = AWS 表10.7 [CLOUD] 設定可能パラメータ 項目 | 概要 | 設定値 | 内容 |
---|
SERVICE | 接続先クラウドサービスを指定 | AWS | AWS IoT Core に接続 |
ログ出力
クラウド との接続状態や送受信したデータのログを ログファイルに保存したり、コンソールに出力することが可能です。
設定ファイル中の以下の箇所が該当します。 [LOG]
FILE_LOG = true
STREAM_LOG = true 表10.8 [CLOUD] 設定可能パラメータ 項目 | 概要 | 設定値 | 内容 |
---|
FILE_LOG | ログファイルに出力するか | (デフォルト)true | 出力する | false | 出力しない | STREAM_LOG | コンソールに出力するか | (デフォルト)true | 出力する | false | 出力しない |
AWS
ここでは、 AWS に接続する場合の設定内容を記載します。
設定ファイル中の以下の箇所が該当します。 [AWS]
AWS_IOT_HOST =
AWS_IOT_REGION =
AWS_IOT_ACCOUNTID =
AWS_IOT_ENDPOINT =
AWS_IOT_CERT_FILE = /cert/device_cert.pem
AWS_IOT_POLICY_FILE = /config/aws_iot_policy.json
AWS_IOT_SHADOW_ENDPOINT =
AWS_IOT_CA_FILE = /cert/AmazonRootCA1.pem
AWS_IOT_PKCS11_PATH = /usr/lib/plug-and-trust/libsss_pkcs11.so
AWS_IOT_KEY_LABEL = sss:100100F0
AWS_ACCESS_KEY =
AWS_SECRET_KEY =
AWS_IOT_PORT = 443
AWS_IOT_PIN =
設定ファイルの修正が完了したら、コンテナを起動します。
コンテナが起動すると、設定に従ってコンテナ内のアプリケーションが実行される仕組みとなっています。 [armadillo ~]# podman_start a6e-gw-container
Starting 'a6e-gw-container'
a3b719c355de677f733fa8208686c29424be24e57662d3972bc4131ab7d145ad 表10.1「[DEFAULT] 設定可能パラメータ」 でクラウドにデータを送信する設定を行った場合は、クラウド接続後、アプリケーションLEDの状態が点滅から点灯に変化します。 Armadillo からクラウドに送信されるデータは以下の通りです。
デバイス情報
表10.10 デバイス情報データ一覧 項目 | 概要 |
---|
DevInfo_SerialNumber | シリアル番号 | DevInfo_LAN_MAC_Addr | LAN MAC アドレス | DevInfo_ABOS_Ver | Armadillo Base OS バージョン | DevInfo_Container_Ver | コンテナイメージバージョン |
接点入力
表10.11 接点入力データ一覧 項目 | 概要 |
---|
DI1_polling | DI1 のポーリング結果 | DI2_polling | DI2 のポーリング結果 | DI1_edge | DI1 のエッジ検出結果 | DI2_edge | DI2 のエッジ検出結果 |
接点出力
クラウドに送信するデータはありません。
RS485
表10.12 RS485データ一覧 項目 | 概要 |
---|
RS485_Data1 | RS485_Data1 の読み出し値 | RS485_Data2 | RS485_Data2 の読み出し値 | RS485_Data3 | RS485_Data3 の読み出し値 | RS485_Data4 | RS485_Data4 の読み出し値 |
ユーザースイッチ
クラウドにデータが届いているかどうかは、以下の方法で確認することができます。 各インターフェースの設定については、 「インターフェース設定」 に記載している通り Armadillo 上の設定ファイルで行いますが、クラウドから設定値を変更することも可能です。 なお、クラウドからデータ設定を行うためには、 表10.1「[DEFAULT] 設定可能パラメータ」 の cloud_config を true に設定する必要があります。 設定を変更できる項目は以下の通りです。 -
接点入力設定
-
接点出力設定
RS485 レジスタ読み出し
-
AWS
AWS IoT Core の Device Shadow を更新して設定を行います。
AWS IoT Core に移動し、「管理」→「すべてのデバイス」→「モノ」を選択します。
デバイスの名前は 「Armadillo-IoT ゲートウェイ A6E のシリアル番号を取得する」 で取得したシリアル番号で登録されています。
「Device Shadow」の「Classic Shadow」を選択します。
Device Shadow ドキュメントの「編集」を選択します。
入力画面が表示されるため、設定データを入力し「更新」をクリックします。
+
それぞれ、下記の通りのフォーマットとなっています。 以下について、クラウドからデバイスの動きを制御することができます。
接点出力制御
RS485 レジスタ書き込み
LED 点灯制御
-
アプリケーション LED の点灯 on/off 制御を行います
それぞれ、以下の手順で実行します。 -
AWS
AWS IoT Core の デバイスシャドウを更新し、制御を行います。
更新方法については 「クラウドからのデータ設定」 と同じです。
接点出力制御
シャドウのフォーマットは下記の通りです。 {
"state": {
"desired": {
"<制御ポート>_command": {
"action" : <start or stop>
}
}
}
} |
制御ポートは DO1, DO2 のいずれかを指定してください
|
表10.17 接点出力制御シャドウ設定値 項目 | 概要 | 設定値 | 内容 |
---|
action | 制御状態 | start | 出力開始 | stop | 出力停止 |
RS485 レジスタ書き込み
シャドウのフォーマットは下記の通りです。 {
"state": {
"desired": {
"RS485_command": {
"method" : <種別>,
"baudrate" : <ボーレート>,
"data_size": <データサイズ>,
"parity" : <パリティ>,
"stop" : <ストップビット>,
"device_id" : <デバイス ID>,
"func_code" : <ファンクションコード>,
"register_addr" : <レジスタアドレス>,
"write_byte": <書き込む値>
}
}
}
} 表10.18 RS485 レジスタ書き込みシャドウ設定値 項目 | 概要 | 設定値 | 内容 |
---|
method | 通信種別 | 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 | レジスタアドレス | 機器依存 | 値を読み出すレジスタのアドレスを指定 | write_byte | レジスタに書き込む値 | 1 | |
LED
シャドウのフォーマットは下記の通りです。 {
"state": {
"desired": {
"led_command": {
"state" : <ON or OFF>
}
}
}
} 表10.19 LED 点灯制御シャドウ設定値 項目 | 概要 | 設定値 | 内容 |
---|
state | 点灯状態 | on | 点灯 | off | 消灯 |
podman_start で起動したゲートウェイコンテナを終了させる場合は、以下のコマンドを実行してください。 [armadillo ~]# podman stop a6e-gw-container 「コンフィグ設定」 でログファイルにログを出力する設定にした場合、インターフェース部とクラウド部にわかれて、それぞれ以下のファイルに出力されます。
インターフェース部
-
/var/app/volumes/gw_container/log/sensing_mgr.log
クラウド部
-
/var/app/volumes/gw_container/log/cloud_agent.log
ログファイルは自動的にローテートされるように設定されています。
ローテートされると、各ファイルの末尾に番号が付与されます。
なお、ファイル数が10を超えた場合は古いファイルから削除されます。 ゲートウェイコンテナは下記の通り構成されています。
コンテナ内外関わらず、誤ってファイルを削除した場合はインストールディスクで初期化を行ってください。 -
起動スクリプト
コンテナ起動時、下記のスクリプトを実行します。
-
ゲートウェイコンテナアプリケーション
ゲートウェイコンテナアプリケーションは下記に配置されています。
-
/usr/lib/python3.10/site-packages/atgateway/
-
ボリュームマウント
以下のパスをコンテナ内でマウントしています。
ゲートウェイコンテナのアプリケーションは Python で記述されており、起動スクリプトから実行されます。 起動スクリプトから実行されるコードは /var/app/volumes/gw_container/src に配置されています。
デフォルトでは /var/app/volumes/gw_container/src/default/main.py からコンテナ内のゲートウェイコンテナアプリケーションを実行します。
/var/app/volumes/gw_container/src/customize/ に main.py を配置すると、自動的にそちらが実行されるようになります。
ゲートウェイコンテナアプリケーションのソースコードは以下にアップロードしているため、適宜参照してご利用ください。 10.3. アプリケーションコンテナを作成、実行する10.3.1. Podman - コンテナ仮想化ソフトウェア10.3.1.1. Podman - コンテナ仮想化ソフトウェアとはコンテナとはホスト OS 上に展開される仮想的なユーザ空間のことです。
コンテナを使用することで複数の Armadillo-IoT ゲートウェイ A6E でも同一の環境がすぐに再現できます。
ゲスト OS を必要としない仮想化であるため、アプリケーションの起動が素早いという特徴があります。 Podman とはこのようなコンテナを管理するためのソフトウェアであり、使用方法は
コンテナ管理ソフトウェアの 1 つである Docker と互換性があります。 この章では、コンテナ仮想化ソフトウェアの 1 つである Podman の基本的な使い方について説明します。
Armadillo-IoT ゲートウェイ A6E で実行させたいアプリケーションとその実行環境自体を 1 つの Podman イメージとして扱うことで、
複数の Armadillo-IoT ゲートウェイ A6E がある場合でも、全てのボード上で同一の環境を再現させることが可能となります。 この章全体を通して、イメージの公開・共有サービスである Docker Hub から取得した、Alpine Linux のイメージを
使って説明します。 10.3.2.1. イメージからコンテナを作成するイメージからコンテナを作成するためには、podman_start コマンドを実行します。
podman や docker にすでに詳しいかたは podman run コマンドでも実行できますが、ここでは 「コンテナの運用」 で紹介するコンテナの自動起動の準備も重ねて podman_start を使います。
イメージは Docker Hub から自動的に取得されます。
ここでは、簡単な例として "ls /" コマンドを実行するコンテナを作成します。 |
コンテナのコンフィグを作成します。このファイルでは、コンテナのイメージやコマンド、デバイスへのアクセス権限を設定します。詳しい設定の説明には 「コンテナの自動起動」 を参照ください。
| |
コンテナのイメージを取得します。イメージが Armadillo に置いてない場合は「Error: docker.io/alpine: image not known」の様なエラーで失敗します。
| |
コンテナを起動します。これは Armadillo 起動時に自動的に起動されるコンテナと同じものになります。自動起動が不要な場合には set_autostart no で無効化できます。
| |
podman logs コマンドで出力を確認します。
"ls /" を実行するだけの "my_container" という名前のコンテナが作成されました。
コンテナが作成されると同時に "ls /" が実行され、その結果がログに残ります。
ここで表示されているのは、コンテナ内部の "/" ディレクトリのフォルダの一覧です。
|
| |
---|
podman_start でコンテナが正しく起動できない場合は podman_start -v <my_container> で podman run のコマンドを確認し、 podman logs <my_container> で出力を確認してください。
|
作成済みコンテナ一覧を表示するためには podman ps コマンドを実行します。 一覧表示により、コンテナ名やコンテナ ID を確認することができます。-a オプションを付けない場合は、動作中のコンテナのみ表示されます。
podman ps コマンドの詳細は --help オプションで確認できます。 作成済みのコンテナを起動するためには podman start コマンドを実行します。 -a オプションを与えると、コンテナ内で実行されたアプリケーションの出力を確認できます。 ここで起動している my_container は、起動時に "ls /" を実行するようになっているので、その結果が出力されます。
podman start コマンドの詳細は --help オプションで確認できます。 動作中のコンテナを停止するためには podman stop コマンドを実行します。 podman stop コマンドの詳細は --help オプションで確認できます。 コンテナに対して変更が行われた状態で、そのままコンテナを停止してしまうと変更が失なわれてしまいます。 変更を保存するには二つの方法があります。
podman commit コマンドで保存する。
podman commitで保存する度に、変更が行なわれた差分が保存されます。
繰り返し差分を保存すると、イメージサイズが大きくなってしまいます。
ストレージ容量が不足する場合は、ベースとなるOSのイメージから作り直してください。
ボリュームを使用する。
podman_start の add_volumes コマンドでコンテナに Armadillo Base OS のディレクトリをコンテナで使うことができます。
保存するデータの性質によって、保存先を選択してください。
. /var/app/volumes/myvolume : アップデートした場合はコピーされません。
ログやデータベースなど、アプリケーションが作成し続けるようなデータの保存に向いています。
. myvolume か /var/app/rollback/volumes/myvolume : アップデートの際にコピーしてアップデートを行うので、アップデート中でも安全に使いつづけます。
アプリケーションと一緒にアップデートするようなデータの保存に向いています。
| |
---|
コンテナを前のバージョンに戻した場合(ロールバック)、/var/app/rollback/volumes/ のデータの前のバージョンに戻ります。 その為、アプリケーションのバージョンに依存するようなデータは /var/app/rollback/volumes/ に入れることを推奨します。 mkswu の swdesc_files (--extra-os 無し)と podman_start` の add_volumes では、相対パスはそのディレクトリをベースにします。
/var/app/rollback/volumes/myvolume は myvolume で簡潔に指定できます。
|
| |
---|
Copy-on-Write (CoW) について。 この二つの volumes ディレクトリは btrfs と呼ばれるファイルシステムに保存されています。
btrfs ではデータは Copy on Write(CoW)を使ってデータ完全性を保証しますが、その保証にはコストがあります。 数百 MB のファイルに小さな変更を頻繁に行う場合 CoW を無効化することを推奨します。
CoW を無効化されたファイルにチェックサムが入らなくなりますので、極端な場合以外に残してください。
|
chattr +C でディレクトリに NoCow を設定します。これから作成されるファイルが NoCow で作成されます。すでに存在していたファイルに影響ないのでご注意ください。
| |
lsattr 確認します。リストの C の字があればファイルが「no cow」です。
|
|
10.3.2.6. コンテナの自動作成やアップデートpodman run, podman commitでコンテナを作成できますが、定期的にアップデートをする際には
コンテナの作成やアップデートを自動化できると便利です。 これを実現するために、Dockerfileとpodman buildを使います。この手順はArmadilloで実行可能です。
イメージを docker.io のイメージから作りなおします
イメージを前のバージョンからアップデートします
この場合、 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_container と swdesc_usb_container で使えます。 作成済みコンテナを削除する場合は podman rm コマンドを実行します。 podman ps コマンドの出力結果より、コンテナが削除されていることが確認できます。
podman rm コマンドの詳細は --help オプションで確認できます。 podmanのイメージを削除するには podman rmi コマンドを実行します。
イメージを削除するためには、そのイメージから作成したコンテナを先に削除しておく必要があります。
podman rmi コマンドにはイメージ ID を指定する必要があるため、podman images コマンドで確認します。 podman images コマンドの出力結果より、コンテナが削除されていることが確認できます。
podman rmi コマンドの詳細は --help オプションで確認できます。 | |
---|
SWU で転送されたイメージは podman images で Read-Only として表示されますので、
podman rmi を実行するとエラーとなります。
その場合は abos-ctrl podman-rw rmi をご使用ください。 abos-ctrl podman-rw については 「イメージを eMMC に保存する方法」 を参照してください。
|
実行中のコンテナに接続し、コンテナ内で指定したコマンドを実行するには podman exec コマンドを実行します。
podman exec コマンドでコンテナ内部のシェルを起動すると、コンテナ内部を操作できるようになります。ここでは、sleep infinity コマンドを
実行して待ち続けるだけのコンテナを作成し、そのコンテナに対して podman exec コマンドでシェルを起動する例を示します。 podman_start コマンドでコンテナを作成し、その後作成したコンテナ内で sh を実行しています。
sh を実行すると、コンテナ内のプロンプトが表示されコンテナ内部を操作できるようになります。
上記ではコンテナ内で、ps コマンドを実行しています。コンテナ作成時に実行した sleep と podman exec で実行した
sh がプロセスとして存在していることが確認できます。
コンテナ内のシェルから抜ける時は exit コマンドを実行します。 podman exec コマンドから抜けても、コンテナがまだ実行中です。コンテナを停止したい場合は podman stop sleep_container か podman kill sleep_container で停止して podman rm sleep_container でそのコンテナを削除してください。
podman exec コマンドの詳細は --help オプションで確認できます。
複数のコンテナを実行している環境で、それらのコンテナ間で通信を行う方法を示します。
これにより、例えば SQL サーバを実行しているコンテナに対し別のコンテナから接続するといった
使い方ができます。 コンテナには作成した時点でローカル IP アドレスが割り当てられるので、コンテナの名前かその IP アドレスで通信を行うことができます。 準備として、2 つのコンテナを作成します。 コンテナに割り当てられた IP アドレスを確認するには podman inspect コマンドを実行します。 これらの IP アドレスを使って、一方のコンテナからもう一方のコンテナへ対し ping コマンドで疎通確認を行うことができます。 このように、my_container_1(10.88.0.108) から my_container_2(10.88.0.109) への通信が確認できます。 10.3.2.11. 開発時に有用な—privilegedオプションコンテナに、全権限と全てのデバイスへのアクセスを許可するオプション --privileged があります。このオプションを利用すると、コンテナに与えるべき最小の権限を洗い出す必要が無いため、開発時に有用です。 実運用の際、このオプションを利用することはセキュリティー上問題がある為、開発時にのみご利用ください。コンテナに必要な最低限の権限を与えることをおすすめします。 コンテナ内で動作するアプリケーションから GPIO を扱うためには、Podman のイメージからコンテナを作成する際にホスト OS 側の
デバイスファイル /dev/gpiochipN を渡す必要があります。以下は、/dev/gpiochip2 を渡して alpine イメージからコンテナを作成する例です。
/dev/gpiochipN を渡すと、GPION+1 を操作することができます。 コンテナ内に入ってコマンドで GPIO を操作する例を以下に示します。この例では GPIO3_IO21 を操作しています。 |
GPIO 番号 21 の値を取得します。
| |
取得した値を表示します。
| |
GPIO 番号 21 に 1(High) を設定します。
|
他にも、gpiodetect コマンドで認識している gpiochip をリスト表示できます。
以下の例では、コンテナを作成する際に渡した /dev/gpiochip2 が認識されていることが確認できます。 gpioinfo コマンドでは、指定した gpiochip の詳細な情報を表示することができます。 C 言語プログラムから操作する場合は、GPIO 操作ライブラリである libgpiod を使用することができます。 コンテナ内で動作するアプリケーションから I2C を扱うためには、Podman のイメージからコンテナを作成する際にホスト OS 側の
デバイスファイル /dev/i2c-N を渡す必要があります。以下は、/dev/i2c-1 を渡して alpine イメージからコンテナを作成する例です。 コンテナ内に入り、i2c-tools に含まれる i2cdetect コマンドを使ってスレーブアドレスを確認することができます。 10.3.2.14. シリアルインターフェースを扱うコンテナ内で動作するアプリケーションから RS-232C や RS-485 などのシリアル通信を行うためには、
Podman のイメージからコンテナを作成する際にホスト OS 側のデバイスファイル /dev/ttymxcN を渡す必要があります。
以下は、/dev/ttymxc0 を渡して alpine イメージからコンテナを作成する例です。 コンテナ内に入り、setserial コマンドを使って現在の設定を確認することができます。 コンテナ内で動作するアプリケーションから USB 接続のデバイスを扱うための方法について示します。 USB シリアルデバイスをコンテナ内から扱う場合には、Podman のイメージからコンテナを作成する際に
ホスト OS 側の /dev/ttyUSBN を渡す必要があります。
以下は、 /dev/ttyUSB0 を渡して alpine イメージからコンテナを作成する例です。 コンテナ内に入り、setserial コマンドを使って現在の設定を確認することができます。 USB カメラをコンテナ内から扱う場合には、Podman のイメージからコンテナを作成する際に
ホスト OS 側の /dev/videoN を渡す必要があります。
以下は、 /dev/video3 を渡して alpine イメージからコンテナを作成する例です。 GStreamer などのマルチメディアフレームワークと組み合わせることで、USB カメラからの映像のキャプチャが可能となります。 ここでは、USB メモリを扱う方法について 2 つの例を示します。 -
ホスト OS 側でマウントした USB メモリをコンテナから扱う
あらかじめホスト OS 側でマウントしてある USB メモリをコンテナから扱う場合には、Podman のイメージから
コンテナを作成する際にホスト OS 側で USB メモリをマウントしてるディレクトリを渡す必要があります。 上記の例では、USB メモリを /mnt にマウントしました。以下は、 /mnt を渡して alpine イメージからコンテナを作成する例です。 ホスト OS 側の /mnt ディレクトリをコンテナ内の /mnt にマウントしています。
これにより、コンテナ内からも /mnt ディレクトリを通して USB メモリを扱うことができます。 USB メモリをコンテナ内からマウントして扱う場合には、Podman のイメージからコンテナを作成する際に
ホスト OS 側の /dev ディレクトリを渡すと同時に、適切な権限も渡す必要があります。
以下は、 /dev を渡して alpine イメージからコンテナを作成する例です。権限として SYS_ADMIN と SYS_RAWIO も渡しています。 コンテナ内に入り、mount コマンドで USB メモリを /mnt にマウントし、保存されているデータを確認することができます。 通常、コンテナ内から USB デバイスを扱うためには、あらかじめ Armadillo-IoT ゲートウェイ A6E 本体に
USB デバイスを接続した状態で、コンテナを起動する必要があります。
コンテナ起動後に USB デバイスを接続して認識させるためには、/dev を volume としてコンテナ内にマウントする必要があります。
以下は、 volume として /dev を渡して alpine イメージからコンテナを作成する例です。イベントの通知のために --net=host も渡す必要があります。 コンテナ内から RTC を扱うためには、Podman のイメージからコンテナを作成する際にホスト OS 側の
デバイスファイル /dev/rtcN を渡すと同時に、RTC への時刻の設定を行うための権限も渡す必要があります。
以下は、/dev/rtc0 を渡して alpine イメージからコンテナを作成する例です。権限として SYS_TIME も渡しています。 コンテナ内に入り、hwclock コマンドで RTC の時刻表示と設定ができます。 |
RTC に設定されている現在時刻を表示します。
| |
システム時刻を 2021 年 4 月 1 日 9 時 0 分 0 秒に設定します。
| |
システム時刻を RTC に反映させます。
| |
RTC に設定されている時刻が変更されていることを確認します。
|
Armadillo-IoT ゲートウェイ A6E に接続したスピーカーなどの音声出力デバイスへコンテナ内から音声を出力するためには、
Podman のイメージからコンテナを作成する際にホスト OS 側のデバイスファイル /dev/snd を渡す必要があります。
以下は、/dev/snd を渡して debian イメージからコンテナを作成する例です。 コンテナ内に入り、alsa-utils などのソフトウェアで音声出力を行えます。 |
alsa-utils をインストールします。
| |
alsa-utils を起動します。
| |
指定したファイル名の音声ファイルを再生します。
|
aplay の引数にある、M は音声を出力したい CARD 番号、N はデバイス番号を表しています。
CARD 番号とデバイス番号は、aplay コマンドに -l オプションを与えることで確認できます。 10.3.2.18. ユーザースイッチのイベントを取得するArmadillo-IoT ゲートウェイ A6E にはユーザースイッチが実装されています。これらのスイッチのプッシュ/リリースイベントを取得するためには、
Podman のイメージからコンテナを作成する際にホスト OS 側の /dev/input ディレクトリを渡す必要があります。
以下は、/dev/input を渡して alpine イメージからコンテナを作成する例です。ここで渡された /dev/input ディレクトリは
コンテナ内の /dev/input にマウントされます。 コンテナ内に入り、evtest コマンドでイベントを確認できます。 |
SW1のボタン プッシュ イベントを検出したときの表示
| |
SW1のボタン リリース イベントを検出したときの表示
|
Armadillo-IoT ゲートウェイ A6E には LED が実装されています。これらの LED を扱うためには、
Podman のイメージからコンテナを作成する際にホスト OS 側の /sys ディレクトリを渡す必要があります。
以下は、/sys を渡して alpine イメージからコンテナを作成する例です。ここで渡された /sys ディレクトリは
コンテナ内の /sys にマウントされます。 コンテナ内に入り、brightness ファイルに値を書き込むことで LED の点灯/消灯を行うことができます。
0 を書き込むと消灯、0 以外の値 (1〜255) を書き込むと点灯します。 この章では、コンテナ内から近距離通信デバイスを扱う方法について示します。 10.3.3.1. Bluetooth デバイスを扱うコンテナ内から Bluetooth デバイスを扱うためには、Podman のイメージからコンテナを作成する際にホスト OS 側の
デバイスファイル /dev/ttymxcN を渡すと同時にネットワークとして host を、権限として NET_ADMIN を渡す必要があります。
/dev/ttymxcN は Bluetooth 通信で使用するように設定したシリアルデバイスを指定してください。
以下は、/dev/ttymxc0 を渡して alpine イメージからコンテナを作成する例です。 コンテナ内で必要なソフトウェアをインストールして、Bluetooth を起動します。
btattach コマンドの引数にはコンテナ作成時に渡した ttymxc を設定してください。 これにより、bluetoothctl で Bluetooth 機器のスキャンやペアリングなどが行えるようになります。
以下に、bluetoothctl コマンドで周辺機器をスキャンしてペアリングを行う例を示します。 |
コントローラを起動します。
| |
周辺機器をスキャンします。
| |
ペアリングしたい機器の MAC アドレスを指定してペアリングします。
| |
exit で bluetoothctl のプロンプトを終了します。
|
ここでは、Wi-SUN デバイスが UART で接続されている場合の例を示します。
この場合、コンテナ内で動作するアプリケーションから Wi-SUN デバイスで通信を行うためには、
Podman のイメージからコンテナを作成する際にホスト OS 側のデバイスファイル /dev/ttymxcN のうち、
Wi-SUN と対応するものを渡す必要があります。
以下は、/dev/ttymxc0 を渡して alpine イメージからコンテナを作成する例です。 コンテナ内から、/dev/ttymxc0 を使って Wi-SUN データの送受信ができるようになります。 10.3.3.3. EnOcean デバイスを扱うここでは、EnOcean デバイスが UART で接続されている場合の例を示します。
この場合、コンテナ内で動作するアプリケーションから EnOcean デバイスで通信を行うためには、
Podman のイメージからコンテナを作成する際にホスト OS 側のデバイスファイル /dev/ttymxcN のうち、
EnOcean と対応するものを渡す必要があります。
以下は、/dev/ttymxc0 を渡して alpine イメージからコンテナを作成する例です。 コンテナ内から、/dev/ttymxc0 を使って EnOcean データの送受信ができるようになります。 この章では、コンテナ内のネットワークを扱う方法について示します。 10.3.4.1. コンテナの IP アドレスを確認する基本的にコンテナの IP アドレスは Podman イメージからコンテナを作成したときに自動的に割り振られます。
コンテナに割り振られている IP アドレスはホスト OS 側からは podman inspect コマンドを用いて、以下のように確認することができます。 コンテナ内の ip コマンドを用いて確認することもできます。 10.3.4.2. コンテナに固定 IP アドレスを設定する | |
---|
podman はデフォルトで 10.88.0.0/16 を使います。 他に使用しているIPアドレスと被った場合等はコンテナに別のIPアドレスを設定してください。 |
コンテナに固定 IP アドレスを設定するためには、最初にユーザ定義のネットワークを作成する必要があります。
以下に 192.168.1.0/24 にユーザ定義のネットワークを作成する例を示します。 コンテナを作成する際に、上記で作成したネットワークと設定したい IP アドレスを渡すことで、
コンテナの IP アドレスを固定することができます。
以下の例では、IPアドレスを 192.168.1.10 に固定します。 コンテナの IP アドレスが、192.168.1.10 に設定されていることが確認できます。 この章では、コンテナ内で様々なサーバを構築する方法について示します。
この章で取り上げているサーバは alpine の apk コマンドでインストールすることが可能です。 ここでは、HTTP サーバとして Apache と lighttpd の 2 種類を使用する場合について説明します。 alpine イメージからコンテナを作成し、そのコンテナ内に Apache をインストールします。
コンテナ作成の際に、ホスト OS の 8080 番ポートをコンテナ内の 80 番ポートに転送する指定を行っています。 他の PC などの Web ブラウザから、ホスト OS の IP アドレスの 8080 番ポートに接続すると、
動作確認用ページが表示されます。
デフォルトでは、/var/www/localhost/htdocs ディレクトリにファイルを置くことで Web ブラウザから閲覧できます。
Apache の詳細な設定は、/etc/apache2 ディレクトリにある設定ファイルを編集することで変更可能です。 alpine イメージからコンテナを作成し、そのコンテナ内に lighttpd をインストールします。
コンテナ作成の際に、ホスト OS の 8080 番ポートをコンテナ内の 80 番ポートに転送する指定を行っています。 lighttpd はデフォルトでは動作確認用ページが用意されていないため、上記の手順では簡単なページを
/var/www/localhost/htdocs ディレクトリの下に配置しています。
他の PC などの Web ブラウザから、ホスト OS の IP アドレスの 8080 番ポートに接続すると表示されます。
lighttpd の詳細な設定は、/etc/lighttpd ディレクトリにある設定ファイルを編集することで変更可能です。 ここでは、FTP サーバとして vsftp を使用する場合について説明します。
alpine イメージからコンテナを作成し、そのコンテナ内に vsftpd をインストールします。
コンテナ作成の際に、FTP 通信で使用するポートについてホスト OS 側からコンテナ内のポートに転送する指定と、
コンテナ内の環境変数として PASV_ADDRESS にホスト OS 側の IP アドレスの指定を行っています。 コンテナ内にユーザアカウントを作成し、このユーザで ftp ログインできるようにします。 作成したユーザで ftp ログインできるように、vsftpd の設定ファイルを編集します。 編集した設定ファイルを指定して vftpd を起動することにより、ftp 接続可能となります。
ftp ログイン時のアカウントは前述の手順で作成したものを使用します。 ここでは、Samba サーバの構築方法について説明します。
alpine イメージからコンテナを作成し、そのコンテナ内に samba をインストールします。
コンテナ作成の際に、samba で使用するポートについてホスト OS 側からコンテナ内のポートに転送する指定を行っています。 コンテナ内にユーザアカウントを作成し、このユーザで samba にログインできるようにします。 samba を起動すると、前述の手順で作成したユーザアカウントで他の PC などからログインすることができます。 共有するディレクトリの指定などの詳細設定は /etc/samba/smb.conf ファイルを編集することで変更可能です。 ここでは、RDMS として sqlite を使用する場合について説明します。
alpine イメージからコンテナを作成し、そのコンテナ内に sqlite をインストールします。 コンテナ内に入り、sqlite3 コマンドを実行すると sqlite のプロンプトが表示され
データベースの操作ができるようになります。 この章では、コンテナ内で動作しているアプリケーションに何らかの異常が発生し停止してしまった際に、
ソフトウェアウォッチドックタイマーを使って、システムを再起動する方法について示します。 10.3.6.1. ソフトウェアウォッチドッグタイマーを扱うコンテナ内で動作するアプリケーションからソフトウェアウォッチドックタイマーを扱うためには、Podman のイメージからコンテナを作成する際にホスト OS 側の
デバイスファイル /dev/watchdogN を渡す必要があります。以下は、/dev/watchdog0 を渡して alpine イメージからコンテナを作成する例です。 ソフトウェアウォッチドックタイマーは、プログラム内からデバイスファイル /dev/watchdog0 を open した時点で起動します。
コンテナ内に入ってソフトウェアウォッチドックタイマーを echo コマンドで起動する例を以下に示します。 ソフトウェアウォッチドックタイマーを起動した後、/dev/watchdog0 に任意の文字を書き込むことで
ソフトウェアウォッチドッグタイマーをリセットすることができます。
60 秒間任意の文字の書き込みがない場合は、システムが再起動します。 ソフトウェアウォッチドックタイマーを停止したい場合は、/dev/watchdog0 に V を書き込みます。 Armadillo Base OSでは、/etc/atmark/containers/*.confファイルに指定されているコンテナがブート時に自動的に起動します。
nginx.confの記載例を以下に示します。 .conf ファイルは以下のパラメータを設定できます。
コンテナイメージの選択: set_image [イメージ名]
イメージの名前を設定できます。 例: set_image docker.io/debian:latest , set_image localhost/myimage イメージをrootfsとして扱う場合に --rootfs オプションで指定できます。 例: set_image --rootfs /var/app/volumes/debian
ポート転送: 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の設定にしないと有効になりませんのでご注意ください。 |
デバイスファイル作成: 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/XXXXX" "/dev/video3" コンテナパスに「:」を含むようなパスは設定できません。
ボリュームマウント: add_volumes [ホストパス]:[コンテナパス]:[オプション]
指定するパスをコンテナ内でマウントして、データの保存や共有することができます。 ホストパスは以下のどちらかを指定してください。
/var/app/rollback/volumes/<folder> か <folder> :
アップデートの際に新しくコピー(snapshot)した場合、コピー先のみ変更しますので、
アップデート中でもこのデータを使うことができます。
途中で電源が落ちた場合でも、このデータに影響はありません。 SWUpdateでアップデートするデータに向いています。
/var/app/volumes/<folder> : appパーティションに書きます。
アップデートの際にコピーされませんので、アップデート中の新たな変更は
更新されたコンテナ内のアプリケーションで見れます。 ログやデータベースに向いています。 -
/tmp/<folder> : 複数のコンテナでメモリファイルシステムを共有したい場合に使ってください。
-
/opt/firmware : 学習能力に必要なファムウェアライブラリーのパス。
コンテナパスを設定しない場合はホストパスと同じパスを使います。 オプションは podman run の --volume のオプションになりますので、 ro (read-only), nodev , nosuid , noexec , shared , slave 等を設定できます。 例:add_volumes /var/app/volumes/database:/database : ロールバックされないデータを/databaseで保存します。 例: add_volumes assets:/assets:ro,nodev,nosuid /opt/firmware : アプリケーションのデータを/assetsで読み取り、/opt/firmwareのファームウェアを使えます。 「:」はホスト側のパスとコンテナのパスを別ける意味があるため、ファイル名やデバイス名に「:」を使うことはできません。 | |
---|
複数のコンテナでマウントコマンドを実行することがあれば、shared のフラグで起動後のマウントを共有することができます。
|
マウントを行うコンテナに shared の設定とマウント権限 (SYS_ADMIN ) を与えます。
| |
マウントを使うコンテナに slave だけを設定すれば一方にしか共有されません。
| |
USB デバイスをマウントします。
| |
マウントされたことを確認します。
|
|
pod の選択: set_pod [ポッド名]
「podの作成」で作成した pod の名前を入れてコンテナを pod 内で起動します。 例: set_pod mypod
ネットワークの選択: set_network [ネットワーク名]
この設定に「networkの作成」で作成したネットワーク以外に none と host の特殊な設定も選べます。 none の場合、コンテナに localhost しかないネームスペースに入ります。
host の場合はOSのネームスペースをそのまま使います。
例: set_network mynetwork
IP アドレスの設定: set_ip [アドレス]
コンテナの IP アドレスを設定することができます。 例: set_ip 10.88.0.100 | |
---|
コンテナ間の接続が目的であれば、podを使ってlocalhostかpodの名前でアクセスすることができます。 |
読み取り専用設定: set_readonly yes
コンテナ内からのファイルシステムへの書き込み許可を設定します。 デフォルトで書き込み可能となっています。 コンテナ内からのファイルシステムへの書き込みを禁止することで、
tmpfs として使うメモリの消費を明示的に抑えることができますが、
アプリケーションによっては読み込み専用のファイルシステムでは動作しない可能性もあります。
イメージの自動ダウンロード設定: set_pull [設定]
この設定を missing にすると、イメージが見つからない場合にイメージを自動的にダウンロードします。 always にすると、イメージがすでにダウンロード済みでも起動前に必ず更新の確認を取ります。
デフォルトでは never で、イメージが見つからない場合にエラーを表示します。 例:set_pull missing か set_pull always
コンテナのリスタート設定: set_restart [設定]
コンテナが停止した時にリスタートさせます。 podman kill か podman stop で停止する場合、この設定と関係なくリスタートしません。
デフォルトで on-failure になっています。 例: set_restart always か set_restart no
自動起動の無効化: set_autostart no
手動かまたは別の手段で操作するコンテナがある場合、Armadillo の起動時に自動起動しないようにします。 その場合、 podman_start <name> で起動させることができます。 | |
---|
コンフィグに記載していないイメージはアップデートの際に削除されますので、そういったイメージに対して設定してください。 |
実行コマンドの設定: set_command [コマンド]
コンテナを起動するときのコマンド。設定されなかった場合、コンテナイメージのデフォルトを使います。 例: set_command /bin/sh -c "echo bad example"
podman run に引数を渡す設定: add_args [引数]
ここまでで説明した設定項目以外の設定を行いたい場合は、この設定で podman run に直接引数を渡すことができます。 例:add_args --cap-add=SYS_TTY_CONFIG --env=XDG_RUNTIME_DIR=/run/xdg_home
podman_start で pod 機能を使うことができます。
pod を使うことで、複数のコンテナが同じネットワークネームスペースを共有することができます。
同じ pod の中のコンテナが IP の場合 localhost で、 unix socket の場合 abstract path で相互に接続することができます。
コンテナと同じく、 /etc/atmark/containers/[NAME].conf ファイルを作って、 set_type pod を設定することで pod を作成します。 pod を使う時にコンテナの設定ファイルに set_pod [NAME] の設定を追加します。 ネットワークネームスペースは pod を作成するときに必要なため、 ports , network と ip の設定は pod
のコンフィグファイルに入れなければなりません。 ネットワーク設定の他に、 infra_image のオプションで pod のイメージも固める事ができます。
この設定は set_type network の後しか使えませんので、set_type はファイルの最初のところに使ってください 必要であれば、他の podman pod create のオプションを add_args で設定することができます。 | |
---|
pod を使う時に podman が特殊な「infra container」も起動します(例の場合、 k8s.gcr.io/pause:3.5 を起動させました) コンフィグレーションに pod を入れるアップデートの際に自動的に podman pull でイメージをダウンロードしますが、
インターネットを使わせたくないアップデートがあれば swdesc_embed_container か swdesc_usb_container で入れてください。
その場合、 infra_image の設定も使ってください。 |
podman_start で podman の network も作成ことができます。
デフォルトの 10.88.0.0/16 が使えない場合、あるいはコンテナ同士で接続できないようにしたい場合は使ってください。 コンテナと同じく、 /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 で設定することができます。 podman では REST API による管理アクセスも可能です。 自分のコンテナから他のコンテナの管理が必要な場合に、ホストの podman サービスを有効にして、
コンテナに /run/podman をボリュームマウントすれば podman --remote で管理できます。 podman_start をインストールすればそちらも --remote で使えます。
このオプションは Armadillo のホスト側の udev rules からコンテナを扱う時にも必要です。 コンテナのイメージを配布する方法は大きく分けて二つあります: -
インターネット上のリポジトリ(dockerhub等)で登録してそこから配布する
-
SWUpdateのアップデートイメージを配布する
| |
---|
Podmanのイメージをインストールする時に、一時データを大量に保存する必要があります。 swuイメージ内で組み込む時は3倍、pullやUSBドライブで分けてインストールすると転送するデータ量の2倍の空き容量がappパーティションに必要です。 アップデート時にアップデート前のコンテナが使われているのでご注意ください。 |
10.4.5.1. リモートリポジトリにコンテナを送信する方法
イメージをリモートリポジトリに送信する:
[armadillo ~]$ podman image push <localimage> docker://<registry>/<remoteimage>:<tag>
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 を作成しました。
10.4.5.2. イメージを eMMC に保存する方法Armadillo Base OS のデフォルトでは、Podman のデータは tmpfs に保存されます。 起動時にイメージを起動するにはイメージを eMMC に書き込む必要があります。
想定の使い方では、以下の 「イメージを SWUpdate で転送する方法」 でコンテナのイメージを送信する場合には、 /var/lib/containers/storage_readonly の app パーティションのサブボリュームに展開します。 開発の時に、abos-ctrl podman-storage --disk を設定すると別の /var/log/containers/storage が作成されますが、SWUpdate で転送するイメージはそのまま readonly の方に書き込みます。 abos-ctrl podman-rw を使えば、read-only になっているイメージを扱う事ができます。
abos-ctrl podman-storage はメモリとディスクの切り替えの他に、読み書きストレージから読み取り専用ストレージへのコピーもできます。
|
イメージを書き込み可能ストレージに取得します。
| |
abos-ctrl podman-storage をオプション無しで実行します。
| |
書き込み可能ストレージにイメージがある場合に対応を聞かれます。今回はコピー(copy)します。
| |
abos-ctrl podman-storage にオプションを指定しなかったので、ストレージが tmpfs のままになります。すでに --disk で切り替えた場合にディスクのままでも可能です。
| |
コピーの確認します。イメージが読み取り専用(R/O, Read only)になりました。
|
| |
---|
SWUpdate でアップデートをインストールする際には、/var/lib/containers/storage_readonly ディレクトリの不要になったイメージを自動的に削除します。 自動起動させる予定がなくても、 「コンテナの自動起動」 を参考にして、 /etc/atmark/containers/*.conf を使ってください。 set_autostart no を設定することで自動実行されません。 |
10.4.5.3. イメージを SWUpdate で転送する方法
イメージをファイルに保存する:
[armadillo ~]$ podman image save -o <myimage>.tar <localimage>
ファイルをSWUpdateのイメージに入れる。
二つのやり方があります:
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 arm --variant v7 docker.io/nginx:alpine
[ATDE ~/mkswu]$ podman run --rm docker.io/nginx:alpine uname -m
armv7l
[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 を作成しました
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 arm --variant v7 docker.io/nginx:alpine
[ATDE ~/mkswu]$ podman run --rm docker.io/nginx:alpine uname -m
armv7l
[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 を作成しました。
10.5. Armadilloのソフトウェアをビルドするここでは、Armadillo-IoT ゲートウェイ A6E で使用するソフトウェアのビルド方法を説明します。 ここでは、ATDE 上で Armadillo-IoT ゲートウェイ A6E 向けのブートローダーイメージをビルドする方法を説明します。 ここでは、Armadillo-IoT ゲートウェイ A6E 向けのLinuxカーネルイメージをビルドする方法を説明します。 | |
---|
Armadillo-IoT ゲートウェイ A6Eでは、基本的にはLinuxカーネルイメージをビルドする必要はありません。
「Alpine Linux ルートファイルシステムをビルドする」の手順を実施することで、標準のLinuxカーネルイメージがルートファイルシステムに組み込まれます。 標準のLinuxカーネルイメージは、アットマークテクノが提供する linux-at というAlpine Linux用のパッケージに含まれています。 カスタマイズしたLinuxカーネルイメージを利用するには、 「Alpine Linux ルートファイルシステムをビルドする」の手順の中で、
a6e/packages から linux-at を削除し、 a6e/resources/boot/ にイメージを配置する必要があります。 |
デフォルトコンフィギュレーションの適用
図10.93「Linux カーネルデフォルトコンフィギュレーションの適用」に示すコマンドを実行します。
Linux カーネルコンフィギュレーションの変更
コンフィギュレーションの変更を行わない場合はこの手順は不要です。
変更する際は、図10.94「Linux カーネルコンフィギュレーションの変更」に示すコマンドを実行します。
コマンドを実行するとカーネルコンフィギュレーション設定画面が表示されます。
カーネルコンフィギュレーションを変更後、"Exit"を選択して「Do you wish to save your new kernel configuration? (Press <ESC><ESC> to continue kernel configuration.)」で "Yes" を選択し、 カーネルコンフィギュレーションを確定します。
| |
---|
Linux Kernel Configuration メニューで"/"キーを押下すると、カーネルコンフィギュレーションの検索を行うことができます。
カーネルコンフィギュレーションのシンボル名(の一部)を入力して"Ok"を選択すると、部分一致するシンボル名を持つカーネルコンフィギュレーションの情報が一覧されます。 |
ビルド
Linux カーネルをビルドするには、図10.96「Linux カーネルコンフィギュレーションの変更」に示すコマンドを実行します。
ビルド結果の確認
ビルドが正常終了すると、図10.97「Linux カーネルビルドしたファイルの確認」に示すイメージファイルが生成されます。
10.5.3. Alpine Linux ルートファイルシステムをビルドするここでは、build-rootfs を使って、 Alpine Linux ルートファイルシステムを構築する方法を説明します。 build-rootfs は、ATDE 上で Armadillo-IoT ゲートウェイ A6E 用の Alpine Linux ルートファイルシステムを構築することができるツールです。 10.5.3.1. デフォルトの Alpine Linux ルートファイルシステムを構築する
ルートファイルシステムのビルドに必要な Podman のインストール
次のコマンドを実行します。 [ATDE ~]$ sudo apt install podman btrfs-progs xxhash
build-rootfs の入手
Armadillo-IoT ゲートウェイ A6E 開発用ツール から 「Alpine Linuxルートファイルシステムビルドツール」 ファイル (build-rootfs-[VERSION].tar.gz) を次のようにダウンロードします。 [PC ~/]$ wget https://download.atmark-techno.com/armadillo-iot-a6e/tool/build-rootfs-latest.tar.gz
[PC ~/]$ tar xf build-rootfs-[VERSION].tar.gz
[PC ~/]$ cd build-rootfs-[VERSION]
ビルド
次のコマンドを実行します。 パッケージをインターネット上から取得するため回線速度に依存しますが、ビルドには数分かかります。 [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. | |
---|
ビルド時のログにエラー
"ERROR: No such package: .make-alpine-make-rootfs"
が出ていますが、正常時でも出力されるメッセージのため、
問題はありません。 |
| |
---|
リリース時にバージョンに日付を含めたくないときは --release を引数に追加してください。 |
| |
---|
任意のパス、ファイル名で結果を出力することもできます。 [ATDE ~/build-rootfs-[VERSION]]$ ./build_rootfs.sh -b a6e ~/alpine.tar.gz
:
: (略)
:
[ATDE ~/build-rootfs-[VERSION]]$ ls ~/alpine.tar.gz
~/alpine.tar.gz |
ビルド結果の確認
次のコマンドを実行します。 [ATDE ~/build-rootfs-[VERSION]]$ ls *tar.zst
baseos-6e-[VERSION].tar.zst
10.5.3.2. Alpine Linux ルートファイルシステムをカスタマイズするalpine/build-rootfsディレクトリ直下にある
a6e ディレクトリ以下のファイルを変更し、
build_rootfs.shを実行することで、
ルートファイルシステムをカスタマイズすることができます。
install
-
resources/ ディレクトリ内のファイルを、
ルートファイルシステムにインストールするためのスクリプト
resources/
-
ルートファイルシステムにインストールするファイルを含んだディレクトリ
packages
-
ルートファイルシステムにインストールするパッケージのリスト
fixup
-
パッケージのインストールや上記installスクリプトの後に実行されるスクリプト
-
ファイル/ディレクトリを追加する
a6e/resources/ 以下に配置したファイルやディレクトリは、
そのままルートファイルシステムの直下にコピーされます。
デフォルトでは、
UIDとGIDは共にroot、パーミッションは 0744(ディレクトリの場合は 0755)
となります。 a6e/install を修正することで、
ファイルのUID、GID、パーミッションを変更することができます。
UID、GIDを変更する場合はchown、
パーミッションを変更する場合はchmodを利用してください。 a6e/packages を変更することで、
ルートファイルシステムにインストールするパッケージをカスタマイズすることができます。 パッケージ名は1行に1つ書くことができます。
パッケージ名はArmadillo上で"apk add"
の引数に与えることのできる正しい名前で記載してください。
誤ったパッケージ名を指定した場合は、
ルートファイルシステムのビルドに失敗します。 | |
---|
利用可能なパッケージは以下のページで検索することができます。 Alpine Linuxルートファイルシステム使用した Armadilloで検索することもできます。 [armadillo ~]# apk list *ruby*
ruby-rmagick-4.1.2-r1 armhf {ruby-rmagick} (MIT)
ruby-concurrent-ruby-ext-1.1.6-r1 armhf {ruby-concurrent-ruby} (MIT)
ruby-net-telnet-2.7.2-r3 armhf {ruby} (Ruby AND BSD-2-Clause AND MIT)
:
: (省略)
:
ruby-mustache-1.1.1-r3 armhf {ruby-mustache} (MIT)
ruby-nokogiri-1.10.10-r0 armhf {ruby-nokogiri} (MIT) |
本章では、microSD カードから直接起動(以降「SDブート」と表記します)する手順を示します。
SD ブートを活用すると、microSD カードを取り替えることでシステムイメージを変更することができます。
本章に示す手順を実行するためには、容量が 8Gbyte 以上の microSD カードを必要とします。 | |
---|
SD ブートを行った場合、ブートローダーの設定は microSDカード に保存されます。 |
[ATDE ~/build-rootfs-[VERSION]]$ sudo ./build_image.sh --board a6e \
--boot ~/imx-boot-[VERSION]/u-boot-dtb.imx
: (省略)
[ATDE ~/build-rootfs-[VERSION]]$ ls baseos-6e*img
baseos-6e-[VERSION].img -
ATDE に microSD カードを接続します。詳しくは 「取り外し可能デバイスの使用」 を参考にしてください。
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
: (省略)
microSD カードがマウントされている場合、アンマウントします。
ブートディスクイメージの書き込み
[ATDE ~]$ sudo dd if=~/build-rootfs-[VERSION]/baseos-6e-[VERSION].img \
of=/dev/sdb bs=1M oflag=direct status=progress microSDカードの性能にもよりますが、書き込みには5分程度かかります。
| |
---|
microSDカードのパーティション構成は次のようになっています。 表10.20 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 |
「ブートディスクの作成」で作成したブートディスクから起動する方法を説明します。 -
Armadillo-IoT ゲートウェイ A6Eに電源を投入する前に、ブートディスクをCON1(SD インターフェース)に挿入します。
また、SW2 を 起動デバイスは microSD 側設定します。SW2 に関しては、図14.16「スイッチの状態と起動デバイス」 を参照ください。
電源を投入します。
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:
10.7. Armadilloのソフトウェアの初期化microSD カードを使用し、Armadillo Base OS の初期化を行えます。 | |
---|
初期化を行っても、ファームウェアパーティション(mmcblk2p4)は変更されません。 |
インストールディスクは二つの種類があります: 10.7.1.1. 初期化インストールディスクの作成-
512 MB 以上の microSD カードを用意してください。
標準のインストールディスクイメージを使用する場合は、
Armadillo-IoT ゲートウェイ A6E インストールディスクイメージ から
「Armadillo Base OS」をダウンロードしてください。
「Armadilloのソフトウェアをビルドする」 でビルドしたイメージを使用してインストールディスクを作成したい場合は、
以下のコマンドを実行して、インストールディスクイメージを作成してください。 [ATDE ~/build-rootfs-[VERSION]]$ sudo ./build_image.sh --board a6e
: (省略)
[ATDE ~/build-rootfs-[VERSION]]$ ls baseos-6e*img
baseos-6e-[VERSION].img
[ATDE ~/build-rootfs-[VERSION]]$ sudo ./build_image.sh --board a6e \
--boot ~/imx-boot-[VERSION]/u-boot-dtb.imx \
--installer ./baseos-6e-[VERSION].img コマンドの実行が完了すると、baseos-x2-[VERSION]-installer.img というファイルが作成されていますので、
こちらを使用してください。 -
ATDE に microSD カードを接続します。詳しくは「取り外し可能デバイスの使用」を参考にしてください。
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
: (省略)
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
ダウンロードしたファイルを展開し、imgファイルをmicroSDカードに書き込んでください。
Linux PCの場合、以下のようにmicroSDカードに書き込むことができます。 [ATDE ~]$ unzip baseos-x2-installer-[VERSION].zip
[ATDE ~]$ sudo dd if=baseos-x2-installer-[VERSION].img \
of=/dev/sdb bs=1M oflag=direct status=progress また、Windowsの場合、エクスプローラー等でZipファイルからimgファイルを取り出し、「Win32 Disk Imager」などを使用してmicroSDカードに書き込むことができます。
10.7.1.2. 開発が完了した Armadillo をクローンするインストールディスクの作成-
microSD カードを用意してください。
-
初期化インストールディスクをベースとしますので、「初期化インストールディスクの作成」 でビルドしたSDカードを使用できますが、用意されていなければ次のステップで自動的にダウンロードされます。
abos-ctrl make-installer を実行してください
[armadillo ~]# abos-ctrl make-installer
It looks like your SD card does not contain an installer image
Download base SD card image from https://armadillo.atmark-techno.com (~200MB) ? [y/N]
WARNING: it will overwrite your sd card!!
y
Downloading installer image
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 167M 100 167M 0 0 104M 0 0:00:01 0:00:01 --:--:-- 104M
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 70 100 70 0 0 1441 0 --:--:-- --:--:-- --:--:-- 1458
Writing baseos-x2-installer-3.15.4-at.6.img to SD card (442M)
439353344 bytes (439 MB, 419 MiB) copied, 134 s, 3.3 MB/s
421+0 records in
421+0 records out
441450496 bytes (441 MB, 421 MiB) copied, 134.685 s, 3.3 MB/s
Verifying written image is correct
436207616 bytes (436 MB, 416 MiB) copied, 46 s, 9.5 MB/s
421+0 records in
421+0 records out
441450496 bytes (441 MB, 421 MiB) copied, 46.8462 s, 9.4 MB/s
Checking and growing installer main partition
GPT data structures destroyed! You may now partition the disk using fdisk or
other utilities.
Setting name!
partNum is 0
The operation has completed successfully.
e2fsck 1.46.4 (18-Aug-2021)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
rootfs_0: 2822/102400 files (0.5% non-contiguous), 352391/409600 blocks
(1/1) Installing e2fsprogs-extra (1.46.4-r0)
Executing busybox-1.34.1-r5.trigger
OK: 202 MiB in 197 packages
resize2fs 1.46.4 (18-Aug-2021)
Resizing the filesystem on /dev/mmcblk1p1 to 15547884 (1k) blocks.
The filesystem on /dev/mmcblk1p1 is now 15547884 (1k) blocks long.
Currently booted on /dev/mmcblk2p1
Copying boot image
Copying rootfs
301989888 bytes (302 MB, 288 MiB) copied, 10 s, 30.1 MB/s
300+0 records in
300+0 records out
314572800 bytes (315 MB, 300 MiB) copied, 10.3915 s, 30.3 MB/s
Copying /opt/firmware filesystem
Copying appfs
At subvol app/snapshots/volumes
At subvol app/snapshots/boot_volumes
At subvol app/snapshots/boot_containers_storage
Cleaning up and syncing changes to disk...
Installer updated successfully!
-
SW2(起動デバイス設定スイッチ)を ON にし、起動デバイスを microSD に設定します。
-
microSD カードを CON1 に挿入します。
-
電源を投入すると、1分程度でeMMCのソフトウェアの初期化が完了します。
-
完了すると電源が切れます(SYS(システムLED)が消灯、コンソールに
reboot: Power down が表示)。
-
電源を取り外し、続いて SW2 を OFF に設定し、microSD カードを外してください。
-
10秒以上待ってから再び電源を入れると、初回起動時と同じ状態になります。
10.8. ArmadilloのソフトウェアをアップデートするArmadillo-IoT ゲートウェイ A6Eでは、
開発・製造・運用それぞれに適した複数のソフトウェアアップデート方法を用意しています。
本章では、それぞれのソフトウェアアップデート方法について説明します。 ソフトウェアアップデートを実現するソフトウェアの概要や仕様、用語については
13章ソフトウェア仕様
を参照してください。 Armadillo Base OS ではソフトウェアアップデートのためにOS やコンテナ等を格納するためにSWUというイメージ形式を使います。 SWUイメージは swupdate (https://sbabic.github.io/swupdate/swupdate.html) によってArmadillo Base OS上で検証とインストールが実行されます。SWUイメージをArmadilloに転送するための方法は、用途や状況に合わせて様々な方法を用意しています。例えば、USBメモリから読み取る、ウェブサーバーからダウンロードする、hawkBitというWebアプリケーションを使うなどです。 SWUイメージの作成には、mkswu というツールを使います。 mkswu に含まれる mkswu を実行すると、アップデート対象やバージョン等の情報を記載した .desc ファイルに含まれる命令を順次実行してイメージを作り上げます。 詳しくは「mkswu の desc ファイル」を参考にしてください。
mkswu の取得
[ATDE ~]$ sudo apt update && sudo apt install mkswu インストール済みの場合は、以下のコマンドを実行し最新版への更新を行ってください。 [ATDE ~]$ sudo apt update && sudo apt upgrade | |
---|
git のバージョンからアップデートする場合、 mkswu --import で以前使っていたコンフィグをロードしてください。 [ATDE ~/swupdate-mkimage]$ mkswu --import
コンフィグファイルを更新しました:/home/atmark/swupdate-mkimage/mkswu.conf
/home/atmark/swupdate-mkimage/mkswu.conf のコンフィグファイルとその鍵を
/home/atmark/mkswu にコピーします。
mkdir: ディレクトリ '/home/atmark/mkswu' を作成しました
'/home/atmark/swupdate-mkimage/swupdate.key' -> '/home/atmark/mkswu/swupdate.key'
'/home/atmark/swupdate-mkimage/swupdate.pem' -> '/home/atmark/mkswu/swupdate.pem'
/home/atmark/swupdate-mkimage/mkswu.conf のコンフィグファイルを
/home/atmark/mkswu/mkswu.conf にコピーしました。
mkswu でイメージ作成を試してから前のディレクトリを消してください。 |
最初に行う設定
mkswu --init を実行して鍵や最初の書き込み用のイメージを生成します。
作成する鍵は、swuパッケージを署名するために使用します。
使用しているArmadilloに、過去に一度でもこの初回アップデート作業を行っている場合は二度同じ作業を行うことはできず、する必要もありません。
その際にArmadilloに配置した公開鍵に対応する秘密鍵でアップデートを行いますので、 「mkswu の desc ファイル」 を参考にしてそのままにお使い下さい。 [ATDE ~]$ mkswu --init
mkdir: ディレクトリ '/home/atmark/mkswu' を作成しました
コンフィグファイルを更新しました:/home/atmark/mkswu/mkswu.conf
証明書のCommon nameを入力してください: [COMMON_NAME]
証明書の鍵のパスワードを入力ください(4-1024文字)
証明書の鍵のパスワード(確認):
Generating an EC private key
writing new private key to '/home/atmark/mkswu/swupdate.key'
-----
アップデートイメージを暗号化しますか? (N/y)
アットマークテクノが作成したイメージをインストール可能にしますか? (Y/n)
rootパスワード:
rootパスワード(確認):
atmarkユーザのパスワード(空の場合はアカウントをロックします):
atmarkユーザのパスワード(確認):
BaseOSイメージのarmadillo.atmark-techno.comサーバーからの自動アップデートを行いますか? (y/N)
/home/atmark/mkswu/initial_setup.swu を作成しました。
"/home/atmark/mkswu/initial_setup.swu" をそのまま使うことができますが、
モジュールを追加してイメージを再構築する場合は次のコマンドで作成してください:
mkswu "/home/atmark/mkswu/initial_setup.desc" [他の.descファイル]
インストール後は、このディレクトリを削除しないように注意してください。
鍵を失うと新たなアップデートはデバイスの /etc/swupdate.pem
を修正しないとインストールできなくなります。
[ATDE ~]$ ls ~/mkswu
initial_setup.desc initial_setup.swu mkswu.conf
swupdate.aes-key swupdate.key swupdate.pem |
COMMON_NAME には証明鍵の「common name」として会社や製品が分かるような任意の名称を入力ください。
| |
証明鍵を保護するパスフレーズを2回入力します。
| |
swuイメージ自体を暗号化する場合に「y」を入力します。詳細は 「SWUpdate と暗号化について」 を参考にしてください。
| |
アットマークテクノのアップデートをインストールしない予定でしたら「n」を入力します。
| |
rootのパスワードを2回入力します。
| |
atmarkユーザーのパスワードも2回入力します。何も入力しない場合はユーザーをロックします。
| |
自動アップデートを無効のままで進みます。ここで「y」を入れると、定期的に
アットマークテクノのサーバーからアップデートの有無を確認し、自動にインストールします。
| |
作成したファイルを確認します。「swupdate.aes-key」は暗号化の場合のみに作成されます。
|
このイメージは初回インストール用の署名鍵を使って、作成した鍵とユーザーのパスワードを設定します。 インストール後にコンフィグの mkswu.conf と鍵の swupdate.* をなくさないようにしてください。 | |
---|
このイメージに他の変更も入れれます。他の /usr/share/mkswu/examples/ ディレクトリーにある.descファイルや「mkswu の desc ファイル」を参考にして、以下の例のように同じswuにいくつかの.descを組み込めます。 例えば、opensshを有効にします。 [ATDE ~/mkswu]$ cp -rv /usr/share/mkswu/examples/enable_sshd* .
: (省略)
'/usr/share/mkswu/examples/enable_sshd/root/.ssh/authorized_keys'
-> './enable_sshd/root/.ssh/authorized_keys'
'/usr/share/mkswu/examples/enable_sshd.desc' -> './enable_sshd.desc'
[ATDE ~/mkswu]$ cp ~/.ssh/id_rsa.pub \
enable_sshd/root/.ssh/authorized_keys
[ATDE ~/mkswu]$ mkswu initial_setup.desc enable_sshd.desc
enable_sshd.desc を組み込みました。
initial_setup.swu を作成しました。 |
イメージのインストール
「イメージのインストール」を参考に、作成したイメージをインストールしてください。
次回以降のアップデート
次回以降のアップデートは作成した証明鍵を使用してArmadillo-IoT ゲートウェイA6E のSWUイメージを作成します。 .desc ファイルの内容は /usr/share/mkswu/examples/ のディレクトリや「mkswu の desc ファイル」を参考にしてください。
イメージをインストールする方法として下記に示すような方法があります。
USBメモリまたはSDカードからの自動インストール
Armadillo-IoT ゲートウェイ A6EにUSBメモリを接続すると自動的にアップデートが始まります。
アップデート終了後にArmadillo-IoT ゲートウェイ A6Eは自動で再起動します。 USBメモリやSDカードをvfatもしくはext4形式でフォーマットし、作成した.swuのファイルをディレクトリを作らずに配置してください。 [ATDE ~/mkswu]$ df -h
Filesystem Size Used Avail Use% Mounted on
: (省略)
/dev/sda1 15G 5.6G 9.1G 39% /media/USBDRIVE
[ATDE ~/mkswu]$ cp initial_setup.swu /media/USBDRIVE/
[ATDE ~/mkswu]$ umount /media/USBDRIVE |
USBメモリのマウントされている場所を確認します。
| |
ファイルをコピーします。
| |
/media/USBDRIVEをアンマウントします。コマンド終了後にUSBメモリを取り外してください。
|
エラーの場合、/var/log/messageに保存されます。例えば、コンソールで証明の間違ったイメージのエラーを表示します: [armadillo ~]# tail /var/log/messages
Nov 19 10:48:42 user.notice swupdate-auto-update: Mounting sda0 on /mnt
Nov 19 10:48:42 user.notice swupdate-auto-update: Trying update /mnt/initial_setup.swu
Nov 19 10:48:42 user.info swupdate: START Software Update started !
Nov 19 10:48:42 user.err swupdate: FAILURE ERROR : Signature verification failed
Nov 19 10:48:42 user.err swupdate: FAILURE ERROR : Compatible SW not found
Nov 19 10:48:42 user.err swupdate: FATAL_FAILURE Image invalid or corrupted. Not installing ... |
証明が間違ったメッセージ。
|
外部記憶装置からイメージのインストール(手動)
USBメモリやmicroSDカード等の外部記憶装置のルートディレクトリ以外にswuイメージを保存して、イメージのインストールを行います。
ルートディレクトリに保存すると自動アップデートが行われますので、/var/log/messagesを確認してください。 以下は外部記憶装置が/dev/mmcblk1p1(microSDカード)として認識された場合に、イメージのインストールを行う例です。 [armadillo ~]# mount /dev/mmcblk1p1 /mnt
[armadillo ~]# swupdate -i /mnt/swu/initial_setup.swu
SWUpdate v5f2d8be-dirty
Licensed under GPLv2. See source distribution for detailed copyright notices.
[INFO ] : SWUPDATE running : [main] : Running on AGX4500 Revision at1
[INFO ] : SWUPDATE started : Software Update started !
[INFO ] : SWUPDATE running : [read_lines_notify] : No base os update: copying current os over
[INFO ] : SWUPDATE running : [read_lines_notify] : Removing unused containers
[INFO ] : SWUPDATE running : [read_lines_notify] : swupdate triggering reboot!
Killed
ウェブサーバーからイメージのインストール(手動)
swuイメージをウェブサーバーにアップロードして、イメージのインストールを行います。
以下は、http://server/initial_setup.swu のイメージをインストールする例です。
[armadillo ~]# swupdate -d '-u http://server/initial_setup.swu'
SWUpdate v5f2d8be-dirty
Licensed under GPLv2. See source distribution for detailed copyright notices.
[INFO ] : SWUPDATE running : [main] : Running on AGX4500 Revision at1
[INFO ] : SWUPDATE running : [channel_get_file] : Total download size is 25 kB.
[INFO ] : SWUPDATE started : Software Update started !
[INFO ] : SWUPDATE running : [read_lines_notify] : No base os update: copying current os over
[INFO ] : SWUPDATE running : [read_lines_notify] : Removing unused containers
[INFO ] : SWUPDATE running : [read_lines_notify] : swupdate triggering reboot!
Killed
ウェブサーバーからの定期的な自動インストール
swupdate-urlを有効にしたら、定期的にチェックしてインストールします。
以下はサービスの有効化とタイミングの設定の例です。 [armadillo ~]# rc-update add swupdate-url
[armadillo ~]# persist_file /etc/runlevels/default/swupdate-url
[armadillo ~]#
echo https://download.atmark-techno.com/armadillo-iot-a6e/image/baseos-x2-latest.swu \
> /etc/swupdate.watch
[armadillo ~]# echo 'schedule="0 tomorrow"' > /etc/conf.d/swupdate-url
[armadillo ~]# echo 'rdelay="21600"' >> /etc/conf.d/swupdate-url
[armadillo ~]# persist_file /etc/swupdate.watch /etc/conf.d/swupdate-url |
swupdate-urlサービスを有効します。
| |
サービスの有効化を保存します。
| |
イメージのURLを登録します。一行ごとにイメージのURLを設定することができ、複数行にイメージのURLを設定することができます。
| |
チェックやインストールのスケジュールを設定します。
| |
変更した設定ファイルを保存します。
|
USBメモリからのアップデートと同様に、ログは/var/log/messagesに保存されます。 | |
---|
initial_setupのイメージを作成の際に /usr/share/mkswu/examples/enable_swupdate_url.desc を入れると有効にすることができます。 |
hawkBit を使用した自動インストール
hawkBit で Armadillo-IoT ゲートウェイ A6E を複数台管理してアップデートすることができます。
以下の「hawkBitサーバーから複数のArmadilloに配信する」を参考にしてください。
10.8.4. hawkBitサーバーから複数のArmadilloに配信するhawkBitサーバーを利用することで複数のArmadillo
のソフトウェアをまとめてアップデートすることができます。 手順は次のとおりです。
コンテナ環境の準備
Dockerを利用すると簡単にサーバーを準備できます。
Dockerの準備については https://docs.docker.com/get-docker/ を参照してください。 Dockerの準備ができたら、要件に合わせてコンテナの設定を行います。
ATDE の場合
ATDE以外の場合
-
Armadillo-IoT ゲートウェイ A6E 開発用ツール から
「Hawkbit docker-composeコンテナ」 をダウンロードして展開してください。
この場合、以下に
/usr/share/mkswu/hawkbit-compose を使う際に展開先のディレクトリとして扱ってください。
-
dockerがアクセスできるホストネームやアドレスを控えておいてください。
hawkBitサーバーの準備
/usr/share/mkswu/hawkbit-compose/setup_container.sh を実行して、質問に答えてください。
以下に簡単な(TLSを有効にしない)テスト用の場合と、
TLSを有効にした場合の例を参考にしてください。 setup_container.sh を一度実行した場合はデータのディレクトリーにある
setup_container.sh のリンクを実行して、ユーザーの追加等のオプション変更を行うこともできます。
--help を参考にしてください。
|
コンテナのコンフィグレーションとデータベースの場所を設定します。
| |
dockerの設定によってsudoが必要な場合もあります
| |
hawkBit の Web UI のログインを admin とデフォルトにします。
| |
そのパスワードを二回入力します。
| |
追加のユーザーが必要な場合に追加できます。
| |
examples/hawkbit_register.desc で armadillo を登録する場合に作っておいてください。
詳細は 「SWU で hawkBit を登録する」 を参考にしてください。
| |
hawkbit_push_update でアップデートを CLI で扱う場合に作っておいてくダサい。
詳細は <sct.hawkbit_push_update>> を参照してください。
| |
さらに、hawkbit_push_update でアップデートを実行までする場合は、この権限を許可してください。
| |
ここでは http でテストのコンテナを作成するので、「N」のままで進みます。
| |
コンテナを起動します。初期化が終わったら <IP>:8080 でアクセス可能になります。
|
|
今回は TLS を有効にしますので、「y」を答えます。
| |
lighttpd サービスが起動している場合に聞かれます。不要なので、停止します。
| |
証明書の common name を入力してください。ATDE の場合、
ポート転送によってホストのIPアドレスで接続しますのでそのアドレスを入力します。
Let’s encrypt を使用する場合には外部からアクセス可能なDNSを入力してください。
| |
証明書の有効期間を設定します。デフォルトでは10年になっています。
Let’s encryptを使用する場合には使われていません。
| |
クライアント側では x509 証明書で認証をとることができますが、この例では使用しません。
| |
Let’s encrypt による証明書を作成できます。
ATDE の場合は外部からのアクセスが難しいので、この例では使用しません。
| |
自己署名証明書を作成したので、 Armadillo に設置する必要があります。
この証明書の取扱いには 「SWU で hawkBit を登録する」 を参照してください。
|
hawkBitへのログイン
作成したコンテナによって http://<サーバーのIPアドレス>:8080 か
https://<サーバーのアドレス> にアクセスすると、ログイン画面が表示されます。 デフォルトでは次のアカウントでログインできます。
ArmadilloをTargetに登録する
左側のメニューから Deployment をクリックして、Deployment の画面に移ります。 "+"をクリックしてTargetを作成します。 作成したターゲットをクリックすると、
下のペインに "Security token:<文字列>" と表示されるので、
<文字列>の部分をメモします。 メモした<文字列>をArmadilloの /etc/swupdate.cfg に設定すると Hawkbit への接続認証が通るようになります。
Target Filterを作成する
左側のメニューから"Target Filters"をクリックして、Target Filters の画面に移ります。 "+" をクリックして新規にTarget Filterを作成します。 Filter name と 検索式を入力して保存します。
Software moduleを作成する
左側のメニューから"Upload"をクリックして、Upload Managementの画面に移ります。 "+" をクリックしてSoftware moduleを作成します。
type には OS/Application、
version には 任意の文字列を指定します。
swuパッケージをアップロードしてSoftware moduleに関連付ける
先程作成した Software module を選択して、ハイライトされた状態で、
"Upload File"ボタン、もしくは、ファイルをドラッグアンドドロップします。
Distributionを作成してSoftware moduleを関連付ける
左側のメニューから"Distribution"をクリックして、Distribution Managementの画面に移ります。 "+" をクリックしてDistributionを作成します。
type には OS/OSwithApp/Apps、
version には任意の文字列を指定します。 "Software module"のペインから先程作成した
Softwareをドラッグして、作成したDistributionの上にドロップします。
Rolloutを作成してアップデートを開始する
左側のメニューから"Rollout"をクリックして、Rollout Managementの画面に移ります。 "+"をクリックしてRolloutを作成します。
アップデートの状態を確認する。
Rollout Managementの画面のDetail Statusで、各Rolloutのアップデートの状態を確認できます。 アップデート中は黄色、アップデートが正常に完了すると緑色になります。
10.8.4.1. hawkBit のアップデート管理を CLI で行う一つのアップデートを登録するには、hawkBit の Web UI で必要な手順が長いので CLI で行うことで
効率よく実行できます。 サーバーの設定の段階では、「mkswu」のユーザーを作成する必要があります。
作成していない場合は setup_container.sh --add-user mkswu で作成してください。 -
hawkbit_push_update の実行例です
[ATDE ~/mkswu]$ ls enable_sshd.swu
enable_sshd.swu
[ATDE ~/mkswu]$ hawkbit_push_update --help
Usage: /usr/bin/hawkbit_push_update [options] file.swu
rollout creation:
--no-rollout: only upload the file without creating a rollout
--new: create new rollout even if there already is an existing one
--failed: Apply rollout only to nodes that previously failed update
post action:
--start: start rollout immediately after creation
[ATDE ~/mkswu]$ hawkbit_push_update --start enable_sshd.swu
Uploaded (or checked) image extra_os.sshd 1 successfully
Created rollout extra_os.sshd 1 successfully
Started extra_os.sshd 1 successfully |
この例ではあらかじめ作成されてる enable_sshd.swu を hawkBit に登録します。
| |
--no-rollout を使う場合に SWU を「distribution」として登録します。
デフォルトでは rollout も作成します。
テストする際、デバイスがまだ登録されていなければ rollout の段階で失敗します。
| |
同じ SWU で rollout を二回作成した場合にエラーが出ます。
もう一度作りたい場合は --new を使ってください。
| |
一度 rollout をスタートして、 Armadillo で失敗した場合には
失敗したデバイスだけに対応した rollout を作れます。
| |
作成した rollout をすぐ実行します。このオプションには追加の権限を許可する必要があります。
| |
スタートまで行う実行例です。実行結果は Web UI で表示されます。
|
10.8.4.2. SWU で hawkBit を登録するデバイスが多い場合は、SWUを一度作って armadillo を自己登録させることができます。 サーバーの設定の段階では、「device」のユーザーを作成する必要があります。
作成していない場合は setup_container.sh --add-user device で作成してください。 -
hawkbit_register.desc で hawkBit の自己登録を行う例
[ATDE ~]$ cd mkswu/
[ATDE ~/mkswu]$ cp /usr/share/mkswu/examples/hawkbit_register.* .
[ATDE ~/mkswu]$ vi hawkbit_register.sh
# Script configuration: edit this if required!
# user given here must have CREATE_TARGET,READ_TARGET_SECURITY_TOKEN permissions
HAWKBIT_USER=device
HAWKBIT_PASSWORD="CS=wC,zJmrQeeKT.3"
HAWKBIT_URL=https://10.1.1.1
HAWKBIT_TENANT=default
# set custom options for suricatta block or in general in the config
CUSTOM_SWUPDATE_SURICATTA_CFG="" # e.g. "polldelay = 86400;"
CUSTOM_SWUPDATE_CFG=""
# set to non-empty if server certificate is invalid
SSL_NO_CHECK_CERT=
# or set to cafile that must have been updated first
SSL_CAFILE=
# ... or paste here base64 encoded crt content
SSL_CA_BASE64="
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJlakNDQVNHZ0F3SUJBZ0lVYTMvYXpNSHZ0
bFFnaFZnZDhIZWhMaEwxNm5Bd0NnWUlLb1pJemowRUF3SXcKRXpFUk1BOEdBMVVFQXd3SU1UQXVN
UzR4TGpFd0hoY05Nakl3TWpFNE1EVTFNakV6V2hjTk16SXdNakUyTURVMQpNakV6V2pBVE1SRXdE
d1lEVlFRRERBZ3hNQzR4TGpFdU1UQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VICkEwSUFC
RFJGcnJVV3hHNnBHdWVoejRkRzVqYkVWTm5scHUwYXBHT1c3UVBPYUF4cWp1ZzJWYjk2UHNScWJY
Sk8KbEFDVVo2OStaMHk3clBqeDJHYnhDNms0czFHalV6QlJNQjBHQTFVZERnUVdCQlJtZzhxL2FV
OURRc3EvTGE1TgpaWFdkTHROUmNEQWZCZ05WSFNNRUdEQVdnQlJtZzhxL2FVOURRc3EvTGE1TlpY
V2RMdE5SY0RBUEJnTlZIUk1CCkFmOEVCVEFEQVFIL01Bb0dDQ3FHU000OUJBTUNBMGNBTUVRQ0lB
ZTRCQ0xKREpWZnFTQVdRcVBqNTFmMjJvQkYKRmVBbVlGY2VBMU45dE8rN0FpQXVvUEV1VGFxWjhH
UFYyRUg1UWdOMFRKS05SckJDOEtpNkZWcFlkRUowYWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0t
LS0tCg==
"
# ... or add your own options if required
CURLOPT=-s
: (省略)
[ATDE ~/mkswu]$ cat hawkbit_register.desc
: (省略)
swdesc_script hawkbit_register.sh --version extra_os.hawkbit 1
[ATDE ~/mkswu]$ mkswu hawkbit_register.desc
hawkbit_register.swu を作成しました。
[ATDE ~/mkswu]$ mkswu initial_setup.desc hawkbit_register.desc
hawkbit_register.desc を組み込みました。
initial_setup.swu を作成しました。 |
hawkbit_register.sh と .desc ファイルをカレントディレクトリにコピーします。
| |
hawkbit_register.sh を編集して、設定を記載します。
| |
hawkBit の設定の時に選んだ「device」ユーザーのパスワードを入力します。この例のパスワードは使用しないでください。
| |
hawkBit サーバーのURLを入力します。
| |
TLS を使用の場合に、コンテナ作成の時の証明書を base64 で入力します。
| |
hawkbit_register.desc の中身を確認します。hawkbit_register.sh を実行するだけです。
| |
SWU を作成して、initial_setupがすでにインストール済みの Armadillo にインストールできます。
| |
または、initial_setup.desc と合わせて hawkbit_register を含んだ initial_setup.swu を作成します。
|
10.8.5. mkswu の desc ファイル.desc ファイルを編集して、いくつかのコマンドが使えます。
例 [ATDE ~/mkswu]$ tree /usr/share/mkswu/examples/nginx_start
/usr/share/mkswu/examples/nginx_start
└── etc
└── atmark
└── containers
└── nginx.conf
[ATDE ~/mkswu]$ cat /usr/share/mkswu/examples/usb_container_nginx.desc
swdesc_option version=1
swdesc_usb_container "nginx_alpine.tar"
swdesc_files --extra-os "nginx_start" |
nginx_alpine.tar ファイルに保存されたコンテナをインストールします。
| |
nginx_start ディレクトリーの中身を転送します。
|
コマンドは書かれた順番でインストールします。インストールするかどうかの判断はバージョンで行います: swdesc_option component=<component>
swdesc_option version=<version>
か
swdesc_xxx --version <component> <version> [options]
<component>は以下のどれかにしてください (デフォルトでは .desc ファイルのファイル名を使います)
base_os : rootfs (Armadillo Base OS)を最初から書き込む時に使います。現在のファイルシステムは保存されていない。
この場合、/etc/swupdate_preserve_filesに載ってるファイルのみをコピーして新しいbase OSを展開します。 このcomponentがないと現在のrootfsのすべてがコピーされます。
extra_os.<文字列> : rootfsの変更を行う時に使います。<文字列> には任意の文字列を指定します。
rootfsを変更を行う時に使います。 swdesc_* コマンドに --extra-os オプションを追加すると、 component に自動的に extra_os. を足します。
<文字列> (コンテナの名前などの任意の文字列): rootfsの変更がないときに使います。
このcomponentを使うとrootfsの変更ができませんのでご注意ください。
アップデートをインストールする際にこのバージョンと現在のバージョンを比べてアップデートの判断します。
<component> がまだインストールされてなかった時か <version> が上がる時にインストールします。 デフォルトではダウングレードはできませんが、 --install-if=different オプションを追加することで <version> が変わる際にインストール可能になります。 アップデートの一部をインストールすることもありますので、複数の component で管理し、いくつかの古いバージョンに対応するアップデートも作成可能です。
以下のコマンドから使ってください
swdesc_tar と swdesc_files でファイルを転送します。
swdesc_tar [--dest <dest>] <tar_file>
swdesc_files [--dest <dest>] [--basedir <basedir>] \
<file> [<more files>] swdesc_tar の場合、予め用意されてあるtarアーカイブをこのままデバイスで展開します。
--dest <dest> で展開先を選ぶことができます。デフォルトは / (--extra-os を含め、バージョンの component は base_os か extra_os.* の場合)か /var/app/rollback/volumes/ (それ以外のcomponent)。
後者の場合は /var/app/volumes と /var/app/rollback/volumes 以外は書けないので必要な場合に --extra-os を使ってください。
swdesc_files の場合、mkswu がアーカイブを作ってくれますが同じ仕組みです。
--basedir <basedir> でアーカイブ内のパスをどこで切るかを決めます。
-
例えば、
swdesc_files --extra-os --basedir /dir /dir/subdir/file ではデバイスに /subdir/file を作成します。
-
デフォルトは <file> から設定されます。ディレクトリであればそのまま basedir として使います。それ以外であれば親ディレクトリを使います。
swdesc_command や swdesc_script でコマンドを実行する
swdesc_command <command> [<more commands>]
swdesc_script <script> アップデート先の環境でコマンドやスクリプトファイルを走らせます。 バージョンの component は base_os と extra_os 以外の場合、 /var/app/volumes と /var/app/rollback/volumes 以外何も変更できないのでご注意ください。 コマンドが成功しないとアップデートが失敗します。
swdesc_exec でファイルを配ってコマンドでそのファイルを使う
swdesc_exec <file> <command> swdesc_command と同じくコマンドを走らせますが、<file> を先に転送してコマンド内で"$1"として使えます。
swdesc_command_nochroot , swdesc_script_nochroot , swdesc_exec_nochroot で起動中のシステム上でコマンドを実行します。
このコマンドは nochroot なしのバージョンと同じ使い方で、現在起動中のシステムに変更や確認が必要な場合にのみ使用してください。 | |
---|
nochroot コマンドは確認を一切しないため、Armadillo が起動できない状態になる可能性もあります:充分にご注意ください。
例が必要な場合は /usr/share/mkswu/examples/firmware_update.desc を参考にしてください。 |
swdesc_embed_container , swdesc_usb_container , swdesc_pull_container で予め作成したコンテナを転送します。
swdesc_embed_container <container_archive>
swdesc_usb_container <container_archive>
swdesc_pull_container <container_url> 例は「コンテナの配布」を参考にしてください。
swdesc_boot で imx-boot を更新します。
swdesc_boot <boot image> このコマンドだけにバージョンは自動的に設定されます。
コマンドの他には、設定変数もあります。以下の設定は /home/atmark/mkswu/mkswu.conf に設定できます。 -
DESCRIPTION="<text>" : 自由なイメージの説明、ログに残ります。
-
PRIVKEY=<path> , PUBKEY=<path> : 署名鍵と証明書
PRIVKEY_PASS=<val> : 鍵のパスワード(自動用)
openssl のPass Phraseをそのまま使いますので、pass:password , env:var や file:pathname のどれかを使えます。
pass や env の場合他のプロセスに見られる恐れがありますのでfileをおすすめします。
-
ENCRYPT_KEYFILE=<path> : 暗号化の鍵
以下のオプションも mkswu.conf に設定できますが、.descファイルにも設定可能です。swdesc_option で指定することで、
誤った使い方した場合 mkswu の段階でエラーを出力しますので、必要な場合は使用してください。 以下のオプションは 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 に用意してあります。
/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
swdesc_command "ssh-keygen -A" \
"rc-update add sshd"
[ATDE ~/mkswu]$ cp ~/.ssh/id_rsa.pub \
enable_sshd/root/.ssh/authorized_keys
[ATDE ~/mkswu]$ mkswu enable_sshd.desc
Enter pass phrase for /home/atmark/mkswu/swupdate.key:
enable_sshd.swu を作成しました。 |
自分の公開鍵を転送します。デフォルトのオプションなので enable_sshd/root ディレクトリの中身をこのまま /root に転送されます。
| |
再起動する度に新しいサーバーの鍵が変わらないように、アップデートの時に一回作成します。
| |
サービスを有効にします。
| |
自分の公開鍵を指定された場所に配置します。
| |
イメージを作成します。パスワードは証明鍵のパスワードです。
|
10.8.5.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
# 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" \
--version base_os [VERSION]
[ATDE ~/mkswu]$ mkswu update-[VERSION].desc
Enter pass phrase for /home/atmark/mkswu/swupdate.key:
update-[VERSION].swu を作成しました。 |
imx-bootでビルドしたイメージを使います。
| |
build-rootfsでビルドしたイメージを使います。
| |
バージョンを上がるときにしかインストールされませんので、現在の/etc/sw-versionsを見て上がるように設定してください。
| |
イメージを作成します。パスワードは証明鍵の時のパスワードです。
|
10.8.5.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
[armadillo ~]# persist_file /etc/swupdate_preserve_files |
swupdate_preserve_files に /boot と /lib/modules を保存するように追加します。
| |
変更した設定ファイルを保存します
|
| |
---|
/usr/share/mkswu/examples/kernel_update*.desc のように update_preserve_files.sh のヘルパーで、パスを自動的に /etc/swupdate_preserve_files に追加することができます。
[ATDE ~/mkswu]$ cp /usr/share/mkswu/examples/update_preserve_files.sh .
[ATDE ~/mkswu]$ cat example.desc
swdesc_script update_preserve_files.sh -- \
"POST /boot" \
"POST /lib/modules" |
10.8.6. swupdate_preserve_files についてextra_os のアップデートで rootfs にファイルを配置することができますが、次の OS アップデートの際に削除される可能性があります。
デフォルトでは、 /etc/atmark と、 swupdate 、 sshd やネットワークの設定を保存しますがそれ以外はコピーされてません。 そうでないファイルを更新する際には /etc/swupdate_preserve_files に記載します。「例: swupdate_preserve_files で Linux カーネル以外の Armadillo-IoT ゲートウェイ A6E 向けのイメージをインストールする方法」 を参考にしてください。 コピーのタイミングによって、以下のどれかを使ってください:
単にファイルを記載する。
この場合、アップデートする前にファイルをコピーします。 baseos のイメージと同じ swu にアップデートしたいファイルを記載していても、
このファイルが Armadillo Base OS に含まれないのであれば問題なくアップデートできます。 例: echo "/root/.profile" >> /etc/swupdate_preserve_files
POST のキーワードの後に記載する。
この場合、アップデートの最後でコピーします。 Armadillo Base OS に含まれてるファイルであれば、インストール前にコピーしても保存されないのでコピーのタイミングをずらします。 そのコピーが最後に行われるので、同じアップデートでファイルの変更ができません。アップデートを別けて、 baseos のイメージをインストールしてからこのファイルを更新することができます。 例: echo "POST /etc/conf.d/podman-atmark" >> /etc/swupdate_preserve_files
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 10.8.8. SWUpdate と暗号化についてmkswu --init の時に暗号化を有効にする場合は AES でファイルを暗号化します。
現在使われてる SWUpdate の暗号化はコマンドやメタデータを含む sw-description ファイルは暗号化されてません。
そのため、通信の暗号化(HTTPSで送信するなど)を使うことを推奨します。 10.9. Armadillo Base OS の操作Armadillo Base OS は Alpine OS をベースとして作られています。 このセクションでは Armadillo Base OS の機能を紹介します。 Armadillo Base OS は SWUpdate によってアップデートすることができます。 アップデートする際には、rootfs ファイルシステムにインストールされたファイルをすべて消して、アップデートの中身と /etc/swupdate_preserve_files に記載されているファイルで新しい rootfs を作ります。 アップデートでファイルを削除してしまった場合に abos-ctrl mount-old で前のシステムを read-only でマウントして、
削除されたファイルをコピーすることもできます。 10.9.2. overlayfs と persist_file についてArmadillo BaseOS ではルートファイルシステムに overlayfs を採用しています。 そのため、ファイルを変更した後 Armadillo の電源を切ると変更内容は保持されません。
開発中などに rootfs の変更内容を保持するには、変更したファイルに対して persist_file コマンドを使用します。 開発以外の時は安全のため、ソフトウェアアップデートによる更新を実行してください。
アップデート手順に関しては 「Armadilloのソフトウェアをアップデートする」 を参照してください。 rootfs の内容を変更しても、ソフトウェアアップデートを実施した際に変更した内容が保持されない可能性があります。 persist_file コマンドの概要を 図10.101「persist_file のヘルプ」 に示します。
ファイルの保存・削除手順例
|
追加・変更したファイルを rootfs へコピーします。
| |
-r を指定すると、ひとつ前の rm -f コマンドで削除したファイルがrootfsからも削除されますのでご注意ください。
| |
すでに rootfs に存在するファイルも一度削除してからコピーするため、このようなメッセージが表示されます。
|
ソフトウェアアップデート後も変更を維持する手順例
|
何らかのファイルの内容を変更します。
| |
-P オプションを付与して persist_file を実行します。
| |
swupdate_preserve_files に追加されたことを確認します。
|
変更ファイルの一覧表示例
|
rootfs のファイルを見せないディレクトリは opaque directory と表示されます。
| |
削除したファイルは whiteout と表示されます。
|
パッケージをインストールする時はapkコマンドを使用してメモリ上にインストールできますが、
persist_file コマンドで rootfs に直接インストールすることも可能です。
|
この例では Armadillo を再起動せずにインストールしたコマンドを使用できましたが、Armadillo の再起動が必要となるパッケージもありますので、その場合は Armadillo を再起動してください。
|
Armadillo Base OS の ルートファイルシステムが壊れて起動できなくなった場合に自動的に前のバージョンで再起動します。 自分で確認する必要がある場合に abos-ctrl status でロールバックされてるかどうかの確認ができます。 必要な場合(例えば、自分のアプリケーションがアップデート直後に問題があった場合)、 abos-ctrl rollback で手動のロールバックも可能です。ロールバックにエラーがなければ、再起動してロールバックを完了します。 なお、/var/at-log/atlog に切り替えの際に必ずログを書きますので、調査の時に使ってください。 u-boot の環境変数を変更するには /boot/uboot_env.d/ ディレクトリに環境変数が書かれた設定ファイルを配置します。 ファイルの構文は fw_setenv が扱うことができるもので、以下のとおりです: -
# で始まる行はコメントと扱われる為、無視されます。また、 環境変数への代入を示す = がない場合も無視されます。
-
[変数]=[値] で変数を設定します。スペースや引用符を含め他の文字は有効ですので、変数の名前と値に不要な文字を入れないように注意してください。
-
[変数]= で変数を消します。値がない場合に変数が消去されます。
このファイルによるアップデート内容は swupdate でアップデートする際に適用されます。 実行中のシステムに影響がありませんので、設定ファイルを swupdate で転送しない場合はファイル永続化後に fw_setenv -s /boot/uboot_env.d/[ファイル名] で変数を書き込んでください。 swupdate でファイルを転送した場合は変数をすぐに利用されます。 |
コンフィグファイルを生成します。
| |
ファイルを永続化します。
| |
変数を書き込みます。
| |
書き込んだ変数を確認します。
|
| |
---|
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 にある変数を後のファイルにも設定した場合はそのファイルの値だけが残ります。
|
10.10. Device Treeをカスタマイズするa eMMC は主に NAND Flash メモリから構成されるデバイスです。NAND Flash メモリには書き込みしてから1年から3年程度の長期間データが読み出されないと電荷が抜けてしまう可能性があります。その際、電荷が抜けて正しくデータが読めない場合は、eMMC 内部で ECC (Error Correcting Code) を利用してデータを訂正します。しかし、訂正ができないほどにデータが化けてしまう場合もあります。そのため、一度書いてから長期間利用しない、高温の環境で利用するなどのケースでは、データ保持期間内に電荷の補充が必要になります。電荷の補充にはデータの読み出し処理を実行し、このデータの読み出し処理をデータリテンションと呼びます。 Armadillo-IoT ゲートウェイ A6Eに搭載のeMMCは、eMMC自身にデータリテンション機能が備わっており、A6Eに電源が接続されてeMMCに電源供給されている状態で、eMMC内部でデータリテンション処理が自動実行されます。 10.12. SMS を利用する (Cat.M1 モデルのみ)Armadillo-IoT ゲートウェイ A6E は、LTE モジュール を使用した SMS の送受信を行うことができます。
SMS の送信、受信した SMS の確認および削除などの操作は ModemManager の mmcli コマンドで行うことができます。 本章では mmcli コマンドでの SMS の使用方法について説明します。 SMS が利用可能な SIM を挿入して Armadillo-IoT ゲートウェイ A6E の電源を入れると、 ModemManager が必要な初期設定を行い、 SMS が利用可能になります。 SMS の受信は自動的に行われます。 図10.108「言語設定」に示すコマンドを実行し、言語設定を行います。 SMS を作成するには、図10.109「SMS の作成」に示すコマンドを実行します。 SMSの作成に成功すると、以下のようにSMS番号が表示されます。SMS番号は送信時に使用します。 図10.111「SMS の送信」に示すコマンドを実行し、SMS 送信を行います。 [SMS番号] には、 SMS の作成時に表示された番号を指定します。 SMS を送信可能な端末から Armadillo-IoT ゲートウェイ A6E に SMS を送信すると、 Armadillo-IoT ゲートウェイ A6E は自動的に SMS を受信します。 また、 EMS31-J の内蔵ストレージに 10 件 SMS を保存した状態で Armadillo-IoT ゲートウェイ A6E に SMS を送信した場合は、Armadillo-IoT ゲートウェイ A6E は受信を行いません。 受信を行うには、 EMS31-J の内蔵ストレージに保存している SMS を削除するか、他のストレージに移動する必要があります。 図10.112「SMS の一覧表示」のコマンドを実行することで、 SMS 一覧を表示できます。 末尾が "(sent)" となっているものが送信した SMS で "(received)" となっているものが受信した SMS です。 SMS の内容を表示するには、図10.113「SMSの内容を表示」に示すコマンドを実行します。 受信した SMS は自動的に LTE モジュールの内蔵ストレージに保存されます。Armadillo-IoT ゲートウェイ A6E に搭載されている、 EMS31-J は、最大 10 件まで SMS を保存することが可能です。 SMS の内容を表示した際の「storage: me」は、 LTE モジュールの内蔵ストレージに SMS が保存されていることを意味しています。 「storage: sm」と表示された場合、 SIM カードのストレージに SMS が保存されています。 SIM カードのストレージに保存できる SMS の件数は SIM カードによって異なります。 ストレージに保存されている SMS は、Armadillo-IoT ゲートウェイ A6E の電源を切断してもデータが保持されます。 | |
| | | |
| |