8. Tips
Terminal System 2のアプリケーション開発に役立つ情報です。
8.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/login_users/admin/authorized_keys
8.2. 開発中のアプリケーションの差し替え
開発中にアプリケーションのバイナリのみを差し換えたい場合は、以下の手順を実施してください。
アプリケーションをクロスビルドする。
scpでエッジコンピューターの
/home/admin/
ディレクトリにアプリケーションのバイナリをコピーする。$ scp <application> <target>:/home/admin/
measurementプロジェクトの場合はデバイスコネクターサービスファイルまたはOverrideファイル(docker-compose.override.yml)、 カスタムプロジェクトの場合はComposeファイル(docker-compose.yml)を編集し、
volumes
にアプリケーションのバインドマウント設定を追加する。volumes: - /home/admin/<application>:/path/to/application
注釈
コンテナ起動中にバインドマウントしたファイルを変更する可能性がある場合は、ディレクトリをマウントすることを推奨します。 (編集によりファイルが削除/追加された場合、コンテナで変更を検知できない場合があるため。)
以降、動作確認とバイナリの差し替えを繰り返します。
8.3. Dockerコンテナのデバッグ
Dockerコンテナをデバッグする際は以下のコマンドを利用できます。
- 実行中のコンテナリストを確認
# docker ps
- 実行中のコンテナでコンソール操作
# docker exec -it CONTAINER bash
注釈
必要に応じてコンテナ内でデバッグ用のパッケージのインストール等を行うことが可能です。
# apt update # apt install <パッケージ>
8.4. Mender操作
- Menderサーバーに用意されたデプロイメントを即時確認する
# mender check-update
- Menderサーバーにインベントリを即時報告する
# mender send-inventory
- ローカルでアーティファクトをインストールする
# mender-standalone-update.sh <アーティファクトのパス>
- クライアントPCからTerminal System 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/terminal_system/upgrade_with_file
8.5. ログ取得
ログは journalctl
、 docker 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
注意
journalctl
とdocker logs
では、--since, --until
オプションの日付指定方法が異なるため注意してください。
journalctl
-u, --unit=UNIT
特定のsystemdユニットのログを表示します。
# journalctl -u mender-client
注釈
ログ確認に使われるsystemdユニット
terminal-system-cored
Core Damonmender-client
Mender Clientmender-connect
Mender リモートターミナルmender-monitor
Mender モニターdocker
Dockerdocker-archive-load
docker-archive-loadNetworkManager
Network ManagerModemManager
Modem Manageredgeplant-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 ps
のCONTAINER ID
、 前方一致の部分文字列で指定可能)コンテナ名 (
docker ps
のNAMES
、 完全一致で指定)
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