7. Tips

Terminal System 2のアプリケーション開発に役立つ情報です。

7.1. SSHログイン設定

開発時のエッジコンピューターへのアクセスは、ローカルネットワークのSSHログインを推奨します。 ユーザーガイドの「プロビジョニングと事前設定」 を参照して、SSHログイン設定を実施してください。 Menderのリモートターミナルは、Menderサーバーを経由する都合上、アクセス速度が比較的遅くなります。

$ export ADMIN_PASS=<admin password>
$ export API_FQDN=<api fqdn>
$ curl -w '%{http_code}\n' -u admin:$ADMIN_PASS -X PUT \
   -F file=@/path/to/id_rsa.pub  \
   http://$API_FQDN/api/v3/login_users/admin/authorized_keys

7.2. 開発中のアプリケーションの差し替え

開発中にアプリケーションのバイナリのみを差し換えたい場合は、以下の手順を実施してください。

  1. アプリケーションをクロスビルドする。

  2. scpでエッジコンピューターの /home/admin/ ディレクトリにアプリケーションのバイナリをコピーする。

    $ scp <application> <target>:/home/admin/
    
  3. measurementプロジェクトの場合はデバイスコネクターサービスファイルまたはOverrideファイル(docker-compose.override.yml)、 カスタムプロジェクトの場合はComposeファイル(docker-compose.yml)を編集し、 volumes にアプリケーションのバインドマウント設定を追加する。

    volumes:
        - /home/admin/<application>:/path/to/application
    

    注釈

    コンテナ起動中にバインドマウントしたファイルを変更する可能性がある場合は、ディレクトリをマウントすることを推奨します。 (編集によりファイルが削除/追加された場合、コンテナで変更を検知できない場合があるため。)

  4. 以降、動作確認とバイナリの差し替えを繰り返します。

7.3. Dockerコンテナのデバッグ

Dockerコンテナをデバッグする際は以下のコマンドを利用できます。

実行中のコンテナリストを確認
# docker ps
実行中のコンテナでコンソール操作
# docker exec -it CONTAINER bash

注釈

必要に応じてコンテナ内でデバッグ用のパッケージのインストール等を行うことが可能です。

# apt update
# apt isntall <パッケージ>

7.4. Mender操作

Menderサーバーに用意されたデプロイメントを即時確認する
# mender check-update
Menderサーバーにインベントリを即時報告する
# mender send-inventory
ローカルでアーティファクトをインストールする
# mender-standalone-update.sh <アーティファクトのパス>
クライアントPCからCore APIを使ってアーティファクトをインストールする
$ export ADMIN_PASS=<admin password>
$ export API_FQDN=<api fqdn>
$ curl -w '%{http_code}\n' -u admin:$ADMIN_PASS -X POST \
  -F file=@/path/to/artifact.mender \
  http://$API_FQDN/api/v3/terminal_system/upgrade_with_file

7.5. ログ取得

ログは journalctldocker logs および docker compose logs コマンドで取得できます。 docker logs および docker compose logs コマンドは、起動中のコンテナログを表示するため、前回以前に起動したコンテナのログを確認する場合は journalctl コマンドを利用してください。

よく使われるログ取得方法を以下に示します。なお、いくつかのオプションは組み合わせて利用できます。

共通オプション

-f, --follow

ログをリアルタイムで表示します。新しいエントリが追加されるたびにそれらが表示されます。

# journalctl -f
# docker logs -f CONTAINER
--since, --until

指定した日時以降、または指定した日時までのログメッセージを表示します。 例えば、以下のコマンドは2023年5月22日の18:00から19:00のログメッセージを表示します。

# journalctl  --since="2023-05-22 18:00:00" --until="2023-05-22 19:00:00"
# docker logs --since="2023-05-22T18:00:00" --until="2023-05-22T19:00:00" CONTAINER

注意

journalctldocker logs では、 --since, --until オプションの日付指定方法が異なるため注意してください。

journalctl

-u, --unit=UNIT

特定のsystemdユニットのログを表示します。

# journalctl -u mender-client

注釈

ログ確認に使われるsystemdユニット

  • terminal-system-cored Core Damon

  • mender-client Mender Client

  • mender-connect Mender リモートターミナル

  • mender-monitor Mender モニター

  • docker Docker

  • docker-archive-load docker-archive-load

  • NetworkManager Network Manager

  • ModemManager Modem Manager

  • edgeplant-l4t-faultlog 電源の強制切断ログ監視 (EDGEPLANT T1)

-b, --boot[=ID]

指定したIDのブートログを表示します(省略された場合は現在のブートを対象とします)。

# journalctl -b

例えば、 journalctl -b は最新のブートログを表示し、 journalctl -b -1 は前回起動時のブートログを表示します。 ブートリストは journalctl --list-boot で確認することができます。

# journalctl --list-boot
-4 3c016f4f9c72462a98297b796802ba68 Thu 2023-05-18 08:55:46 UTC—Thu 2023-05-18 15:03:07 UTC
-3 e0f26f60420a4b14b4f11320ee74a033 Fri 2023-05-19 00:36:14 UTC—Fri 2023-05-19 06:44:12 UTC
-2 5518e4f84c3e49978b0989ba31633c52 Fri 2023-05-19 06:44:31 UTC—Fri 2023-05-19 09:12:16 UTC
-1 24f7f3ca082542ef8ad31e6e79abb94e Mon 2023-05-22 01:38:41 UTC—Mon 2023-05-22 06:06:20 UTC
 0 277765a321874d948aed5e94d12cdf23 Mon 2023-05-22 06:06:39 UTC—Mon 2023-05-22 12:18:09 UTC
-k, --dmesg

カーネルのメッセージバッファからログを表示します(dmesgコマンドの出力と同等)。 システムが起動した時点からの全てのカーネルメッセージを表示します。

注釈

dmesg コマンドはカーネルのメッセージバッファが一杯になると古いメッセージが新しいメッセージで上書きされるため、 システムが長時間稼働していると起動時のメッセージは表示されません。

-p, --priority[=PRIORITY]

指定した優先度(またはそれ以上)のログメッセージのみを表示します。 優先度は0(emerg)から7(debug)までの整数で指定します。 例えば、 journalctl -p err はエラーメッセージ(優先度3)以上を表示します。

# journalctl -p err

注釈

device-connector-intdashは、ログ情報を標準エラー出力に表示するため、 -p err オプションを利用してフィルタすることが可能です。

-k, --dmesg オプションと組み合わせるとカーネルのエラーログを確認できます。

# journalctl -p err -k
CONTAINER_NAME=<コンテナ名>

指定したコンテナのログを表示します。

注意

コンテナ名は完全一致で指定する必要があります。

docker (compose) logs

--tail

ログの最終から数えた行以降を表示します。 このオプションを指定しない場合は、コンテナ起動時からの全てのログを表示します。 -f, --follow と合わせて利用することが多いです。

# docker logs -f --tail 0 measurement-camera-1
# docker compose --project-name measurement logs -f --tail 0
-t, --timestamps

各ログエントリの前にそのエントリのタイムスタンプを表示します。

COTNAINER (docker logsのみ)

docker logs [OPTIONS] CONTAINER で指定する CONTAIENR には、以下の2つを指定可能です。

  • コンテナID ( docker psCONTAINER ID 、 前方一致の部分文字列で指定可能)

  • コンテナ名 ( docker psNAMES 、 完全一致で指定)

docker ps でコンテナを確認します。

# docker ps
CONTAINER ID   IMAGE                                                       COMMAND                  CREATED         STATUS                   PORTS     NAMES
f0d1536b4a97   ...omitted.../intdash-edge-agent2:1.0.0                     "intdash-agentd serv…"   6 hours ago     Up 6 hours (healthy)               system-intdash-edge-agent2-1
a03c2ec1543b   ...omitted.../terminal-display-client:1.0.0                 "terminal_display_cl…"   6 hours ago     Up 6 hours                         system-terminal-display-client-1
4eda964cb0b5   ...omitted.../terminal-system-coreapi:1.0.0                 "/usr/bin/coreapi se…"   6 hours ago     Up 6 hours (healthy)               system-terminal-system-coreapi-1

以下は同じログを表示します。

# docker logs f0d1536b4a97
# docker logs f
# docker logs system-intdash-edge-agent2-1
-p, --project-name (docker compose logsのみ)

指定したプロジェクトのログのみを表示します。

# docker compose --project-name measurement logs

用途別

現在のブートの特定のコンテナのログを表示する

docker ps でコンテナ名を確認します。 コンテナ名は <Composeプロジェクト名>-<サービス名(デバイスコネクター設定のIDなど)>-<インスタンス番号(通常は1)> になります。

# docker ps
CONTAINER ID   IMAGE                                                       COMMAND                  CREATED         STATUS                   PORTS     NAMES
2c8312e69949   ...omitted.../edgeplant_t1/device-connector-intdash:1.0.0   "/usr/bin/device-con…"   8 seconds ago   Up 2 seconds                       measurement-audio-1
59fe0505572c   ...omitted.../edgeplant_t1/device-connector-intdash:1.0.0   "/usr/bin/device-con…"   8 seconds ago   Up 2 seconds                       measurement-gps-1
08682a3d0651   ...omitted.../edgeplant_t1/device-connector-intdash:1.0.0   "/usr/bin/device-con…"   8 seconds ago   Up 2 seconds                       measurement-device-inventory-1
61ea3dddc60e   ...omitted.../edgeplant_t1/device-connector-intdash:1.0.0   "/usr/bin/device-con…"   8 seconds ago   Up 2 seconds                       measurement-camera-1
4dfc4e9dbba0   ...omitted.../intdash-edge-agent2:1.0.0                     "intdash-agentctl ru…"   8 seconds ago   Up 6 seconds (healthy)             measurement-intdash-edge-agent2-1
f0d1536b4a97   ...omitted.../intdash-edge-agent2:1.0.0                     "intdash-agentd serv…"   6 hours ago     Up 6 hours (healthy)               system-intdash-edge-agent2-1
a03c2ec1543b   ...omitted.../terminal-display-client:1.0.0                 "terminal_display_cl…"   6 hours ago     Up 6 hours                         system-terminal-display-client-1
4eda964cb0b5   ...omitted.../terminal-system-coreapi:1.0.0                 "/usr/bin/coreapi se…"   6 hours ago     Up 6 hours (healthy)               system-terminal-system-coreapi-1

journalctl コマンドで、 CONTAINER_NAME=<コンテナ名> を指定すると、指定したコンテナのログを表示します。

例: 現在のブートのデバイスコネクターID camera のログを表示する

# journalctl -b CONTAINER_NAME=measurement-camera-1
measurementプロジェクトの最新ログを継続表示する
# docker compose --project-name measurement logs -f --tail 0