| | ここでは Armadillo の性能を最大限に生かした GUI アプリケーションを
作ることのできる Flutter を使った開発方法を紹介します。 Flutterとはモバイルアプリケーションや Web アプリケーションの開発に使われる
GUI アプリケーション開発ツールキットです。
マルチプラットフォームなので、ソースコードの大部分を共通化可能で一度開発したアプリケーションは最小限の工数で別の
プラットフォームへ移植できます。さらに、プラットフォーム間でアプリケーションの見た目も統一することができます。
アプリケーション開発言語として Dart を使用しています。 Flutter を使うことで Armadillo 上でも GUI アプリケーションを開発することができます。
以下は Flutter で開発したアプリケーションを Armadillo 上で動かしている例です。 10.1.2. Flutter を用いた開発の流れArmadillo 向けに Flutter アプリケーションを開発する場合の流れは以下のようになります。 ここでは、開発開始時の ATDE 上でのセットアップ手順について説明します。
ATDE をお使いでない場合は、先に 「ATDEのセットアップ」 を参照して ATDE のセットアップを完了してください。 ATDE のバージョン v20230123 以上には、 Flutter 開発環境と VSCode がインストール済みのため新規にインストールする必要はありませんが、
使用する前には最新版へのアップデートを行ってください。 VSCode を起動するには code コマンドを実行します。 | |
---|
VSCode を起動すると、日本語化エクステンションのインストールを提案してくることがあります。
その時に表示されるダイアログに従ってインストールを行うと VSCode を日本語化できます。 |
10.1.3.2. VSCode に開発用エクステンションをインストールするVSCode 上でアプリケーションを開発するためのエクステンションをインストールします。 エクステンションはマーケットプレイスからインストールすることができます。
VSCode を起動し、左サイドバーのエクステンションを選択して、検索フォームに「abos」と入力してください。 表示された「Armadillo Base OS Development Environment」の 「Install」ボタンを押すとインストールは完了します。 Flutter アプリケーションのサンプルとして以下を用意しております。 -
GUI アプリケーション
-
Signage アプリケーション
-
Factory Signage アプリケーション
| |
---|
以降の手順でサンプルアプリケーション毎に VSCode でクリックする箇所や生成されるファイル名等が変わります。 |
VSCode の左ペインの [G4/X2] から [<アプリケーション名> New Project]を実行し、表示されるディレクトリ選択画面からプロジェクトを保存するディレクトリを選択してください。実行するためには右に表示されている三角形ボタンを押してください。
保存先を選択すると、プロジェクト名を入力するダイアログが表示されるので、任意のプロジェクト名を入力してエンターキーを押してください。
ここでは、ホームディレクトリ直下に my_project として保存しています。
以下では例として [GUI アプリケーション] の作成を行っています。 初期設定では主に Armadillo と SSH で接続するための秘密鍵と公開鍵の生成を行います。 作成したプロジェクトディレクトリへ移動して VSCode を起動してください。 VSCode の左ペインの [my_project] から [Setup environment] を実行します。 選択すると、 VSCode の下部に以下のようなターミナルが表示されます。 このターミナル上で以下のように入力してください。 |
パスフレーズを設定します。設定しない場合は何も入力せず Enter を押します。
| |
ここで何か任意のキーを押すとターミナルが閉じます。
|
パスフレーズを設定した場合は、アプリケーションを Armadillo へ転送する時にパス
フレーズの入力を求められることがあります。 10.1.3.6. アプリケーション実行用コンテナイメージの作成Armadillo 上でアプリケーションを実行するためのコンテナイメージを作成します。
ここで作成したコンテナイメージは SWU イメージを使用して Armadillo へインストールするため、
事前に mkswu を参照して SWU の初期設定を行ってください。 コンテナイメージの作成および SWU イメージの作成も VSCode で行います。
VSCode の左ペインの [my_project] から [Generate development swu] を実行します。 コンテナイメージの作成にはしばらく時間がかかります。
VSCode のターミナルに以下のように表示されるとコンテナイメージの作成は完了です。 作成した SWU イメージは my_project/container/dev ディレクトリ下に gui_app_dev_image.swu という
ファイル名で保存されています。 10.1.4. Armadillo 上でのセットアップ「接続方法」 を参照して Armadillo にディスプレイを接続してください。 10.1.4.2. アプリケーション実行用コンテナイメージのインストール「アプリケーション実行用コンテナイメージの作成」 で作成した gui_app_dev_image.swu を
「イメージのインストール」 を参照して Armadillo へインストールしてください。 インストール後に自動で Armadillo が再起動します。
この際、 weston も自動起動します。 10.1.5.1. サンプルアプリケーションのビルドFlutter のサンプルアプリケーションのビルド方法を説明します。
プロジェクトディレクトリへ移動し VSCode を起動します。 VSCode の左ペインの [my_project] から [App run on ATDE] を実行すると、
アプリケーションがビルドされ ATDE 上で起動します。 | |
---|
flutter-elinux をイントール後に初めてビルドを実行する時は、必要なファイルのダウンロード処理が行われるため、
アプリケーションが起動するまでに時間がかかります。 |
GUI アプリケーションの場合は以下のようなアプリケーションが起動します。 アプリケーションを終了するにはウィンドウ右上の X ボタンを押してください。 サンプルアプリケーションのソースコードは、 app/lib にあります。
サンプルアプリケーションをベースとして開発を進める場合は、 app/lib 下にソースコードを
保存してください。 Flutter には様々な機能を実現するためのパッケージが豊富に存在しており、
主に こちらのサイトで見つけることができます。 目的のパッケージをアプリケーションで使えるようにするためには、
アプリケーションディレクトリの中で以下のコマンドを実行します。
例として dart_periphery パッケージをインストールします。 video_player や camera など以下に挙げたパッケージは、
ATDE 内の /opt/flutter-elinux-packages にあるパッケージと組み合わせて使う必要があります。 表10.1 組み合わせて使うパッケージ パッケージ名 | /opt/flutter-elinux-package 内のパッケージ名 |
---|
video_player | video_player_elinux | camera | camera_elinux | path_provider | path_provider_elinux | shared_preferences | shared_preferences_elinux | なし | joystick |
これらのパッケージをインストールする場合は以下のようにインストールしてください。 パッケージをアンインストールする場合は pub remove を実行します。 ここでは、実際に Armadillo 上でアプリケーションを起動する場合の手順を説明します。 プロジェクトディレクトリに入っている config/ssh_config ファイルを編集して
IP アドレスを書き換えてください。 |
Armadillo の IP アドレスに置き換えてください。
|
VSCode の左ペインの [my_project] から [App run on Armadillo] を実行すると、
アプリケーションが Armadillo へ転送されて起動します。 VSCode のターミナルに以下のメッセージが表示されることがあります。
これが表示された場合は yes と入力して下さい。 アプリケーションを終了するには VSCode の左ペインの [my_project] から [App stop on Armadillo] を実行してください。 アプリケーションのソースコードに修正を加えた後にコンパイルをせずに即座に動作確認をしたい場合、
ホットリロード機能を使うことができます。 ホットリロード機能を使うには、アプリケーション実行時に表示される VSCode のターミナルで r を入力してください。
その後、以下のようなメッセージが表示され修正が反映されます。 ここでは完成したアプリケーションをリリース版としてビルドする場合の手順について説明します。 VSCode の左ペインの [my_project] から [App build for release] を実行すると、
リリース版のアプリケーションがビルドされます。 実行ファイルを含むビルド生成物は app/build/elinux/arm64/release/bundle/ ディレクトリ下に保存されています。 リリース版のアプリケーションを含んだ SWU イメージを作成します。
事前に 「SWUイメージの作成」 を参照して SWU の初期設定を行ってください。 VSCode の左ペインの [my_project] から [Generate release swu] を実行すると SWU イメージが作成されます。 作成した SWU イメージは my_project/container/release ディレクトリ下に gui_app_rel_image.swu という
ファイル名で保存されています。 この SWU イメージを 「イメージのインストール」 を参照して Armadillo へインストールすると、
Armadillo 起動時にアプリケーションも自動起動します。 ここではシェルスクリプトおよび Python を使った CUI アプリケーションの開発方法を紹介します。
開発手順としてはシェルスクリプトと Python で同じであるため、シェルスクリプトの場合の例で説明します。 10.2.1. CUI アプリケーション開発の流れArmadillo 向けに CUI アプリケーションを開発する場合の流れは以下のようになります。 ここでは、開発開始時の ATDE 上でのセットアップ手順について説明します。
ATDE をお使いでない場合は、先に 「ATDEのセットアップ」 を参照して ATDE のセットアップを完了してください。 ATDE のバージョン v20230123 以上には、 VSCode がインストール済みのため新規にインストールする必要はありませんが、
使用する前には最新版へのアップデートを行ってください。 VSCode を起動するには code コマンドを実行します。 | |
---|
VSCode を起動すると、日本語化エクステンションのインストールを提案してくることがあります。
その時に表示されるダイアログに従ってインストールを行うと VSCode を日本語化できます。 |
10.2.2.2. VSCode に開発用エクステンションをインストールするVSCode 上でアプリケーションを開発するためのエクステンションをインストールします。 エクステンションはマーケットプレイスからインストールすることができます。
VSCode を起動し、左サイドバーのエクステンションを選択して、検索フォームに「abos」と入力してください。 表示された「Armadillo Base OS Development Environment」の 「Install」ボタンを押すとインストールは完了します。 VSCode の左ペインの [G4/X2] から [Shell New Project] を実行し、表示されるディレクトリ選択画面からプロジェクトを保存する
ディレクトリを選択してください。実行するためには右に表示されている三角形ボタンを押してください。
Python の場合は [Python New Project] を実行してください。
保存先を選択すると、プロジェクト名を入力するダイアログが表示されるので、任意のプロジェクト名を入力してエンターキーを押してください。
ここでは、ホームディレクトリ直下に my_project として保存しています。 初期設定では主に Armadillo と SSH で接続するための秘密鍵と公開鍵の生成を行います。 作成したプロジェクトディレクトリへ移動して VSCode を起動してください。 VSCode の左ペインの [my_project] から [Setup environment] を実行します。 選択すると、 VSCode の下部に以下のようなターミナルが表示されます。 このターミナル上で以下のように入力してください。 |
パスフレーズを設定します。設定しない場合は何も入力せず Enter を押します。
| |
1 でパスフレーズを設定した場合は、確認のため再度入力してください。
| |
ここで何か任意のキーを押すとターミナルが閉じます。
|
パスフレーズを設定した場合は、アプリケーションを Armadillo へ転送する時にパス
フレーズの入力を求められることがあります。 | |
---|
ssh の鍵は $HOME/.ssh/id_ed25519_vscode (と id_ed25519_vscode.pub ) に保存されていますので、
プロジェクトをバックアップする時は $HOME/.ssh も保存してください。 |
10.2.2.5. アプリケーション実行用コンテナイメージの作成Armadillo 上でアプリケーションを実行するためのコンテナイメージを作成します。
ここで作成したコンテナイメージは SWU イメージを使用して Armadillo へインストールするため、
事前に mkswu を参照して SWU の初期設定を行ってください。 コンテナイメージの作成および SWU イメージの作成も VSCode で行います。
VSCode の左ペインの [my_project] から [Generate development swu] を実行します。 コンテナイメージの作成にはしばらく時間がかかります。
VSCode のターミナルに以下のように表示されるとコンテナイメージの作成は完了です。 |
Dockerfile やパッケージリストを変更した場合のみにコンテナを再作成してください。
|
作成した SWU イメージは my_project/swu ディレクトリ下に dev.swu という
ファイル名で保存されています。 10.2.3. Armadillo 上でのセットアップここでは、実際に Armadillo 上でサンプルアプリケーションを起動する場合の手順を説明します。
プロジェクトディレクトリへ移動し VSCode を起動します。 プロジェクトにいくつかのディレクトリがあります。 -
app : アプリケーションのソースです。Armadillo では /var/app/rollback/volumes/shell_app または python_app にそのままコピーされます。
-
config : 開発モードのための設定ファイルです。「ssh_config の準備」 を参照してください。
-
container : スクリプトを実行するコンテナの設定ファイルです。 packages.txt に記載されているパッケージがインストールされます。 Dockerfile を直接編集することも可能です。
-
scripts : VSCode のコマンドに使われているスクリプト類です。編集された場合はサポート対象外となります。
-
swu : mkswu のためのテンプレートとコンテナのコンフィグファイルがあります。 shell_app または python_app のディレクトリの内容はそのまま SWU に組み込まれます。その中の etc/atmark/containers/shell_app.conf または python_app.conf に使われているボリュームやデバイス等が記載されていますので必要な場合に編集してください。
デフォルトのコンテナコンフィグでは app の src/main.sh または Python の場合に src/main.py を実行しますので、リネームが必要な場合にコンテナのコンフィグも修正してください。 このサンプルアプリケーションは、CPU と SOC の温度を /vol_data/log/temp.txt に出力し、
LED3 を点滅させます。 プロジェクトディレクトリに入っている config/ssh_config ファイルを編集して
IP アドレスを書き換えてください。 |
Armadillo の IP アドレスに置き換えてください。
|
VSCode の左ペインの [my_project] から [App run on Armadillo] を実行すると、
アプリケーションが Armadillo へ転送されて起動します。 VSCode のターミナルに以下のメッセージが表示されることがあります。
これが表示された場合は yes と入力して下さい。 アプリケーションを終了するには VSCode の左ペインの [my_project] から [App stop on Armadillo] を実行してください。 ここでは完成したアプリケーションをリリース版としてビルドする場合の手順について説明します。 VSCode の左ペインの [my_project] から [Generate release swu] を実行すると、
リリース版のアプリケーションを含んだ SWU イメージが作成されます。
事前に 「SWUイメージの作成」 を参照して SWU の初期設定を行ってください。 作成した SWU イメージは my_project/swu ディレクトリ下に release.swu というファイル名で保存されています。 この SWU イメージを 「イメージのインストール」 を参照して Armadillo へインストールすると、
Armadillo 起動時にアプリケーションも自動起動します。 10.3. VSCode を使用して Armadillo のセットアップを行うここでは VSCode を使用した Armadillo のセットアップ方法を紹介します。
VSCode を使用して以下のセットアップを行うことができます。 -
initial_setup.swu の作成
-
有線・無線 LAN を設定するための SWU ファイルの作成
-
at-debian-image と alpine のコンテナイメージをインストールするための SWU ファイルの作成
ここでは、ATDE 上でのセットアップ手順について説明します。
ATDE をお使いでない場合は、先に 「ATDEのセットアップ」 を参照して ATDE のセットアップを完了してください。 ATDE のバージョン v20230123 以上には、 VSCode がインストール済みのため新規にインストールする必要はありませんが、
使用する前には最新版へのアップデートを行ってください。 VSCode を起動するには code コマンドを実行します。 | |
---|
VSCode を起動すると、日本語化エクステンションのインストールを提案してくることがあります。
その時に表示されるダイアログに従ってインストールを行うと VSCode を日本語化できます。 |
10.3.1.2. VSCode に開発用エクステンションをインストールするVSCode 上でアプリケーションを開発するためのエクステンションをインストールします。 エクステンションはマーケットプレイスからインストールすることができます。
VSCode を起動し、左サイドバーのエクステンションを選択して、検索フォームに「abos」と入力してください。 表示された「Armadillo Base OS Development Environment」の 「Install」ボタンを押すとインストールは完了します。 VSCode の左ペインの [G4/X2] から [Armadillo Setup New Project] を実行し、表示されるディレクトリ選択画面からプロジェクトを保存する
ディレクトリを選択してください。実行するためには右に表示されている三角形ボタンを押してください。
保存先を選択すると、プロジェクト名を入力するダイアログが表示されるので、任意のプロジェクト名を入力してエンターキーを押してください。
ここでは、ホームディレクトリ直下に my_project として保存しています。 プロジェクト作成後、プロジェクトディレクトリへ移動して VSCode を起動してください。 10.3.2. initial_setup.swu の作成initial_setup.swu ファイルの作成を行います。
VSCode の左ペインの [my_project] から [Generate initial setup swu] を実行すると、
initial_setup.swu が作成されます。
これまでに mkswu --init コマンドを実行したことがない場合、VSCode のターミナル上で
各種設定の入力を求められます。
入力する設定の内容は 「SWUイメージの作成」 を参照してください。
ファイルは my_project/initial_setup/initial_setup.swu に保存されています。
この SWU イメージを 「イメージのインストール」 を参照して Armadillo へインストールしてください。 ここでは、有線・無線 LAN の設定ファイルの編集を VSCode 上で行い、編集後の設定ファイルを
SWU ファイルで Armadillo へインストールするための手順を説明します。 有線 LAN の設定を行うには、my_project/network_setup/conf/wired_connection.nmconnection を編集します。 |
固定 IP アドレスにする場合は manual に変更してください。設定例はコメントアウトしてある箇所を参考にしてください。
|
無線 LAN の設定を行うには、my_project/network_setup/conf/wifi_connection.nmconnection を編集します。 |
接続する AP の SSID を設定してください。
| |
AP に接続するためのパスフレーズを設定してください。
| |
固定 IP アドレスにする場合は manual に変更してください。設定例はコメントアウトしてある箇所を参考にしてください。
|
10.3.3.3. インストール用の SWU ファイルを作成するLAN の設定を Armadillo にインストールするための SWU ファイルを作成します。
VSCode の左ペインの [my_project] から、有線の場合は [Generate wired connection setup swu] を、
無線の場合は [Generate wifi connection setup swu] を実行してください。 それぞれ、my_project/network_setup/wired_connection.swu または my_project/network_setup/wifi_connection.swu に保存されています。
この SWU イメージを 「イメージのインストール」 を参照して Armadillo へインストールしてください。 10.3.4. コンテナイメージインストール用の SWU ファイルの作成ここでは、Armadillo へコンテナイメージをインストールするための SWU ファイルの作成手順について説明します。
インストールするコンテナイメージは、alpine と アットマークテクノが提供するコンテナイメージである at-debian-image の 2 種類です。 10.3.4.1. alpine のコンテナイメージをインストールするVSCode の左ペインの [my_project] から [Generate alpine container setup swu] を実行してください。 作成した SWU ファイルは container_setup/alpine/alpine.swu に保存されています。
この SWU イメージを 「イメージのインストール」 を参照して Armadillo へインストールしてください。 10.3.4.2. at-debian-image のコンテナイメージをインストールするVSCode の左ペインの [my_project] から [Generate at-debian-image container setup swu] を実行してください。 作成した SWU ファイルは container_setup/at-debian-image/at-debian-image.swu に保存されています。
この SWU イメージを 「イメージのインストール」 を参照して Armadillo へインストールしてください。 10.4.1. Podman - コンテナ仮想化ソフトウェア10.4.1.1. Podman - コンテナ仮想化ソフトウェアとはコンテナとはホスト OS 上に展開される仮想的なユーザ空間のことです。
コンテナを使用することで複数の Armadillo-X2 でも同一の環境がすぐに再現できます。
ゲスト OS を必要としない仮想化であるため、アプリケーションの起動が素早いという特徴があります。 Podman とはこのようなコンテナを管理するためのソフトウェアであり、使用方法は
コンテナ管理ソフトウェアの 1 つである Docker と互換性があります。 この章では、コンテナ仮想化ソフトウェアの 1 つである Podman の基本的な使い方について説明します。
Armadillo-X2 で実行させたいアプリケーションとその実行環境自体を 1 つの Podman イメージとして扱うことで、
複数の Armadillo-X2 がある場合でも、全てのボード上で同一の環境を再現させることが可能となります。 この章全体を通して、イメージの公開・共有サービスである Docker Hub から取得した、Alpine Linux のイメージを
使って説明します。 10.4.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 images コマンドで確認できます。 podman images コマンドの詳細は --help オプションで確認できます。 作成済みコンテナ一覧を表示するためには 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.4.2.7. コンテナの自動作成やアップデート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 オプションで確認できます。 [armadillo ~]# 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 に保存する方法」 を参照してください。
|
10.4.2.10. コンテナとコンテナに関連するデータを削除するabos-ctrl container-clear を使用すると、コンテナ、コンテナイメージ、コンテナに関するデータを削除することができます。
| |
---|
全てのコンテナとコンテナイメージ、コンテナに関するデータが削除されるため、充分に注意して使用してください。 |
abos-ctrl container-clear は以下の通り動作します。
実行中のコンテナに接続し、コンテナ内で指定したコマンドを実行するには 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.4.2.13. 開発時に有用な—privilegedオプションコンテナに、全権限と全てのデバイスへのアクセスを許可するオプション --privileged があります。このオプションを利用すると、コンテナに与えるべき最小の権限を洗い出す必要が無いため、開発時に有用です。 実運用の際、このオプションを利用することはセキュリティー上問題がある為、開発時にのみご利用ください。コンテナに必要な最低限の権限を与えることをおすすめします。 10.4.3. アットマークテクノが提供するイメージを使うアットマークテクノは、動作確認環境として使用できる Debian ベースのイメージを提供しています。
ここでは、Docker ファイルからイメージをビルドする方法と、すでにビルド済みのイメージを使う方法の 2 つについて説明します。 10.4.3.1. Docker ファイルからイメージをビルドするArmadillo-X2 コンテナ から
「Debian [VERSION] サンプル Dockerfile」 ファイル (at-debian-image-dockerfile-[VERSION].tar.gz) をダウンロードします。
その後 podman build コマンドを実行します。 podman images コマンドにより at-debian-image がビルドされたことが確認できます。
library/debian イメージはベースとなっている Debian イメージです。 10.4.3.2. ビルド済みのイメージを使用するArmadillo-X2 コンテナ から
「Debian [VERSION] サンプルコンテナイメージ」 ファイル (at-debian-image-[VERSION].tar) をダウンロードします。
その後 podman load コマンドを実行します。 podman images コマンドにより at-debian-image がビルドされたことが確認できます。 この章では、コンテナ内で動作するアプリケーションから GPIO や I2C などの入出力デバイスを扱う方法について示します。
基本的に、コンテナ内のアプリケーションからホスト OS 側のデバイスへアクセスすることはできません。
このため、コンテナ内のアプリケーションからデバイスを扱うためには、コンテナ作成時に扱いたいデバイスを指定する必要があります。
ここで示す方法は、扱いたいデバイスに関するデバイスツリーファイルが適切に設定されていることを前提としています。
デバイスツリーファイルを設定していない場合は、適切に設定してください。 コンテナ内で動作するアプリケーションから 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 コマンドを使ってスレーブアドレスを確認することができます。 コンテナ内で動作するアプリケーションから SPI を扱うためには、Podman のイメージからコンテナを作成する際にホスト OS 側の
デバイスファイル /dev/spidevN.N を渡す必要があります。以下は、/dev/spidev1.0 を渡して alpine イメージからコンテナを作成する例です。 コンテナ内に入り、spi-tools に含まれる spi-config コマンドを使って現在の設定を確認することができます。 コンテナ内で動作するアプリケーションから CAN 通信を行うためには、
Podman のイメージからコンテナを作成する際に、コンテナを実行するネットワークとして host を、
権限として NET_ADMIN を指定する必要があります。
以下は、ネットワークとして host を、権限として NET_ADMIN を指定して alpine イメージからコンテナを作成する例です。 コンテナ内に入り、ip コマンドで CAN を有効にすることができます。
以下に、設定例を示します。 |
CAN の設定のために必要な iproute2 をインストールします。すでにインストール済みの場合は不要です。
| |
CAN の通信速度を 125000 kbps に設定します。
| |
can0 インターフェースを起動します。
| |
can0 インターフェースの現在の使用状況を表示します。
|
コンテナ内で動作するアプリケーションから PWM を扱うためには、
Podman のイメージからコンテナを作成する際にホスト OS 側の /sys ディレクトリを渡す必要があります。デフォルト状態でもマウントされてますが、読み取り専用になって使えませんのでご注意ください。
以下は、 /sys を渡して alpine イメージからコンテナを作成する例です。ここで渡された /sys ディレクトリは
コンテナ内の同じ /sys にマウントされます。 コンテナ内に入り、/sys/class/pwm/pwmchipN ディレクトリ内の export ファイルに 0 を書き込むことで扱えるようになります。
以下に、/sys/class/pwm/pwmchip2 を扱う場合の動作設定例を示します。 |
pwmchip2 を export します。
| |
周期を 1 秒にします。単位はナノ秒です。
| |
PWM の ON 時間 を 0.5 秒にします。
| |
PWM 出力を有効にします。
|
10.4.4.6. シリアルインターフェースを扱うコンテナ内で動作するアプリケーションから 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 を渡しています。 コンテナ内に入り、mount コマンドで USB メモリを /mnt にマウントし、保存されているデータを確認することができます。 コンテナ内から RTC を扱うためには、Podman のイメージからコンテナを作成する際にホスト OS 側の
デバイスファイル /dev/rtcN を渡すと同時に、RTC への時刻の設定を行うための権限も渡す必要があります。
以下は、/dev/rtc0 を渡して alpine イメージからコンテナを作成する例です。権限として SYS_TIME も渡しています。 コンテナ内に入り、hwclock コマンドで RTC の時刻表示と設定ができます。 |
RTC に設定されている現在時刻を表示します。
| |
システム時刻を 2021 年 4 月 1 日 9 時 0 分 0 秒に設定します。
| |
システム時刻を RTC に反映させます。
| |
RTC に設定されている時刻が変更されていることを確認します。
|
Armadillo-X2 に接続したスピーカーなどの音声出力デバイスへコンテナ内から音声を出力するためには、
Podman のイメージからコンテナを作成する際にホスト OS 側のデバイスファイル /dev/snd を渡す必要があります。
以下は、/dev/snd を渡して debian イメージからコンテナを作成する例です。 コンテナ内に入り、alsa-utils などのソフトウェアで音声出力を行えます。 |
alsa-utils をインストールします。
| |
alsa-utils を起動します。
| |
指定したファイル名の音声ファイルを再生します。
|
aplay の引数にある、M は音声を出力したい CARD 番号、N はデバイス番号を表しています。
CARD 番号とデバイス番号は、aplay コマンドに -l オプションを与えることで確認できます。 10.4.4.10. ユーザースイッチのイベントを取得するArmadillo-X2 にはユーザースイッチが実装されています。これらのスイッチのプッシュ/リリースイベントを取得するためには、
Podman のイメージからコンテナを作成する際にホスト OS 側の /dev/input ディレクトリを渡す必要があります。
以下は、/dev/input を渡して alpine イメージからコンテナを作成する例です。ここで渡された /dev/input ディレクトリは
コンテナ内の /dev/input にマウントされます。 コンテナ内に入り、evtest コマンドでイベントを確認できます。 |
SW1のボタン プッシュ イベントを検出したときの表示
| |
SW1のボタン リリース イベントを検出したときの表示
|
Armadillo-X2 には LED が実装されています。これらの LED を扱うためには、
Podman のイメージからコンテナを作成する際にホスト OS 側の /sys ディレクトリを渡す必要があります。
以下は、/sys を渡して alpine イメージからコンテナを作成する例です。ここで渡された /sys ディレクトリは
コンテナ内の /sys にマウントされます。 コンテナ内に入り、brightness ファイルに値を書き込むことで LED の点灯/消灯を行うことができます。
0 を書き込むと消灯、0 以外の値 (1〜255) を書き込むと点灯します。 この章では、コンテナ内から近距離通信デバイスを扱う方法について示します。 コンテナ内から Bluetooth を扱うには、コンテナ作成時にホストネットワークを使用するために、
NET_ADMIN の権限を渡す必要があります。
図10.114「Bluetooth を扱うコンテナの作成例」に、alpine イメージから Bluetooth を扱うコンテナを作成する例を示します。 コンテナ内で必要なソフトウェアをインストールして、Bluetooth を起動します。 これにより、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.4.5.3. EnOcean デバイスを扱うここでは、EnOcean デバイスが UART で接続されている場合の例を示します。
この場合、コンテナ内で動作するアプリケーションから EnOcean デバイスで通信を行うためには、
Podman のイメージからコンテナを作成する際にホスト OS 側のデバイスファイル /dev/ttymxcN のうち、
EnOcean と対応するものを渡す必要があります。
以下は、/dev/ttymxc0 を渡して alpine イメージからコンテナを作成する例です。 コンテナ内から、/dev/ttymxc0 を使って EnOcean データの送受信ができるようになります。 この章では、コンテナ内のネットワークを扱う方法について示します。 10.4.6.1. コンテナの IP アドレスを確認する基本的にコンテナの IP アドレスは Podman イメージからコンテナを作成したときに自動的に割り振られます。
コンテナに割り振られている IP アドレスはホスト OS 側からは podman inspect コマンドを用いて、以下のように確認することができます。 コンテナ内の ip コマンドを用いて確認することもできます。 10.4.6.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 のプロンプトが表示され
データベースの操作ができるようになります。 この章では、コンテナ内で動作するアプリケーションから Armadillo-X2 に接続されたディスプレイに
出力を行う方法について示します。 コンテナ内から、Wayland のコンポジタである weston を起動し画面表示を行う例を示します。
ここではアットマークテクノが提供するイメージからコンテナを作成します。
このイメージに関しては 「アットマークテクノが提供するイメージを使う」 を参照してください。 |
weston の実行に必要な環境変数を設定します。
| |
画面描画に必要なデバイスを設定します。
| |
キーボードやマウスなどを使用可能にするためのデバイスを設定します。
| |
ホスト OS 側の /run/udev をコンテナ内からマウントするように設定します。
| |
ホスト OS 側の /opt/firmware をコンテナ内からマウントするように設定します。
| |
tty を操作するための権限を設定します。
| |
weston を起動します。ここで設定する tty は add_devices の tty7 を使います。
|
次に、以下のように weston を起動します。オプションである --tty に設定する値は、
コンテナ作成時に渡した tty の数字にします。 Armadillo-X2 に接続しているディスプレイ上に、デスクトップ画面が表示されます。 アットマークテクノが提供するイメージでは、weston の設定ファイルは
/etc/xdg/weston/weston.ini に配置してあります。 |
この行でHDMIモニタに出力する画像の解像度指定を行うことができます。初期値は1920x1080です。
|
| |
---|
weston.ini で解像度を指定しない場合や、指定した解像度にモニタが対応していない場合は、モニタが対応している別な解像度に自動的に切り替わります。
その場合、意図しない解像度で描画されることがあります。
GUIアプリケーションの描画の乱れにつながる場合がありますので、予め使用するモニタに合わせて解像度を指定しておくことをお勧めします。 |
| |
---|
設定ファイルを更新するにはコンテナイメージを新しく保存することもできますが、
ボリュームを使ってこのファイルだけを更新することができます。
|
コンフィグファイルにボリュームを追加します。 weston_conf は相対パスなので /var/app/rollback/volumes/weston_conf がマウントされます。ボリュームの選択については 「コンテナの変更を保存する」 を参照ください。
| |
コンフィグをコピーします。
| |
コンテナを再起動させます。
| |
動作確認ができた後にコンフィグファイルを保存します。
|
|
コンテナの管理として、一つのコンテナで一つのアプリケーションを動かす事を推奨します。 一つのコンテナでwestonを起動して、
XDG_RUNTIME_DIRを共有することで別のコンテナでwestonを使用する
アプリケーションを起動させることは以下のコンフィグで可能です。 [armadillo ~]# vi /etc/atmark/containers/weston.conf
set_image localhost/at-debian-image:latest
add_devices /dev/dri /dev/galcore /dev/input /dev/tty7
add_volumes /run/udev:/run/udev:ro /opt/firmware:/opt/firmware:ro
add_volumes /tmp/xdg_home:/run/xdg_home
add_args --env=XDG_RUNTIME_DIR=/run/xdg_home
add_args --cap-add=SYS_TTY_CONFIG
set_command weston --tty=7
[armadillo ~]# vi /etc/atmark/containers/detect_object.conf
set_image localhost/at-debian-image:latest
add_devices /dev/galcore /dev/video3
add_volumes /opt/firmware:/opt/firmware:ro /tmp/xdg_home:/run/xdg_home
set_restart always
add_args --env=XDG_RUNTIME_DIR=/run/xdg_home
set_command /root/start_detect_object.sh
[armadillo ~]# podman_start weston
[armadillo ~]# podman_start detect_object |
westonの設定ファイルを作成します。
| |
XDG_RUNTIME_DIR を volume で共有して、同じディレクトリを使います。
| |
例としてdetect_objectという名前のクライアントの設定ファイルを作成します。ここでは任意の名前を設定できます。
| |
アプリケーションによっては、westonが異常終了した時にエラーを出力しない場合があるため、set_restart always にします。
| |
確認のためコンテナを手動で起動します。
|
アットマークテクノが提供するイメージ at-debian-image にはデフォルトで atmark ユーザが存在しています。
at-weston-launch コマンドを使うと、 root ユーザではなく atmark ユーザで weston を起動することができます。 [armadillo ~]# vi /etc/atmark/containers/weston.conf
set_image localhost/at-debian-image:latest
add_devices /dev/dri /dev/galcore /dev/input /dev/tty7
add_volumes /run/udev:/run/udev:ro /opt/firmware:/opt/firmware:ro
add_volumes /tmp/xdg_home:/run/xdg_home
add_args --env=XDG_RUNTIME_DIR=/run/xdg_home
add_args --cap-add=SYS_TTY_CONFIG
set_command at-weston-launch --tty /dev/tty7 --user atmark
[armadillo ~]# podman_start weston |
westonの設定ファイルを作成します。
| |
使用する tty として /dev/tty7 を追加します。
| |
at-weston-launch コマンドのオプションとして使用する tty とユーザ名を渡します。
| |
確認のためコンテナを手動で起動します。
|
--tty と --user を指定しなかった場合は、デフォルトで /dev/tty7 と atmark ユーザが使われます。 weston を起動する際に、--debug オプションを渡すと weston-screenshooter コマンドでスクリーンショットを
保存することができます。 [armadillo ~]# vi /etc/atmark/containers/weston.conf
set_image localhost/at-debian-image:latest
add_devices /dev/dri /dev/galcore /dev/input /dev/tty7
add_volumes /run/udev:/run/udev:ro /opt/firmware:/opt/firmware:ro
add_volumes /tmp/xdg_home:/run/xdg_home
add_args --env=XDG_RUNTIME_DIR=/run/xdg_home
add_args --cap-add=SYS_TTY_CONFIG
set_command weston --tty=7 --debug
[armadillo ~]# podman_start weston
[armadillo ~]# podman exec -it weston /bin/bash
[container ~]# weston-screenshooter
[container ~]# ls
wayland-screenshot-[date].png |
westonの設定ファイルを作成します。
| |
--debug オプションを渡します。
| |
確認のためコンテナを手動で起動します。
| |
起動した weston コンテナ内で /bin/bash を起動してログインします。
| |
weston-screenshooter コマンドを実行します。
| |
カレントディレクトリ内に wayland-screenshot-[date].png というファイル名で保存されます。
|
| |
---|
--debug オプションは開発時にのみ使用してください。正式運用時の使用は非推奨です。 |
| |
---|
Armadillo-X2 にキーボードを接続している場合は、--debug オプションを渡さなくても
Windows キー + s を押下することによりスクリーンショットを保存することができます。
この場合、スクリーンショットはコンテナ内の /proc/[weston の PID]/cwd 下に保存されます。 |
10.4.8.2. X Window System を扱うコンテナ内から、X Window System を起動し画面表示を行う例を示します。
ここではアットマークテクノが提供するイメージからコンテナを作成します。
このイメージに関しては 「アットマークテクノが提供するイメージを使う」 を参照してください。 |
X Window System に必要な tty を設定します。どこからも使われていない tty とします。
| |
画面描画先となるフレームバッファを設定します。
| |
キーボードやマウスなどを使用可能にするためのデバイスを設定します。
| |
ホスト OS 側の /run/udev をコンテナ内からマウントするように設定します。
| |
X Window System の動作に必要な権限を設定します。
|
次に、以下のように X Window System を起動します。
オプションである vt に設定する値は、コンテナ作成時に渡した tty の数字にします。 Armadillo-X2 に接続しているディスプレイ上に、デスクトップ画面が表示されます。 10.4.8.3. フレームバッファに直接描画するコンテナ内で動作するアプリケーションからフレームバッファに直接描画するためには、Podman のイメージからコンテナを作成する際にホスト OS 側の
デバイスファイル /dev/fbN を渡す必要があります。以下は、/dev/fb0 を渡して alpine イメージからコンテナを作成する例です。 コンテナ内に入って、ランダムデータをフレームバッファに描画する例を以下に示します。
これにより、接続しているディスプレイ上の表示が変化します。 タッチパネルが組み込まれているディスプレイを接続している環境で、
コンテナ内からタッチイベントを取得するためには、Podman のイメージからコンテナを作成する際に
ホスト OS 側の /dev/input を渡す必要があります。 Wayland などの GUI 環境と組み合わせて使うことで、タッチパネルを利用した GUI アプリケーションの操作が可能となります。 Armadillo-X2 で採用している i.MX 8M Plus には、動画のエンコード/デコード処理に特化した演算ユニットである
VPU (Video Processing Unit) が搭載されています。
VPU を活用することでシステム全体のパフォーマンスを落とすことなく、動画のエンコード/デコード処理を行うことができます。
コンテナ内で動作するアプリケーションから VPU を扱うためには、コンテナ作成時にデバイスとして、
/dev/mxc_hantro と /dev/mxc_hantro_vc8000e および /dev/ion を渡す必要があります。
ここではアットマークテクノが提供するイメージからコンテナを作成します。
このイメージに関しては 「アットマークテクノが提供するイメージを使う」 を参照してください。 weston と GStreamer がインストール済みのイメージと組み合わせて使うことで、
VPU を使用して動画のエンコード/デコードを行うことができます。 このようにして作成したコンテナにログインすると、
GStreamer で VPU を使用した動画のエンコード/デコードが行なえます。 USB カメラも組み合わせると、カメラからの映像をエンコードしてファイルに保存することも可能です。 上記を実行することで、USB カメラからの映像が H.264 にエンコードされてファイルに保存されます。この例ではカメラデバイスを /dev/video3 としていますが、
環境によって異なりますので適切なものを設定してください。 この章では、コンテナ内からパワーマネジメント機能を使う方法について示します。 パワーマネジメント機能を使ってサスペンド状態にするには、Podman のイメージからコンテナを作成する際に
ホスト OS 側の /sys ディレクトリを渡す必要があります。
以下は、/sys を渡して alpine イメージからコンテナを作成する例です。ここで渡された /sys ディレクトリは
コンテナ内の /sys にマウントされます。 コンテナ内から、/sys/power/state に次の文字列を書き込むことにより、サスペンド状態にすることができます。 表10.2 対応するパワーマネジメント状態 パワーマネジメント状態 | 文字列 | 説明 |
---|
Suspend-to-RAM
| mem
| 最も消費電力を抑えることができる | Suspend-to-Idle
| freeze
| 最も短時間で復帰することができる |
サスペンド状態から起床要因として、利用可能なデバイスを以下に示します。 -
UART2 (console)
-
起床要因
-
データ受信
-
有効化
[container ~]# echo enabled > /sys/bus/platform/drivers/imx-uart/30890000.serial/tty/ttymxc1/power/wakeup
-
USB
-
起床要因
-
USBデバイスの挿抜
-
有効化
[container ~]# echo enabled > /sys/bus/platform/devices/32f10108.usb/power/wakeup
-
RTC(i.MX8MP)
| |
---|
RV-8803-C7は、毎分 0 秒にしかアラーム割り込みを発生させることができません。
0 時 0 分 30 秒の時に、1 秒後にアラームが鳴るように設定しても、
実際にアラーム割り込みが発生するのは 0 時 1 分 0 秒となります。 |
-
ユーザースイッチ
-
起床要因
-
ユーザースイッチ押下
-
有効化
[armadillo ~]# vi /boot/overlays.txt
fdt_overlays=armadillo_iotg_g4-sw1-wakeup.dtbo
[armadillo ~]# persist_file -vp /boot/overlays.txt
'/boot/overlays.txt' -> '/mnt/boot/overlays.txt'
Added "/boot/overlays.txt" to /etc/swupdate_preserve_files
[armadillo ~]# reboot
: (省略)
Applying fdt overlay: armadillo_iotg_g4-sw1-wakeup.dtbo
: (省略)
[armadillo ~]# cat /sys/devices/platform/gpio-keys/power/wakeup
enabled |
/boot/overlays.txt ファイルに「armadillo_iotg_g4-sw1-wakeup.dtbo」を追加します。
ファイルが存在しない場合は新規に作成してください。
このファイルの詳細については 「DT overlay によるカスタマイズ」 を参照してください。
| |
/boot/overlays.txt を保存し、アップデートの場合でも保存します。
| |
overlay の実行のために再起動します。
| |
シリアルコンソールの場合に、u-bootによるメッセージを確認できます。
| |
Linux からも確認できます。
|
10.4.10. コンテナからのpoweroffかrebootArmadillo Base OSはbusybox initでshutdownとrebootを対応します。 busybox initでPID 1にsignalを送ることでshutdownやrebootとなります。
コンテナからsignalを送るように、pid namespaceを共有する必要がありますが、共有されたらkillで実行できます。 この章では、コンテナ内で動作しているアプリケーションに何らかの異常が発生し停止してしまった際に、
ソフトウェアウォッチドックタイマーを使って、システムを再起動する方法について示します。 10.4.11.1. ソフトウェアウォッチドッグタイマーを扱うコンテナ内で動作するアプリケーションからソフトウェアウォッチドックタイマーを扱うためには、Podman のイメージからコンテナを作成する際にホスト OS 側の
デバイスファイル /dev/watchdogN を渡す必要があります。以下は、/dev/watchdog0 を渡して alpine イメージからコンテナを作成する例です。 ソフトウェアウォッチドックタイマーは、プログラム内からデバイスファイル /dev/watchdog0 を open した時点で起動します。
コンテナ内に入ってソフトウェアウォッチドックタイマーを echo コマンドで起動する例を以下に示します。 ソフトウェアウォッチドックタイマーを起動した後、/dev/watchdog0 に任意の文字を書き込むことで
ソフトウェアウォッチドッグタイマーをリセットすることができます。
60 秒間任意の文字の書き込みがない場合は、システムが再起動します。 ソフトウェアウォッチドックタイマーを停止したい場合は、/dev/watchdog0 に V を書き込みます。 Armadillo-X2 で採用している i.MX 8M Plus には、機械学習に特化した演算処理ユニットである
NPU (Neural Processor Unit) が搭載されています。
NPU を活用することで、顔認識や物体認識などの推論処理を高速に行うことができます。 コンテナ内で動作するアプリケーションから NPU を扱うためには、 アットマークテクノが提供するコンテナイメージである
at-debian-image を使用する必要があります。また、コンテナ作成時にデバイスとして、/dev/galcore を渡す必要があります。
以下は、/dev/galcore を渡して at-debian-image からコンテナを作成する例です。
このイメージに関しては 「アットマークテクノが提供するイメージを使う」 を参照してください。 | |
---|
i.MX 8M Plus に搭載されている NPU は INT8 で量子化された学習済みモデルを高速に推論するように設計されています。
INT8 で量子化されていないモデルの場合、正常に推論できない、または推論実行速度の低下が発生する場合があります。 |
具体的な機械学習アプリケーションの開発方法については、NXP Semiconductors の公式サイトを参照してください。 アットマークテクノからも機械学習に関する開発ガイドを公開していますので、そちらも参照してください。
Armadillo Base OS 開発ガイド。 10.4.12.1. ONNX Runtime を使うONNX Runtime は 学習済みの ONNX モデルを使って推論を行うためのソフトウェアです。[]
Armadillo-X2 では、NPU を使って ONNX Runtime を実行することができます。 at-debian-image から作成したコンテナであれば、apt install でインストールすることができます。 -
python から ONNX Runtime を使う
python から ONNX Runtime を使うためには onnxruntime モジュールを import します。
また、NPU を使うために InferenceSession オブジェクトを作成する際に、Providers として
「VsiNpuExecutionProvider」を指定します。 以上により、python から ONNX Runtime を使うことができます。 10.4.12.2. TensorFlow Lite を使うTensorFlow Lite からも NPU を使って高速に推論を行うことができます。 -
TensorFlow Lite をインストールする
at-debian-image から作成したコンテナであれば、apt install でインストールすることができます。 -
python から TensorFlow Lite を使う
python から TensorFlow Lite を使うためには Interpreter モジュールを import します。
python から TensorFlow Lite を使う場合は特別な設定をしなくても、自動的に NPU が使われます。 以上により、python から TensorFlow Lite を使うことができます。 | |
---|
tflite-runtime パッケージと、ライブラリイメージ(imx_lib)のバージョンの組み合わせによっては、使用する delegate と ライブラリの整合性が取れずに TensorFlow Liteを用いたアプリケーションが正しく動作しない場合があります。 バージョン 2.6.0-1 以降の tflite-runtime パッケージを使用する際には、必ずバージョン 2.2.0 以降のライブラリイメージ(imx_lib)を使用してください。 ライブラリイメージのアップデート方法については「VPU や NPU を使用する」を参照してください。 それぞれのバージョンと動作の関係を表10.3「ライブラリと tflite-runtime のバージョンと NPU を用いたアプリケーションの動作の関係」に示します。 表10.3 ライブラリと tflite-runtime のバージョンと NPU を用いたアプリケーションの動作の関係 | tflite-runtime のバージョンが 2.6.0-1 以降 | tflite-runtime のバージョンが 2.6.0-1 未満 |
---|
ライブラリのバージョンが確認できる(2.2.0 以降) | VX delegateで動作 | NNAPI delegate で動作 | ライブラリのバージョンが確認できない(2.2.0 未満) | 正しく動作しない場合あり | NNAPI delegate で動作 |
ライブラリのバージョン確認手順については、「ライブラリイメージのバージョンを確認する」を参照してください。 tflite-runtime パッケージのバージョンは、コンテナ内で以下のコマンドを実行することで確認できます。
推奨はしませんが、 tflite-runtime のバージョンを 2.6.0-1 未満に下げたい場合は表10.4「2.6.0-1 未満の TensorFlow Lite 関連 deb パッケージ」に示す deb パッケージを全てコンテナ内にダウンロードして、図10.162「tflite-runtime のバージョンを下げる」のコマンドを実行してください。 表10.4 2.6.0-1 未満の TensorFlow Lite 関連 deb パッケージ
|
| |
---|
Arm NN はコンテナイメージ at-debian-image のバージョン 1.0.6 以降では、動作非対応となります。
現在利用中の at-debian-image のバージョンは以下のコマンドで確認できます。
|
Arm NN とは TensorFlow Lite および ONNX のモデル形式をサポートしている推論用ソフトウェアです。
Arm NN からも NPU を使って高速に推論を行うことができます。 at-debian-image から作成したコンテナであれば、apt install でインストールすることができます。 python から TensorFlow Lite を使うためには pyarmnn モジュールを import します。
また、NPU を使うために BackendId として「VsiNpu」を指定して、Optimize オブジェクトを作成します。 以上により、python から Arm NN を使うことができます。 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/platform-xhci-hcd.1.auto-usb-0:1.1:1.0-video-index1" "/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 デバイスをマウントします。
| |
マウントされたことを確認します。
|
|
ホットプラグデバイスの追加: add_hotplugs [デバイスタイプ]
コンテナ起動後に挿抜を行なっても認識される(ホットプラグ)デバイスを設定できます。 通常、コンテナ内からデバイスを扱うためには、あらかじめ Armadillo 本体に当該のデバイスを接続した状態で、コンテナを起動する必要がありますが、 add_hotplugs を使用することでホットプラグに対応できます。 例: add_hotplugs input add_hotplugs に指定できる主要な文字列とデバイスファイルの対応について、表10.5「add_hotplugsオプションに指定できる主要な文字列」に示します。
表10.5 add_hotplugsオプションに指定できる主要な文字列 文字列 | 引数の説明 | 対象のデバイスファイル |
---|
input | マウスやキーボードなどの入力デバイス | /dev/input/mouse0, /dev/input/event0 など | video4linux | USB カメラなどの video4linux デバイスファイル | /dev/video0 など | sd | USB メモリなどの SCSI ディスクデバイスファイル | /dev/sda1 など |
表10.5「add_hotplugsオプションに指定できる主要な文字列」に示した文字列の他にも、/proc/devicesの数字から始まる行に記載されている文字列を指定することができます。
図10.168「/proc/devicesの内容例」に示す状態の場合、デバイスタイプを示す文字列としては、各行の先頭の数字を除いた mem や pty などを指定できることがわかります。
デバイスタイプと実際のデバイスファイルの対応については、 カーネルドキュメント: devices.txt(Github) を参照してください。 複数のデバイスタイプを指定したい場合はスペースで分けて設定してください。 例: add_hotplugs input video4linux sd
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_init no
コンテナのメインプロセスが PID 1 で起動していますが、その場合のデフォルトの信号の扱いが変わります: SIGTERM などのデフォルトハンドラが無効です。 そのため、init 以外のコマンドを set_command で設定する場合は podman-init のプロセスを PID 1 として立ち上げて、設定したコマンドをその子プロセスとして起動します。 例: set_init 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.5.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.5.5.2. イメージを eMMC に保存する方法Armadillo Base OS のデフォルトでは、Podman のデータは tmpfs に保存されます。 起動時にコンテナを起動するにはイメージを eMMC に書き込む必要があります。
開発が終わって運用の場合は 「イメージを SWUpdate で転送する方法」 でコンテナのイメージを転送します。この場合は読み取り専用の app パーティションのサブボリュームに展開します。 開発の時に以下の abos-ctrl podman-rw か abos-ctrl podman-storage --disk のコマンドを使って直接にイメージを編集することができます。 | |
---|
ここで紹介する内容はコンテナのイメージの管理の説明です。データベース等のコンテナから書き込みが必要な場合には 「コンテナの変更を保存する」 にあるボリュームの説明を参照してください。 |
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)になりました。
|
| |
---|
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 を設定することで自動実行されません。 |
10.5.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 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 を作成しました
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 を作成しました。
10.6.1. GStreamer - マルチメディアフレームワーク10.6.1.1. GStreamer - マルチメディアフレームワークとはGStreamer は、オープンソースのマルチメディアフレームワークです。小さなコアライブラリに様々
な機能をプラグインとして追加できるようになっており、多彩な形式のデータを扱うことができます。
GStreamer で扱うことができるデータフォーマットの一例を下記に示します。 -
コンテナフォーマット: mp4, avi, mpeg-ps/ts, mkv/webm, ogg
-
動画コーデック: H.264/AVC, VP8, VP9
-
音声コーデック: AAC, MP3, Theora, wav
-
画像フォーマット: JPEG, PNG, BMP
-
ストリーミング: http, rtp
GStreamer では、マルチメディアデータをストリームとして扱います。
ストリームを流すパイプラインの中に、エレメントと呼ばれる処理単位を格納し、
それらを繋ぎ合わせることで、デコードやエンコードなどの処理を行います。 10.6.2. GStreamer 実行用コンテナを作成するこの章における GStreamer の実行例はアットマークテクノが提供する
debian イメージから作成したコンテナ内で実行することを想定しています。
ここではアットマークテクノが提供するイメージからコンテナを作成します。
このイメージに関しては 「アットマークテクノが提供するイメージを使う」 を参照してください。 コンテナ内では最初に GStreamer をインストールします。 次に、コンテナ内で画面表示を行うためのデスクトップ環境を起動します。
ここでは weston を起動します。 --tty=7 のオプションは画面表示に使用する tty の値を設定してください。 次に、音声を出力するのに必要な pulseaudio を起動します。 以上により、GSreamer をコンテナ内で実行できるようになります。 10.6.3. GStreamer パイプラインの実行例パイプラインの実行例を以下に示します。 GStreamer のパイプラインは、シェルスクリプトのパイプ構文の構造に似ています。GStreamer の
各エレメントとシェルスクリプト内のコマンドを対比することができます。構文的な違いとして、
GStreamer のパイプラインは「!」を使って各エレメントを繋ぎますが、シェルスクリプトは「|」を使います。 上記例は、GStreamer のデバッグ/プロトタイピング用のコマンドラインツールである gst-launch-1.0
を使って説明しましたが、GStreamer はライブラリとして提供されているため、GStreamer を使った
マルチメディア機能を自作のアプリケーションプログラムに組み込むことができます。API や
アプリケーション開発マニュアルは、gstreamer.freedesktop.org の Documentation ページ
(http://gstreamer.freedesktop.org/documentation/)から参照することができます。 Armadillo-X2が採用している SoC である i.MX 8M Plus は、動画のデコード/エンコードを行うための Video Processing Unit(VPU) と呼ばれる
専用プロセッサを搭載しています。Armadillo-X2には、この VPU を使用するための GStreamer エレメントがインストールされており、
以下の動画コーデックではメイン CPU のパフォーマンスを落とすことなく動画のデコード/エンコードが行なえます。
デコード可能なコーデック
エンコード可能なコーデック
以降の章では、これらのコーデックに対する GStreamer の実行例を紹介します。 上記で挙げたコーデック以外のものであってもデコード/エンコードは可能ですが、その場合は CPU を使ったソフトウェア処理となってしまうため、
システム全体のパフォーマンスは低下します。 GStreamer を使用して動画を再生するための実行例を、音声を含んでいる動画と含んでいない動画の 2 通りについて示します。
VPU でハードウェアデコードを行う GStreamer エレメントとして vpudec を使うことができます。 10.6.4.1. H.264/AVC 動画を再生するGStreamer を使用してネットワーク上にある動画ファイルを HTTP 及び RTSP でストリーミング再生する実行例を示します。
VPU でハードウェアデコードを行う GStreamer エレメントとして vpudec を使うことができます。 10.6.6. USB カメラからの映像を表示するGStreamer の v4l2src エレメントを使うことで、V4L2(Video for Linux 2) デバイスとして実装されているカメラデバイスから映像を取得できます。
どのデバイスから映像を取得するかは、v4l2src エレメントの device プロパティにデバイスファイル名を指定することで変更できます。
UVC 対応 USB カメラなども同様に v4l2src で扱うことができるので、ここでは USB カメラからの映像を表示する実行例を示します。 加えて、カメラの他にマイクも接続していて、同時にマイクからの音声も出力する場合の例も示しています。
実行例中のデバイスファイル /dev/video1 の部分や、縦横サイズである width や height の値は実行する環境によって異なる可能性がありますので、適宜変更してください。
また、/dev/v4l/by-id ディレクトリの下に、接続しているカメラ名の付いた /dev/videoN へのシンボリックリンクがありますので、デバイスとしてそれを指定することも可能です。 GStreamer の v4l2src エレメントを使うことで、V4L2(Video for Linux 2) デバイスとして実装されているカメラデバイスから映像を取得できます。
どのデバイスから映像を取得するかは、v4l2src エレメントの device プロパティにデバイスファイル名を指定することで変更できます。
UVC 対応 USB カメラなども同様に v4l2src で扱うことができるので、ここでは USB カメラからの映像をファイルへ保存する実行例と、
映像を表示しながら同時にファイルへ保存する実行例を示します。 加えて、カメラの他にマイクも接続していて、映像の保存と同時にマイクからの音声も MP3 へエンコードして保存する場合の例も示しています。
実行例中のデバイスファイル /dev/video1 の部分や、縦横サイズである width や height の値は実行する環境によって異なる可能性がありますので、適宜変更してください。
また、/dev/v4l/by-id ディレクトリの下に、接続しているカメラ名の付いた /dev/videoN へのシンボリックリンクがありますので、デバイスとしてそれを指定することも可能です。 パイプライン停止時に EOS イベントを発行するように、gst-launch-1.0 コマンドに-e オプションを付けています。
エンコードを終了するには、Ctrl-C で gst-launch-1.0 コマンドを停止してください。 10.6.7.1. H.264/AVC で録画するVPU でハードウェアエンコードを行う GStreamer エレメントとして vpuenc_h264 を使うことができます。 10.6.8. Video Processing Unit(VPU)10.6.8.1. Video Processing Unit とはVideo Processing Unit(以下、VPU) とは i.MX 8M Plus に搭載されている、動画のエンコード/デコード処理専用のプロセッサです。
動画のエンコード/デコード処理は、システムに負荷をかけることが多く、メイン CPU で処理を行うとシステム全体のパフォーマンスが低下します。
VPU を利用することでシステム全体のパフォーマンスを落とすことなく、動画のエンコード/デコード処理を行うことができます。 VPU が対応しているフォーマットは以下の通りです。
デコーダーが対応しているフォーマット
エンコーダが対応しているフォーマット
表10.6 H.264/AVC デコーダー仕様 Profile | High、Main、Baseline | Min resolution | 48x48 | Max resolution | 1920x1080 | Frame rate | 60 fps | Bitrate | 60 Mbps |
表10.7 VP8 デコーダー仕様 Profile | - | Min resolution | 48x48 | Max resolution | 1920x1080 | Frame rate | 60 fps | Bitrate | 60 Mbps |
表10.8 VP9 デコーダー仕様 Profile | Profile 0, 2 | Min resolution | 72x72 | Max resolution | 1920x1080 | Frame rate | 60 fps | Bitrate | 100 Mbps |
表10.9 H.264/AVC エンコーダー仕様 Profiles | Baseline、Main、High、High 10 | Maximum Luma pixel sample rate | 1920x1080 @ 60 fps | Slices | I, P and B slices | Frame Types | Progressive | Entropy encoding | CABAC、CAVLC | Error resilience | Slices | Maximum MV range | Horizontal (P slice) in pixels: +/-139
Horizontal (B slice) in pixels: +/-75
Vertical (P or B slice) in pixels:
-
Config1: +/-13 (planned)
-
Config2: +/-21
-
Config3: +/-29 (planned)
-
Config4: +/-45 (planned)
-
Config5: +/-61 (planned)
(= Search Window Size -3 pixels) | MV accuracy | 1/4 pixel | Supported block sizes | Macroblock and sub-macroblock partitions:
-
Intra PU: 16x16 / 8x8 / 4x4
-
Inter PU: 16x16 / 8x16 / 16x8
-
TU: 4x4 and 8x8 transforms
| Intra-prediction modes | 16x16: 4 modes
8x8: 9 modes
4x4: 9 modes | Maximum number of reference frames | 2 | Encoding picture type | Only progressive frame | IPCM encoding | Supported | Temporal scalable video coding | Up to 5 layers including the base layer | IPCM | IPCM rectangle mode | ROI / ROI_map | Absolute QP and qpoffset mode (-32 〜 31)
User controllable CU coded as IPCM CU or skip CU |
10.7. Armadilloのソフトウェアをビルドするここでは、Armadillo-X2で使用するソフトウェアのビルド方法を説明します。 ここでは、Armadillo-X2向けのブートローダーイメージをビルドする方法を説明します。
ブートローダーのビルドに必要なパッケージのインストール
次のコマンドを実行します。 [ATDE ~]$ sudo apt install build-essential git wget gcc-aarch64-linux-gnu libgcc-*-dev-arm64-cross bison flex zlib1g-dev bash python3-pycryptodome python3-pyelftools device-tree-compiler
ソースコードの取得
Armadillo-X2 ブートローダー から
「ブートローダー ソース」ファイル (imx-boot-[VERSION].tar.gz) を次のようにダウンロードします。 [ATDE ~]$ wget https://download.atmark-techno.com/armadillo-x2/bootloader/imx-boot-[VERSION].tar.gz
[ATDE ~]$ tar xf imx-boot-[VERSION].tar.gz
[ATDE ~]$ cd imx-boot-[VERSION]
ビルド
次のコマンドを実行します。 [ATDE ~/imx-boot-[VERSION]]$ make imx-boot_armadillo_x2
:
: (省略)
:
Second Loader IMAGE:
sld_header_off 0x58000
sld_csf_off 0x59020
sld hab block: 0x401fcdc0 0x58000 0x1020
make[1]: ディレクトリ '/home/atmark/imx-boot-[VERSION]/imx-mkimage' から出ます
cp imx-mkimage/iMX8M/flash.bin imx-boot_armadillo_x2 初めてのビルドの場合、i.MX 8M Plusに必要なファームウェアの EULA
への同意を求められます。
内容を確認の上、同意してご利用ください。[] Welcome to NXP firmware-imx-8.11.bin
You need to read and accept the EULA before you can continue.
LA_OPT_NXP_Software_License v19 February 2021
:
: (省略)
:
Do you accept the EULA you just read? (y/N)
インストール
ビルドしたブートローダーは、以下に示すどちらかの方法でインストールしてください。
swupdate でインストールする
mkswu の初期化を行った後に 提供されているスクリプトを使ってSWUイメージを作成してください。 [ATDE ~/imx-boot-[VERSION]]$ echo 'swdesc_boot imx-boot_armadillo_x2' > boot.desc
[ATDE ~/imx-boot-[VERSION]]$ mkswu boot.desc
boot.swu を作成しました。 作成された boot.swu のインストールについては 「イメージのインストール」 を参照ください。
「ブートディスクの作成」 でインストールする
手順を参考にして、ビルドされた imx-boot_armadillo_x2 を使ってください。
ここでは、Armadillo-X2向けのLinuxカーネルイメージをビルドする方法を説明します。 | |
---|
Armadillo-X2では、
基本的にはLinuxカーネルイメージをビルドする必要はありません。
「Alpine Linux ルートファイルシステムをビルドする」の手順を実施することで、
標準のLinuxカーネルイメージがルートファイルシステムに組み込まれます。 標準のLinuxカーネルイメージは、アットマークテクノが提供する
linux-at というAlpine Linux用のパッケージに含まれています。 カスタマイズしたLinuxカーネルイメージを利用する場合は、
以下に示す手順を参照してください。 |
Linuxカーネルのビルドに必要なパッケージのインストール
次のコマンドを実行します。 [ATDE ~]$ sudo apt update
[ATDE ~]$ sudo apt install crossbuild-essential-arm64 bison flex python3-pycryptodome python3-pyelftools zlib1g-dev libssl-dev bc firmware-misc-nonfree wireless-regdb atmark-firmware
ソースコードの取得
Armadillo-X2 Linuxカーネル から
「Linuxカーネル」ファイル (linux-at-[VERSION].tar) をダウンロードして、次のコマンドを実行します。 [ATDE ~]$ tar xf linux-at-[VERSION].tar
[ATDE ~]$ tar xf linux-at-[VERSION]/linux-[VERSION].tar.gz
[ATDE ~]$ cd linux-[VERSION]
デフォルトコンフィギュレーションの適用
次のコマンドを実行します。 [ATDE ~/linux-[VERSION]]$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- x2_defconfig
カーネルコンフィギュレーションの変更
次のコマンドを実行します。
カーネルコンフィギュレーションの変更を行わない場合はこの手順は不要です。 [ATDE ~]$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig コマンドを実行するとカーネルコンフィギュレーション設定画面が表示されます。
カーネルコンフィギュレーションを変更後、"Exit"を選択して
「Do you wish to save your new kernel configuration? (Press <ESC><ESC> to continue kernel configuration.)」で"Yes"とし、
カーネルコンフィギュレーションを確定します。 .config - Linux/arm64 5.10.86 Kernel Configuration
─────────────────────────────────────────────
┌────────── Linux/arm64 5.10.86 Kernel Configuration ───────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty submenus │
│ ----). Highlighted letters are hotkeys. Pressing <Y> includes, <N> excludes, <M>│
│ modularizes features. Press <Esc><Esc> to exit, <?> for Help, </> for Search. │
│ Legend: [*] built-in [ ] excluded <M> module < > module capable │
│ ┌───────────────────────────────────────┐ │
│ │ General setup ---> │ │
│ │ [*] Support DMA zone │ │
│ │ [*] Support DMA32 zone │ │
│ │ Platform selection ---> │ │
│ │ Kernel Features ---> │ │
│ │ Boot options ---> │ │
│ │ Power management options ---> │ │
│ │ CPU Power Management ---> │ │
│ │ Firmware Drivers ---> │ │
│ │ [ ] Virtualization ---- │ │
│ │ -*- ARM64 Accelerated Cryptographic Algorithms ---> │ │
│ │ General architecture-dependent options ---> │ │
│ │ [*] Enable loadable module support ---> │ │
│ │ [*] Enable the block layer ---> │ │
│ │ IO Schedulers ---> │ │
│ │ Executable file formats ---> │ │
│ │ Memory Management options ---> │ │
│ │ [*] Networking support ---> │ │
│ │ Device Drivers ---> │ │
│ │ File systems ---> │ │
│ │ Security options ---> │ │
│ │ -*- Cryptographic API ---> │ │
│ │ Library routines ---> │ │
│ │ Kernel hacking ---> │ │
│ │ │ │
│ └───────────────────────────────────────┘ │
├──────────────────────────────────────────┤
│ <Select> < Exit > < Help > < Save > < Load > │
└──────────────────────────────────────────┘ | |
---|
Linux Kernel Configuration メニューで"/"キーを押下すると、カーネルコンフィギュレーションの検索を行うことができます。
カーネルコンフィギュレーションのシンボル名(の一部)を入力して"Ok"を選択すると、
部分一致するシンボル名を持つカーネルコンフィギュレーションの情報が一覧されます。 |
ビルド
次のコマンドを実行します。 [ATDE ~/linux-[VERSION]]$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j5
インストール
ビルドしたカーネルは、以下に示すどちらかの方法でインストールしてください。
swupdate でインストールする
mkswu の初期化を行った後に 提供されているスクリプトを使ってSWUイメージを作成してください。
作成された kernel.swu のインストールについては 「イメージのインストール」 を参照ください。
build_rootfs で新しいルートファイルシステムをビルドする場合は build_rootfs を展開した後に以下のコマンドでインストールしてください。
|
build_rootfs のディレクトリ名を設定します。これによって、長いディレクトリ名を何度も入力する必要が無くなります。
| |
アットマークテクノが提供するカーネルをインストールしない様に、 linux-at-x2@atmark と記載された行を削除します。
| |
別のカーネルをすでにインストールしている場合は、新しいモジュールをインストールする前に古いモジュールを削除する必要があります。
|
10.7.3. Alpine Linux ルートファイルシステムをビルドするここでは、alpine/build-rootfsを使って、
Alpine Linux ルートファイルシステムを構築する方法を説明します。 alpine/build-rootfsはATDEで動作しているLinux上でArmadillo-X2用の
aarch64アーキテクチャに対応したAlpine Linux
ルートファイルシステムを構築することができるツールです。
ルートファイルシステムのビルドに必要な Podman のインストール
次のコマンドを実行します。 [ATDE ~]$ sudo apt install podman btrfs-progs xxhash
alpine/build-rootfsの入手
Armadillo-X2 開発用ツール から
「Alpine Linuxルートファイルシステムビルドツール」 ファイル (build-rootfs-[VERSION].tar.gz) を次のようにダウンロードします。 [ATDE ~/]$ wget https://download.atmark-techno.com/armadillo-x2/tool/build-rootfs-latest.tar.gz
[ATDE ~/]$ tar xf build-rootfs-latest.tar.gz
[ATDE ~/]$ cd build-rootfs-[VERSION]
Alpine Linux ルートファイルシステムの変更
ax2ディレクトリ以下のファイルを変更することで、
ルートファイルシステムをカスタマイズすることができます。 | |
---|
commonとax2 ディレクトリ直下にあるfixupやpackagesなどの同名ファイルは、それぞれのファイルを連結して利用されます。パッケージの削除などを行う場合は、commonディレクトリ以下のファイルも確認してください。 commonとax2内のサブディレクトリにある同名ファイルは、ax2のファイルが利用されます。 |
build-rootfsに含まれるファイルの説明は次の通りです。 表10.10 build-rootfsのファイル説明 ファイル | 説明 |
---|
ax2/resources/* | 配置したファイルやディレクトリは、そのままルートファイルシステム直下にコピーされます。
ファイルを追加する場合は、このディレクトリに入れてください。 | ax2/packages | このファイルに記載されているパッケージはルートファイルシステムにインストールされます。
パッケージを追加する場合はこのファイルに追加してください。 | ax2/fixup | このファイルに記載されているコマンドはパッケージのインストールが完了した後に実行されます。 | ax2/image_firstboot/* | 配置したファイルやディレクトリは、「ブートディスクの作成」や「初期化インストールディスクの作成」の手順
のようにブートディスクイメージを作成する際、そのままルートファイルシステム直下にコピーされます。 | ax2/image_installer/* | 配置したファイルやディレクトリは、「初期化インストールディスクの作成」の手順
のようにインストールディスクイメージを作成する際、
そのままインストーラーにコピーされます。ルートファイルシステムに影響はありません。 | ax2/image_common/* | 配置したファイルやディレクトリは、ブートディスクイメージおよびインストールディスクイメージを
作成する際、ルートファイルシステム、インストーラにそれぞれコピーされます。 |
| |
---|
利用可能なパッケージは以下のページで検索することができます。 Alpine Linuxルートファイルシステムを起動している
Armadilloでも検索することができます。 [armadillo ~]# apk update
[armadillo ~]# apk search ruby
ruby-test-unit-rr-1.0.5-r0
ruby-rmagick-5.1.0-r0
ruby-public_suffix-5.0.0-r0
:
: (省略)
:
ruby-mustache-1.1.1-r5
ruby-nokogiri-1.13.10-r0 |
ビルド
次のコマンドを実行します。 パッケージをインターネット上から取得するため回線速度に依存しますが、
ビルドには数分かかります。 [ATDE ~/build-rootfs-[VERSION]]$ sudo ./build_rootfs.sh
use default(board=ax2)
use default(arch=aarch64)
use default(outdir=/home/xxxx/at-optee-build/build-rootfs)
use default(output=baseos-x2-ATVERSION.tar.zst)
'repositories' -> '/etc/apk/repositories'
:
: (略)
:
> Creating rootfs archive
-rw-r--r-- 1 root root 231700480 Nov 26 07:18 rootfs.tar
ERROR: No such package: .make-alpine-make-rootfs
============================================
footprint[byte] tarball[byte] packages
229904000 74942331 alpine-base coreutils chrony ...(省略)
============================================
done. | |
---|
リリース時にバージョンに日付を含めたくないときは --release を引数に追加してください。 |
| |
---|
インターネットに接続できない環境か、テスト済みのソフトウェアのみをインストールしたい場合は
Armadillo-IoT ゲートウェイ G4 開発用ツール から
キャッシュアーカイブもダウンロードして、
build_rootfs.sh --cache baseos-x2-[VERSION].cache.tar で使ってください。 |
| |
---|
任意のパス、ファイル名で結果を出力することもできます。 [ATDE ~/build-rootfs-[VERSION]]$ ./build_rootfs.sh ~/alpine.tar.zst
:
: (略)
:
[ATDE ~/build-rootfs-[VERSION]]$ ls ~/alpine.tar.zst
~/alpine.tar.zst |
インストール
ビルドしたルートファイルシステムは、以下に示すどちらかの方法でインストールしてください。
swupdate でインストールする
mkswu の初期化を行った後に 提供されているスクリプトを使ってSWUイメージを作成してください。 [ATDE ~/build-rootfs-[VERSION]]$ vi OS_update.desc
swdesc_tar --version base_os [VERSION] \
--preserve-attributes baseos-x2-[VERSION].tar.zst
[ATDE ~/build-rootfs-[VERSION]]$ mkswu OS_update.desc
OS_update.swu を作成しました。 作成された OS_update.swu のインストールについては 「イメージのインストール」 を参照ください。
「ブートディスクの作成」 でインストールする
手順を実行すると、ビルドされた baseos-x2-[VERSION].tar.zst が自動的に利用されます。
本章では、microSDカードから直接起動(以降「SDブート」と表記します)する手順を示します。
SDブートを活用すると、microSDカードを取り替えることでシステムイメージを変更することができます。
本章に示す手順を実行するためには、容量が8Gbyte以上のmicroSDカードを必要とします。 | |
---|
SDブートを行った場合、ブートローダーの設定は microSDカード に保存されます。 |
ブートディスクイメージのビルドします
「Alpine Linux ルートファイルシステムをビルドする」 で説明されているソースツリー alpine/build-rootfs にあるスクリプト build_image と 「ブートローダーをビルドする」 でビルドした imx-boot_armadillo_x2 を利用します。 VPU や NPU も使用する場合は、 「VPU や NPU を使用する」 で用意した imx_lib.img も組み込めます。 [PC ~/build-rootfs-[VERSION]]$ sudo ./build_image.sh \
--boot ~/imx-boot-[VERSION]/imx-boot_armadillo_x2 \
--firmware ~/at-imxlibpackage/imx_lib.img
: (省略)
[PC ~/build-rootfs-[VERSION]]$ ls baseos-x2*img
baseos-x2-[VERSION].img -
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 カードがマウントされている場合、アンマウントします。
ブートディスクイメージの書き込み
[PC ~]$ sudo dd if=~/build-rootfs-[VERSION]/baseos-x2-[VERSION].img \
of=/dev/sdb bs=1M oflag=direct status=progress microSDカードの性能にもよりますが、書き込みには5分程度かかります。
| |
---|
microSDカードのパーティション構成は次のようになっています。 表10.11 microSDカードのパーティション構成 パーティション | オフセット | サイズ | 説明 |
---|
- | 0 | 10MiB | ブートローダー | 1 | 10MiB | 300MiB | A/B アップデートのA面パーティション | 2 | 310MiB | 300MiB | A/B アップデートのB面パーティション | 3 | 610MiB | 50MiB | ログ用パーティション | 4 | 660MiB | 200MiB | ファームウェア | 5 | 860MiB | 残り | アプリケーション用パーティション |
gdiskで確認すると次のようになります。 [PC ~]$ sudo gdisk -l /dev/mmcblk1
GPT fdisk (gdisk) version 1.0.8
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Disk /dev/mmcblk1: 15319040 sectors, 7.3 GiB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 309AD967-470D-4FB2-835E-7963578102A4
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 15319006
Partitions will be aligned on 2048-sector boundaries
Total free space is 20446 sectors (10.0 MiB)
Number Start (sector) End (sector) Size Code Name
1 20480 634879 300.0 MiB 8300 rootfs_0
2 634880 1249279 300.0 MiB 8300 rootfs_1
3 1249280 1351679 50.0 MiB 8300 logs
4 1351680 1761279 200.0 MiB 8300 firm
5 1761280 15319006 6.5 GiB 8300 app |
「ブートディスクの作成」で作成したブートディスクから起動する方法を説明します。 -
Armadillo-X2に電源を投入する前に、ブートディスクをCON1(SD インターフェース)に挿入します。
また、JP1ジャンパーをショート(SDブートに設定)します。
電源を投入します。
U-Boot SPL 2020.04-at11 (Jan 19 2023 - 10:53:24 +0000)
DDRINFO: start DRAM init
DDRINFO: DRAM rate 4000MTS
DDRINFO:ddrphy calibration done
DDRINFO: ddrmix config done
Normal Boot
Trying to boot from BOOTROM
image offset 0x8000, pagesize 0x200, ivt offset 0x0
NOTICE: BL31: v2.4(release):2020.04-at10-0-ge26bfd065
NOTICE: BL31: Built : 10:54:50, Jan 19 2023
U-Boot 2020.04-at11 (Jan 19 2023 - 10:53:24 +0000)
CPU: i.MX8MP[8] rev1.1 1600 MHz (running at 1200 MHz)
CPU: Industrial temperature grade (-40C to 105C) at 47C
Model: Atmark-Techno Armadillo X2 Series
DRAM: Hold key pressed for tests: t (fast) / T (slow)
2 GiB
WDT: Started with servicing (10s timeout)
MMC: FSL_SDHC: 1, FSL_SDHC: 2
Loading Environment from MMC... *** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
BuildInfo:
- ATF e26bfd0
- U-Boot 2020.04-at11
reset cause: normal reboot
switch to partitions #0, OK
mmc1 is current device
flash target is MMC:1
Net:
Warning: ethernet@30be0000 using MAC address from ROM
eth0: ethernet@30be0000 [PRIME]
Fastboot: Normal
Saving Environment to MMC... Writing to redundant MMC(1)... OK
Normal Boot
Hit any key to stop autoboot: 0
u-boot=>
ブートディスク上のLinuxカーネルを起動します。
u-boot=> boot
10.9. Armadilloのソフトウェアの初期化microSD カードを使用し、Armadillo Base OS の初期化を行えます。 | |
---|
初期化を行っても、ファームウェアパーティション(mmcblk2p4)は変更されません。
故障が疑われる場合など、ファームウェアも初期化したい場合、
初期化してから 「VPU や NPU を使用する」 を参考にしてもう一度書き込みしてください。 |
インストールディスクは二つの種類があります: 10.9.1.1. 初期化インストールディスクの作成-
512 MB 以上の microSD カードを用意してください。
標準のインストールディスクイメージを使用する場合は、
Armadillo-X2 インストールディスクイメージ から
「Armadillo Base OS」をダウンロードしてください。
「Armadilloのソフトウェアをビルドする」 でビルドしたイメージを使用してインストールディスクを作成したい場合は、
以下のコマンドを実行して、インストールディスクイメージを作成してください。 [ATDE ~/build-rootfs-[VERSION]]$ sudo ./build_image.sh \
--firmware ~/at-imxlibpackage/imx_lib.img
: (省略)
[ATDE ~/build-rootfs-[VERSION]]$ ls baseos-x2*img
baseos-x2-[VERSION].img
[ATDE ~/build-rootfs-[VERSION]]$ sudo ./build_image.sh \
--boot ~/imx-boot-[VERSION]/imx-boot_armadillo_x2 \
--installer ./baseos-x2-[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.9.1.2. 開発が完了した Armadillo をクローンするインストールディスクの作成-
microSD カードを用意してください。Armadillo-X2 にインストールされてるソフトウェアをコピーしますので、場合によって 10GB 以上のカードが必要です。
-
初期化インストールディスクをベースとしますので、「初期化インストールディスクの作成」 でビルドした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!
-
JP1ジャンパーをショート(SDブートに設定)し、microSDカードをCON1に挿入します。
-
電源を投入すると、1分程度でeMMCのソフトウェアの初期化が完了します。
-
完了すると電源が切れます(LED4が消灯、コンソールに
reboot: Power down が表示)。
-
電源を取り外し、続いてJP1ジャンパーとmicroSDカードを外してください。
-
10秒以上待ってから再び電源を入れると、初回起動時と同じ状態になります。
10.10. ArmadilloのソフトウェアをアップデートするArmadillo-X2では、
開発・製造・運用それぞれに適した複数のソフトウェアアップデート方法を用意しています。
本章では、それぞれのソフトウェアアップデート方法について説明します。 ソフトウェアアップデートを実現するソフトウェアの概要や仕様、用語については
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に配置した公開鍵に対応する秘密鍵でアップデートを行いますので、 「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-X2 のSWUイメージを作成します。 .desc ファイルの内容は /usr/share/mkswu/examples/ のディレクトリや「mkswu の desc ファイル」を参考にしてください。
イメージをインストールする方法として以下に示すような方法があります。
もし、作成した SWU イメージのインストールに失敗する場合は、「swupdate がエラーする場合の対処」をご覧ください。
USBメモリまたはSDカードからの自動インストール
Armadillo-X2にUSBメモリを接続すると自動的にアップデートが始まります。
アップデート終了後にArmadillo-X2は自動で再起動します。 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-x2/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-X2 を複数台管理してアップデートすることができます。
「hawkBitサーバーから複数のArmadilloに配信する」を参考にしてください。
10.10.4. swupdate がエラーする場合の対処SWU イメージのインストール動作は、「SWUイメージとは」で述べたように swupdate が実行します。
mkswu で作成した SWU イメージの内容が適切でなかったり、あるいは、ストレージの空き容量が不足していたりするなど、いくつかの理由で swupdate のインストール動作が失敗することがあります。
インストールに失敗すると、swupdate は /var/log/messages にエラーメッセージのログを残しますので、エラーメッセージを見ると、エラーの内容・原因が分かります。 エラーの原因ごとに、エラーメッセージとエラーの内容および対処方法を記した FAQ ページ (https://armadillo.atmark-techno.com/faq/swupdate-troubleshooting-abos) を公開しています。
SWU イメージのインストールに失敗して対処法が分からないときは、この FAQ ページをご覧ください。 10.10.5. hawkBitサーバーから複数のArmadilloに配信するhawkBitサーバーを利用することで複数のArmadillo
のソフトウェアをまとめてアップデートすることができます。 手順は次のとおりです。
コンテナ環境の準備
Dockerを利用すると簡単にサーバーを準備できます。
Dockerの準備については https://docs.docker.com/get-docker/ を参照してください。 Dockerの準備ができたら、要件に合わせてコンテナの設定を行います。
ATDE の場合
ATDE以外の場合
-
Armadillo-X2 開発用ツール から
「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が必要な場合もあります。
| |
admin ユーザーのユーザー名を入力します。
| |
admin ユーザーのパスワードを二回入力します。
| |
追加のユーザーが必要な場合に追加できます。
| |
examples/hawkbit_register.desc で armadillo を登録する場合に作っておいてください。
詳細は 「SWU で hawkBit を登録する」 を参考にしてください。
| |
hawkbit_push_update でアップデートを CLI で扱う場合は、「Y」を入力してください。
詳細は 「hawkBit のアップデート管理を CLI で行う」 を参照してください。
| |
hawkbit_push_update でアップデートを実行する場合は、「Y」を入力してください。
| |
ここでは 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.10.5.1. hawkBit のアップデート管理を CLI で行う一つのアップデートを登録するには、hawkBit の Web UI で必要な手順が長いので CLI で行うことで
効率よく実行できます。 サーバーの設定の段階では、「mkswu」のユーザーを作成する必要があります。
作成していない場合は setup_container.sh --add-user mkswu で作成してください。 [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.10.5.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.10.6. 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-X2を再起動せずにコンテナだけを再起動させます。
-
swdesc_option POST_ACTION=poweroff : アップデート後にシャットダウンを行います。
-
swdesc_option POST_ACTION=wait : アップデート後に自動的に再起動は行われず、次回起動時にアップデートが適用されます。
-
swdesc_option POST_ACTION=reboot : デフォルトの状態に戻します。アップデートの後に再起動します。
swdesc_option NOTIFY_STARTING_CMD="command" , swdesc_option NOTIFY_SUCCESS_CMD="command" , swdesc_option NOTIFY_FAIL_CMD="command" : アップデートをインストール中、成功した場合と失敗した場合に実行されるコマンドです。
コマンドを実行する事で、アプリケーションやユーザーにアップデートを知らせることができます。 LEDで知らせる例を /usr/share/mkswu/examples/enable_notify_led.desc に用意してあります。
/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.10.6.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.10.6.3. 例: swupdate_preserve_files で Linux カーネル以外の Armadillo-X2 向けのイメージをインストールする方法Armadillo-X2 向けのアップデートイメージに Linux カーネルが含まれています。 swupdate_preserve_files を使って、以下のコマンドでインストール後に現在のカーネルをコピーして更新させないようにします。
[armadillo ~]# echo 'POST /boot' >> /etc/swupdate_preserve_files
[armadillo ~]# echo 'POST /lib/modules' >> /etc/swupdate_preserve_files
[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]$ cat example.desc
swdesc_script "$SCRIPT_DIR/examples/update_preserve_files.sh" -- \
"POST /boot" \
"POST /lib/modules" |
スクリプトの内容確認する場合は /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" |
10.10.7. swupdate_preserve_files についてextra_os のアップデートで rootfs にファイルを配置することができますが、次の OS アップデートの際に削除される可能性があります。
デフォルトでは、 /etc/atmark と、 swupdate 、 sshd やネットワークの設定を保存しますがそれ以外はコピーされてません。 そうでないファイルを更新する際には /etc/swupdate_preserve_files に記載します。「例: swupdate_preserve_files で Linux カーネル以外の Armadillo-X2 向けのイメージをインストールする方法」 を参考にしてください。 コピーのタイミングによって、以下のどれかを使用してください:
単にファイルを記載する
この場合、アップデートする前にファイルをコピーします。 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.10.9. SWUpdate と暗号化についてmkswu --init の時に暗号化を有効にする場合は AES でファイルを暗号化します。
現在使われてる SWUpdate の暗号化はコマンドやメタデータを含む sw-description ファイルは暗号化されてません。
そのため、通信の暗号化(HTTPSで送信するなど)を使うことを推奨します。 10.11. Armadillo Base OS の操作Armadillo Base OS は Alpine Linux をベースとして作られています。 このセクションでは Armadillo Base OS の機能を紹介します。 Armadillo Base OS は SWUpdate によってアップデートすることができます。 アップデートする際には、rootfs ファイルシステムにインストールされたファイルをすべて消して、アップデートの中身と /etc/swupdate_preserve_files に記載されているファイルで新しい rootfs を作ります。「swupdate_preserve_files について」 を参照してください。 アップデートでファイルを削除してしまった場合に abos-ctrl mount-old で前のシステムを read-only でマウントして、
削除されたファイルをコピーすることもできます。 10.11.2. overlayfs と persist_file についてArmadillo BaseOS ではルートファイルシステムに overlayfs を採用しています。 そのため、ファイルを変更した後 Armadillo の電源を切ると変更内容は保持されません。
開発中などに rootfs の変更内容を保持するには、変更したファイルに対して persist_file コマンドを使用します。 開発以外の時は安全のため、ソフトウェアアップデートによる更新を実行してください。
アップデート手順に関しては 「Armadilloのソフトウェアをアップデートする」 を参照してください。 rootfs の内容を変更しても、ソフトウェアアップデートを実施した際に変更した内容が保持されない可能性があります。
ソフトウェアアップデート実施後も変更内容を保持する手順に関しては 「swupdate_preserve_files について」 を参照してください。 persist_file コマンドの概要を 図10.199「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 に切り替えの際に必ずログを書きますので、調査の時に使ってください。 buttond サービスを使用することで、ボタンやキー入力をトリガーとする処理を簡単に実装できます。
/etc/atmark/buttond.conf に BUTTOND_ARGS を上書きすればその対応を無効にすることもできますし、
別のキー(SW1 など)の対応も追加できます:
10.11.4.1. SW1 の短押しと長押しの対応デフォルトを維持したままで SW1 の短押しと長押しにそれぞれの場合にコマンドを実行させます。 |
buttond の設定ファイルを編集します。この例では、短押しの場合 /tmp/shotpress に、5 秒以上の長押しの場合 /tmp/longpress に日付を出力します。
| |
設定ファイルを保存します。
| |
buttond サービスを再起動させます。ここでは再起動後短押しを 2 回、長押しを 1 回行ったとします。
| |
押された回数を確認します。
|
USB キーボードや他の入力デバイスにも対応できます。
デバイスを接続してから、 buttond でデバイス名とキーコードを確認します。
|
buttond を -vvv で冗長出力にして、すべてのデバイスを指定します。
| |
希望のキーを押すと、LEFTCTRL が三つのパスで認識されました。 一番安定する by-id のパスを控えておきます。
|
USB デバイスを外すこともありますので、-i (inotify) で管理されてる入力デバイスとして追加します。
そうしないとデバイスを外したときにbuttondが停止します。
10.11.4.3. Armadillo 起動時にのみボタンに反応する方法Armadillo 起動時にのみ、例として SW1 の長押しに反応する方法を紹介します。 /etc/local.d/boot_switch.start に稼働期間を指定した buttond を起動させる設定を記載します。
buttond が起動してから 10秒以内に SW1 を一秒以上長押しすると myapp のコンテナの親プロセスに USR1 信号を送ります(アプリケーション側で信号を受信して、デバッグモードなどに切り替える想定です)。
SW1 が Armadillo 起動前に押された場合は、buttond の起動一秒後に実行されます。 |
SW1 の入力を /dev/input/by-path/platform-gpio-keys-event ファイルの PROG1 として認識できます。
| |
buttond 起動後 10 秒経過すると終了します。
| |
SW1 を一度検知した後すぐに終了します。
| |
サービスとして動作させる必要がないため & を付けてバックグラウンド起動します。
|
10.11.5. Armadillo Base OS 側の起動スクリプト起動時に何かスクリプトを走らせるためにはコンテナとして実行することを推奨します。 「コンテナの自動起動」 を参照してください。 コンテナで実行不可能な場合に、「local」サービスを使うことができます: /etc/local.d ディレクトリに
.start ファイルを置いておくと起動時に実行されて、 .stop ファイルは終了時に実行されます。 |
スクリプトを作ります。
| |
スクリプトを実行可能にします。
| |
スクリプトを保存して、再起動します。
| |
実行されたことを確認します。
|
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 にある変数を後のファイルにも設定した場合はそのファイルの値だけが残ります。
|
主要なu-bootの環境変数を以下に示します。 表10.12 u-bootの主要な環境変数 環境変数 | 説明 | デフォルト値 |
---|
console | コンソールのデバイスノードと、UARTのボーレート等を指定します。 | ttymxc1,115200 | bootcount | 起動回数を示します。初回起動時に1となり、起動に失敗する度にインクリメントされます。ユーザーランドのbootcountサービスが起動されると、この値はクリアされます。この値が"bootlimit"を越えた場合はロールバックします。ロールバックの詳細については、「ロールバック(リカバリー)」を参照してください。 | 1 | bootlimit | "bootcount"のロールバックを行うしきい値を指定します。 | 3 | bootdelay | 保守モードに遷移するためのキー入力を待つ時間を指定します(単位:秒)。次の値は特別な意味を持ちます。
-
-1: キー入力の有無に関らず保守モードに遷移します。
-
-2: キー入力の有無に関らず保守モードに遷移しません。
| 2 | image | Linuxカーネルイメージファイルのパスです。"mmcdev"で指定されたデバイスの、"mmcpart"で指定されたパーティションのルートディレクトリからの相対パスで指定します。 | boot/Image | fdt_file | DTBファイルのパスです。"mmcdev"で指定されたデバイスの、"mmcpart"で指定されたパーティションのルートディレクトリからの相対パスで指定します。 | boot/armadillo.dtb | overlays_list | DT overlayの設定ファイルのパスです。"mmcdev"で指定されたデバイスの、"mmcpart"で指定されたパーティションのルートディレクトリからの相対パスで指定します。DT overlayの詳細については、「DT overlay によるカスタマイズ」を参照してください。 | boot/overlays.txt | mmcautodetect | mmcデバイスの自動検出機能の有効/無効を指定します。yesを指定した場合のみ、u-bootが起動されたmmcデバイスが自動的にmmcdevとして利用されます。 | yes | mmcdev | "image"や"fdt_file"で指定されたファイルが配置してあるmmcデバイスのインデックスを指定します。インデックスとmmcデバイスの対応は次の通りです。
-
1: microSD/microSDHC/microSDXC カード
-
2: eMMC
"mmcautodetect"にyesが指定されている場合は、u-bootの起動時に上書きされます。 | 2 | mmcpart | "image"や"fdt_file"で指定されたファイルが配置してある、"mmcdev"で指定されたmmcデバイスのパーティション番号を指定します。"mmcautodetect"にyesが指定されている場合は、u-bootの起動時に上書きされます。 | 1 | mmcroot | ルートファイルシステムが配置されているデバイスノードと、マウントオプションを指定します。"mmcautodetect"にyesが指定されている場合は、u-bootの起動時に上書きされます。overlayfsが正しく機能しなくなる場合があるので、roの指定は変更しないでください。 | /dev/mmcblk2p1 rootwait ro | optargs | Linuxカーネル起動時パラメータを指定します。"quiet"を削除すると、コンソールに起動ログが出力されるようになりますが、起動時間が長くなります。nokaslrを削除すると、KASLR(Kernel Adress Space Layout Randomization)が有効となり、Linuxカーネルの仮想アドレス空間がランダム化されます。 | quiet nokaslr | loadaddr | LinuxカーネルがRAMにロードされる物理アドレスを指定します。 | 0x40480000 | fdt_addr | DTBがRAMにロードされる物理アドレスを指定します。 | 0x45000000 | overlay_addr | DT overlayのワーク領域として利用されるRAMの物理アドレスを指定します。 | 0x45020000 |
10.11.7. Network Time Protocol (NTP, ネットワーク・タイム・プロトコル)Armadillo Base OS では chronyd を使っています。 デフォルトの設定(使用するサーバーなど)は /etc/chrony/conf.d/ にあり、
変更用に /etc/atmark/chrony.conf.d/ のファイルも読み込みます。
/etc/atmark/chrony.conf.d ディレクトリに /etc/chrony/conf.d/ と同じファイル名の
設定ファイルを置いておくことで、デフォルトのファイルを読まないようになります。 例えば、 NTP サーバーの設定は servers.conf に記載されてますので、変更する際はに
/etc/atmark/chrony.conf.d/servers.conf のファイルに記載します: |
コンフィグファイルを作ります。
| |
ファイルを保存します
| |
chronyd サービスを再起動します。
| |
chronyc で新しいサーバーが使用されていることを確認します。
|
10.12. Device Treeをカスタマイズするat-dtweb を利用して Device Tree をカスタマイズする方法を説明します。at-dtweb では、
Web ブラウザ上のマウス操作でDevice Tree のファイルを生成することができます。
カスタマイズの対象は拡張インターフェース(CON11)です。 10.12.1. at-dtweb のインストールATDE9 に at-dtweb パッケージをインストールします。 [ATDE ~]$ sudo apt update
[ATDE ~]$ sudo apt install at-dtweb インストール済みの場合は、以下のコマンドを実行し最新版への更新を行ってください。 [ATDE ~]$ sudo apt update
[ATDE ~]$ sudo apt upgrade
at-dtweb の起動開始
at-dtweb の起動を開始するには、デスクトップ左上のアプリケーションの「システムツール」から「at-dtweb」を選択してください。
コマンドライン上からでも、at-dtweb コマンドで起動できます。 [ATDE ~]$ at-dtweb
ボードの選択
ボードを選択します。Armadillo-X2 を選択して、「OK」をクリックします。
Linux カーネルディレクトリの選択
Linux カーネルディレクトリを選択します。コンフィギュレーション済みの Linux カーネルディレクトリを選択して、「OK」をクリックします。
at-dtweb の起動完了
at-dtweb が起動し、次のように画面が表示されます。
10.12.3. Device Tree をカスタマイズ機能の選択は、ドラッグ&ドロップで行います。画面左上の「Available features」から有効にしたい機能をドラッグし、画面右側の「Armadillo-X2」の白色に変化したピンにドロップします。例として CON11 8/10 ピンを UART3(RXD/TXD) に設定します。 | |
---|
何も機能が選択されていないピンには GPIO の機能が割り当てられます。 |
画面右側の「Armadillo-X2」にドロップして設定したピンを左クリックすると信号名が表示されます。
どのピンがどの信号に対応しているのかを確認することができます。 例として UART3(RXD/TXD) の信号名を確認します。 | |
---|
再度ピンを左クリックすると機能名の表示に戻ります。 |
いくつかの機能にプロパティを設定することができます。画面右側の「Armadillo-X2」に選択した機能を左クリックすると、画面左下の「Properties」からプロパティを選択することができます。 例としてCON11 19/27 ピンの I2C5(SCL/SDA) の clock_frequency プロパティを設定します。 設定したプロパティを確定させるには「Apply」をクリックします。 全ての機能を削除する場合は、画面右上の「Reset configuration」をクリックします。機能ごとに削除する場合は、画面右側の「Armadillo-X2」のピンを右クリックして「Remove」をクリックします。 10.12.3.5. Device Tree のファイルの生成Device Tree のファイルを生成するには、画面右上の「Save」をクリックします。 以下の画面ようなメッセージが表示されると、dtbo ファイルおよび desc ファイルの生成は完了です。 ビルドが完了するとホームディレクトリ下の mkswu/at-dtweb-Armadillo-X2
ディレクトリに、DTB overlays ファイル(dtboファイル)と desc ファイルが生成されます。
Armadillo-X2 本体に書き込む場合は、mkswu コマンドで desc ファイルから SWU イメージを生成してアップデートしてください。 [ATDE ~]$ ls ~/mkswu/at-dtweb-Armadillo-X2
armadillo_iotg_g4-at-dtweb.dtbo at-dtweb.desc.old update_preserve_files.sh
at-dtweb.desc update_overlays.sh
[ATDE ~]$ cd ~/mkswu/at-dtweb-Armadillo-X2
[ATDE ~]$ mkswu at-dtweb.desc
Enter pass phrase for /home/atmark/mkswu/swupdate.key:
at-dtweb.swu を作成しました。 |
SWU イメージを生成します。
|
SWU イメージを使ったアップデートの詳細は 「Armadilloのソフトウェアをアップデートする」 を参照してください。 10.12.4. DT overlay によるカスタマイズDevice Treeは「DT overlay」(dtbo) を使用することでも変更できます。 DT overlay を使用することで、通常の dts の更新が自動的に入りつづける状態で
dts の変更でしかできない設定を行うことができます。 /boot/overlays.txt に fdt_overlays を dtbo 名で設定することで、
u-bootが起動時にその DT overlay を通常の dtb と結合して起動します。
複数の DT overlay を使う場合は以下の例のようにスペースで別けたファイル名を記載することができます。 |
/boot/overlays.txt ファイルに「armadillo_iotg_g4-sw1-wakeup.dtbo」を追加します。
ファイルが存在しない場合は新規に作成してください。
このファイルの詳細については 「DT overlay によるカスタマイズ」 を参照してください。
| |
/boot/overlays.txt を保存し、アップデートの場合でも保存します。
| |
overlay の実行のために再起動します。
| |
シリアルコンソールの場合に、u-bootによるメッセージを確認できます。
| |
Linux からも「nousb」overlay の確認ができます。USB の regulator を無効にしたため、
USB を使えないようになりました。
| |
sw1-wakeupも有効になっていることを確認できます。
|
10.12.4.1. 提供している DT overlay以下の DT overlay を用意しています: -
armadillo_iotg_g4-nousb.dtbo: USB の電源を切ります。
-
armadillo_iotg_g4-sw1-wakeup.dtbo: SW1 の起床要因を有効にします。
-
armadillo_iotg_g4-con10-arducam.dtbo: arducam カメラを MIPI CSI-2 で接続する場合にご使用ください。
-
armadillo_iotg_g4-con10-imx219.dtbo: Raspberry Pi 向けの imx219 カメラを MIPI CSI-2 で接続する場合にご使用ください。
-
armadillo_iotg_g4-con10-ox01f10.dtbo: OMNIVISION の OX01F10 カメラを MIPI CSI-2 で接続する場合にご使用ください。
-
armadillo_iotg_g4-lte-ext-board.dtbo: LTE モデルで自動的に使用します。
10.12.4.2. カスタマイズした DT overlay の作成at-dtweb では対応できない変更を行いたい場合にカスタマイズした DT overlay を作成することでができます。 overlay を使用することで、今後のアップデートで overlay される側の dts に変更があっても自動的に適用され続けます。 -
「Linux カーネルをビルドする」 を参照して、カーネルのソースコードを取得します。
-
ソースディレクトリの
arch/arm64/boot/dts/freescale/armadillo_iotg_g4-customize.dts を編集します。
-
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs で DT overlay をビルドします。
-
arch/arm64/boot/dts/freescale/armadillo_iotg_g4-customize.dtbo ファイルを Armadillo の /boot に配置し、/boot/overlays.txt に記載します。
|
取得したカーネルのソースディレクトリに入ります。
| |
dts ファイルを編集します。この例では pwm2 を SPDIF_RX (CON9.28) ピンを有効にします。
| |
DT overlay をビルドします。
| |
ビルドされたファイルを Armadillo にコピーします。この例では scp を使いましたが、USBドライブでのコピーや SWUpdate でも可能です。
| |
overlays.txt にこの DT overlay をロードするように記載します。
| |
ファイルを永続化します。DT overlay は swupdate_preserve_files のデフォルトには記載されていないため、SWUpdate で更新する場合は必ず swupdate_preserve_files も更新してください。
| |
再起動して、u-boot の出力で DT overlay がロードされてることを確認します。
|
eMMC は主に NAND Flash メモリから構成されるデバイスです。NAND Flash メモリには書き込みしてから1年から3年程度の長期間データが読み出されないと電荷が抜けてしまう可能性があります。その際、電荷が抜けて正しくデータが読めない場合は、eMMC 内部で ECC (Error Correcting Code) を利用してデータを訂正します。しかし、訂正ができないほどにデータが化けてしまう場合もあります。そのため、一度書いてから長期間利用しない、高温の環境で利用するなどのケースでは、データ保持期間内に電荷の補充が必要になります。電荷の補充にはデータの読み出し処理を実行し、このデータの読み出し処理をデータリテンションと呼びます。 Armadillo-X2 に搭載のeMMCには長期間データが読み出されない状態であっても、データリテンションを自動的に行う機能を搭載しています。 データリテンションは /etc/conf.d/micron_emmc_reten というファイルに書かれた設定、use_system_time によって以下の2通りの挙動を示します。 表10.13 データリテンションの挙動 /etc/conf.d/micron_emmc_reten | initiating condition |
---|
use_system_time=yes | Linux 起動した時に前回のリテンションから1日以上経過していたら開始する | use_system_time=no (default) | Linux 起動した時に毎回開始する |
これで設定は完了しました。 以下は挙動ごとのシステム概略図です。 use_system_time を有効にした場合のデータリテンションの動作例を以下に示します。 10.13.2. より詳しくデータリテンションの統計情報を確認するにはMicron Technology が提供する emmcparm というツールを使うことで、データリテンションの統計情報を確認することができます。統計情報として eMMC 内部に保存されているのは実行回数、最終実行完了時のカウンター値、現在のデータリテンション処理の進捗があります。
次の手順で、emmcparmを使ってeMMCの情報を確認することができます。このツールではデータリテンション処理のことを「セルフリフレッシュ」と呼びます。
emmcparm をダウンロードする
以下の検索結果から最新の emmcparm をダウンロードする。ユーザー登録が必要になります。 | |
---|
マニュアル作成時点では 5.0.0 を利用しました |
パッケージを展開する
[armadillo ~]# unzip emmc_emmcparm_c_code_derived_from_TN\ FC\ 25_v5.0.0 _binary.zip
SSR を取得する
[armadillo ~]# emmcparm/bin/emmcparm_arm_64bit -r /dev/mmcblk2 : (省略)
=======================================================================
| Secure Smart Report |
=======================================================================
Self Refresh progress of scan[215-212]: 0x00000000 (0)
Power Loss Counter[195-192]: 0x00000005 (5)
Current total ON time[131-128]: 0x00001b28 (6952)
Number of Blocks in Refresh Queue[99-96]: 0x00000000 (0)
Self Refresh Completion date [95-88]: 0xffffffffd8148931
(-669742799)
Self Refresh Loop Count[81-80]: 0x00000002 (2)
Written Data 100MB Size Count (from NAND)[79-76]: 0x0004889d (297117)
Cumulative Initialization Count (from NAND)[75-72]: 0x00005300 (21248)
Written Data 100MB Size Count (from RAM)[71-68]: 0x0004889d (297117)
Refresh Count[55-52]: 0x00000004 (4)
: (省略) |
現在のセルフリフレッシュ処理の進捗。0 ということは実行中ではない
| |
最後に行ったセルフリフレッシュのカウンター値
| |
セルフリフレッシュを行った回数
|
ここではデータリテンションを自動的におこなう機能の仕様について詳細に説明します。
Armadillo で採用しているeMMCには、データリテンションを自動的に実行することができる「セルフリフレッシュ」と呼ばれる機能が搭載されます。実行トリガーは2種類のうちどちらかを選択できます。OTP のため一度設定すると変更できません。この設定は出荷時に「eMMC 内部レジスタ値とコマンドに入力された値を比較して1日以上経過していると実行する」を設定しています。 -
リセット後に毎回実行する
-
eMMC 内部レジスタ値とコマンドに入力された値を比較して1日以上経過していると実行する
2の設定の場合、セルリフレッシュ機能が実行されるまでの流れは以下のとおりです。 -
ホストによって eMMC がハードウェアもしくはソフトウェアリセットされる
-
一定時間 (delay 1) 以内に、ホストから SET_TIME (CMD49)と呼ばれるコマンドが eMMC に発行される
-
eMMC コントローラは、バスの稼動状態を監視する
eMMC コントローラは、アイドルになってから一定時間 (delay 2) 経過した後にセルフリフレッシュを実行する
-
ECC エラーなどのエラーがしきい値 (2) を越えたセルに対してのみセルフリフレッシュを実行する
Armadillo でのセルフリフレッシュ機能搭載 eMMC への設定は以下のとおりです。 表10.14 Armadillo のデータリテンションの設定 setting | value | description |
---|
RTC | ON | eMMC 内部レジスタの値と SET_TIME の値を比較してセルフリフレッシュを実行する | Delay 1 | 60s | リセット後の SET_TIME 有効期間 | Delay 2 | 100ms | アイドル確認後のセルフリフレッシュ実行までの遅れ時間 |
| |
---|
詳しい情報は以下を参照してください。 マイクロンのサイトの会員登録が必要になります。 |
この章では、アットマークテクノが提供するデモアプリケーションについて説明します。
デモアプリケーションは GUI アプリケーションであるため、ディスプレイを接続している必要があります。
デモアプリケーションを実行するためのコンテナイメージとして、アットマークテクノが提供する
コンテナイメージを想定しています。
このイメージに関しては 「アットマークテクノが提供するイメージを使う」 を参照してください。 また、パッケージのインストールにはデフォルトの tmpfs の容量が少ないので、
あらかじめ abos-ctrl podman-storage --disk で
podman のストレージを eMMC に切り替えてください。開発が終わったら必ず tmpfs に戻ってください。 デモアプリケーションを実行するためのコンテナを以下のように作成します。 デモアプリケーションは GUI アプリケーションであるため、
まずデスクトップ環境を起動する必要があります。ここでは weston を起動します。 10.14.2. デモアプリケーションランチャを起動するデモアプリケーションランチャを起動します。
個々のデモアプリケーションはこのデモアプリケーションランチャから起動できます。
このデモアプリケーションランチャは GUI フレームワークとして Flutter を使用しています。
デモアプリケーションランチャのソースコードは、apt source で取得することができます。 以下のようなアプケーションが起動します。 左側のカテゴリから起動したいデモアプリケーションを選びます。 選んだアプリケーションは、右下の「起動」ボタンで起動することができます。 | |
---|
デモアプリケーションには TensorFlow Lite と NPU を使用するものが含まれています。
TensorFlow Lite と NPU を扱うライブラリのバージョンによっては、デモアプリケーションが正しく動作しない場合があります。
以下のバージョンになっていることを確認してください。 表10.15 デモアプリケーション動作のために必要なバージョン パッケージ名 | 必要バージョン |
---|
tensorflow-lite | 2.8.0 以上 | python3-tflite-runtime | 2.8.0 以上 | tensorflow-lite-vx-delegate | 2.8.0 以上 | tim-vx | 1.1.39 以上 |
各パッケージのバージョンは、コンテナ内で以下のコマンドを実行することで確認できます。
以下は、tensorflow-lite のバージョンを確認する例です。
バージョンの条件を満たしていない場合は、 apt update && apt upgrade を実行してアップデートを行ってください。 |
mediaplayer は動画を再生するアプリケーションです。H.264, VP8, VP9 でエンコードされた
動画ファイルであれば、動画のデコードに VPU が使われます。File メニューから、再生したい
動画ファイルを選択することができます。
このアプリケーションは、GUI フレームワークとして wxWidgets を使用しています。 音声も出力したい場合は、pulseaudio をインストールして起動する必要があります。 video recoder は gstreamer を使用してカメラからの映像を録画することができます。
そのため、このアプリケーションを使用するためには、Armadillo 本体にカメラを接続する必要があります。
カメラが接続されていると Video device の項目でカメラを選択できるようになります。
カメラを選択し、Start ボタンを押すと別ウィンドウが表示され録画が開始されます。
アプリケーション上のテキストボックスには、Start ボタンを押したときに起動する gstreamer の
コマンドを表示しています。テキストボックスの内容はキーボードで編集可能です。
このアプリケーションは、GUI フレームワークとして wxWidgets を使用しています。 マイク付きのカメラなどで同時に音声も録音したい場合は、「mediaplayer」 を参照して
pulseaudio を起動してください。 10.14.5. led switch testerled switch tester は Armadillo 本体上の LED と SW1 を扱うアプリケーションです。
LED ボタンを押すことで Armadillo 本体上の LED の 点灯・消灯を確認することができます。
Armadillo 本体上の SW1 を押すとアプリケーションの SW1 部分の表示が変化することを確認できます。
このアプリケーションは、GUI フレームワークとして wxWidgets を使用しています。 rtc tester は Armadillo 本体上の RTC に対して日時の設定および取得が行えるアプリケーションです。
カレンダー上から日付を選び、Time に設定したい時刻を入力した後、Set ボタンを押すと RTC にその日時が
設定されます。Get ボタンを押すと、現在の日時を RTC から読み込みアプリケーション上に反映されます。
このアプリケーションは、GUI フレームワークとして wxWidgets を使用しています。 10.14.7. object detection demoobject detection demo はカメラからの映像に対して物体認識を行うアプリケーションです。
NPU を使用しているため高速に物体認識を行えます。画面の左側には認識した物体を囲む四角形が表示され、
右側には認識した物体のラベルとスコアが表示されます。
このアプリケーションは機械学習のライブラリとして TensorFlow Lite を使用しています。 起動する前に、必要な Python ライブラリをインストールする必要があります。 このアプリケーションはカメラデバイスとしてデフォルトで /dev/video2 を使用します。
お使いの環境によって別のカメラデバイスに設定したい場合は、以下のファイルを変更してください。 |
--camera_id の値を環境に合わせて変更します。
|
10.14.8. pose estimation demopose estimation demo はカメラに映った人物の姿勢を推定して表示するアプリケーションです。
NPU を使用しているため高速に姿勢推定を行えます。推定した姿勢は人物の上に重ねて表示されます。
このアプリケーションは機械学習のライブラリとして TensorFlow Lite を使用しています。 このアプリケーションは起動してから画面に映像が表示されるまで初回のみ約 1 分ほどかかります。
2回目以降の起動では 5 秒程度で映像が表示されます。
また、カメラデバイスとしてデフォルトで /dev/video2 を使用します。
お使いの環境によって別のカメラデバイスに設定したい場合は、以下のファイルを変更してください。 |
--camera_id の値を環境に合わせて変更します。
|
10.14.9. image segmentation demoimage segmentation demo はカメラに映った人物の「人物として認識された領域(セグメント)」を推定して表示するアプリケーションです。
NPU を使用しているため高速に領域推定を行えます。推定した領域は人物の上に青の透過色で重ねて表示されます。
このアプリケーションは機械学習のライブラリとして TensorFlow Lite を使用しています。 このアプリケーションはカメラデバイスとしてデフォルトで /dev/video2 を使用します。
お使いの環境によって別のカメラデバイスに設定したい場合は、以下のファイルを変更してください。 |
--camera_id の値を環境に合わせて変更します。
|
10.14.10. super resolution demosuper resolution demo はカメラの映像の中央部 50 x 50 ピクセルの領域を 200 x 200 ピクセルに解像度を
上げて表示する (超解像) アプリケーションです。NPU を使用しているため高速に超解像を行えます。
このアプリケーションは機械学習のライブラリとして TensorFlow Lite を使用しています。 画面右上は最近傍補間で 200 x 200 ピクセルに拡大した映像、画面右下が超解像で 200 x 200 ピクセルにした映像です。 このアプリケーションは起動してから画面に映像が表示されるまで初回のみ約 1 分ほどかかります。
2回目以降の起動では 5 秒程度で映像が表示されます。
また、カメラデバイスとしてデフォルトで /dev/video2 を使用します。
お使いの環境によって別のカメラデバイスに設定したい場合は、以下のファイルを変更してください。 |
--camera_id の値を環境に合わせて変更します。
|
10.14.11. hand estimation demohand estimation demo はカメラに映った人物の手指を検出してその領域と手の骨格を同時に表示するアプリケーションです。
NPU を使用しているため高速に手指検出を行えます。検出した手指の領域と骨格は手指の上に重ねて表示されます。
このアプリケーションは機械学習のライブラリとして TensorFlow Lite を使用しています。 このアプリケーションは起動してから画面に映像が表示されるまで初回のみ約 30 秒ほどかかります。
2回目以降の起動では 5 秒程度で映像が表示されます。
また、カメラデバイスとしてデフォルトで /dev/video2 を使用します。
お使いの環境によって別のカメラデバイスに設定したい場合は、以下のファイルを変更してください。 |
--camera_id の値を環境に合わせて変更します。
|
10.14.12. screw detection demoscrew detection demo はカメラに映ったネジを検出してその領域を表示するアプリケーションです。
また、領域の大きさからネジの長さを測り、しきい値以下であれば赤枠、それ以外は青枠で領域を囲います。
各種パラメータはコマンドライン引数で指定可能です。 NPU を使用しているため高速にネジの検出を行えます。検出したネジの領域はネジの上に重ねて表示されます。
このアプリケーションは機械学習のライブラリとして TensorFlow Lite を使用しています。 このアプリケーションは起動してから画面に映像が表示されるまで初回のみ約 30 秒ほどかかります。
2回目以降の起動では 5 秒程度で映像が表示されます。
また、カメラデバイスとしてデフォルトで /dev/video2 を使用します。
お使いの環境によって別のカメラデバイスに設定したい場合は、以下のファイルを変更してください。 表10.16 ネジ検出デモのパラメータの詳細 パラメータ名 | 意味 |
---|
camera_id | 使用するカメラを指定します。/dev/videoNのNに相当します。 | conf_thres | AIがネジと認識した確度のしきい値です。この値以下の確度の物体はネジとみなされません。 | iou_thres | ネジ検出の後処理に使用するパラメータです。 | len_thres | 長いネジと短いネジの境界値を設定できます。 | visualize_score | これを指定すると、AIがネジと認識した確度を描画します。 | visualize_length | これを指定すると、ネジの長さを描画します。 |
10.15. 動作中の Armadillo の温度を測定するこの章では、Armadillo Base OS 搭載製品を組み込んだユーザー製品の熱設計時に役立つ温度プロファイラツールである「atmark-thermal-profiler」について紹介します。 Armadillo は製品ごとに動作温度範囲が設定されていますが、それらはあくまでも標準筐体に放熱材と共に取り付けて使用した場合の目安であり、実運用時には自作の筐体の使用や放熱の有無などで記載のスペック通りにならない場合があります。
また、 Armadillo には CPU または SoC が特定の温度以上になると、自動的にシャットダウンするサーマルシャットダウン機能が搭載されています。
そのため、現実的には Armadillo を組み込んだ製品を運用時と同等の環境で動作させつつ、実際に温度を計測して実運用時の CPU 及び SoC 温度がどの程度まで上がるか、サーマルシャットダウンは起こらないかを確かめる必要があります。 Armadillo Base OS 搭載製品では、動作中の Armadillo の各種温度等を取得しCSV形式で出力する atmark-thermal-profiler を利用することができますので、温度測定に役立てることができます。 10.15.2. atmark-thermal-profiler をインストールするatmark-thermal-profiler は apk パッケージで公開されていますので、apk add コマンドでインストールすることが可能です。 | |
---|
atmark-thermal-profiler はデバッグ(開発)用途で温度情報を収集及び解析するツールです。
atmark-thermal-profiler は、他の apk パッケージと同様に persist_file -a コマンドで永続的にインストールしておくことが可能ですが、
ログの保存のために Armadillo が起動している間 eMMC への書き込みを続けるので、 Armadillo を組み込んだ製品の運用時に動かしたままにしておくことは推奨しません。 atmark-thermal-profiler を永続的にインストールする場合は、運用時には必ず削除してください。 |
10.15.4. atmark-thermal-profiler が出力するログファイルを確認するatmark-thermal-profiler は、インストール直後から自動的に温度やCPU負荷率、Load Averageなどの情報を30秒に1度の周期で集め、/var/log/thermal_profile.csvに追記していきます。 thermal_profile.csv の1行目はヘッダ行です。
各列についての説明を表10.17「thermal_profile.csvの各列の説明」に記載します。 表10.17 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使用率です。 |
atmark-thermal-profiler を使用して得られたログファイルの内容を分析してみます。 10.15.5.1. サーマルシャットダウン温度の確認予め、使用している Armadillo が何℃でサーマルシャットダウンするか確認しておきます。
ここでは、 Armadillo Base OS を搭載している Armadillo-IoT ゲートウェイ G4 を例とします。
他の製品では得られる結果が異なる場合があることに注意してください。 |
CPU のサーマルシャットダウン温度です。ミリ℃で表記されているので、105℃でサーマルシャットダウンすることがわかります。
| |
SoC のサーマルシャットダウン温度です。ミリ℃で表記されているので、105℃でサーマルシャットダウンすることがわかります。
|
atmark-thermal-profiler が出力するログ(thermal_profile.csv)はCSVファイルなので、各種表計算ソフトでインポートしてグラフ化することが可能です。
これにより Armadillo 動作中の温度の変化が可視化され、得られる情報が見やすくなります。 図10.245「Armadillo-IoT ゲートウェイ G4で取得した温度のグラフ」は Armadillo-IoT ゲートウェイ G4上で一定期間 atmark-thermal-profiler を実行して取得した thermal_profile.csv を Google スプレッドシートでグラフ化したものです。
例のために、途中で stress-ng コマンドを実行して CPU に負荷を与えた後、 stress-ng コマンドを停止して CPU と SoC の温度が下がるのを待った際のデータです。 グラフの縦軸は温度(℃)で、横軸は時間です。青い線は CPU の温度、赤い線は SoC の温度を表しています。
このグラフと、「サーマルシャットダウン温度の確認」で得たサーマルシャットダウン温度を見比べると、 CPU に負荷をかけた際であっても SoC の温度は 60℃ 前後ほどまでしか上がらず、 この条件で動く Armadillo が温度的にどれほど余裕を持っているかをひと目で確認できます。 atmark-thermal-profiler は、時間毎の温度だけでなく CPU 使用率と CPU 使用率の高いプロセスについても取得して記録します。
CPU 使用率については thermal_profile.csv の CPU_1〜CPU_5 列と、 USE_1〜USE_5 列を参照してください。
各列について詳しくは表10.17「thermal_profile.csvの各列の説明」にまとまっています。 一般的に CPU 使用率が高くなると、 CPU 周辺の温度も高くなります。
そのため、測定した温度が高い場合は、 CPU 使用率の高いプロセスに注目して、 CPU を無駄に使用している意図しない処理が行なわれていないかなどを確認することをおすすめします。 10.16. Linuxカーネルがクラッシュしたときにメモリの状態を保存するArmadilloはLinuxカーネルがクラッシュすると、ウォッチドッグタイマーによってシステムリセットが発生し、再起動します。 このとき、再起動によってメモリの内容が失われてしまうため、デバッグが困難になる場合があります。 ここでは Kdump を利用してLinuxカーネルがクラッシュしたときにメモリの状態(vmcore)を保存し、vmcoreを解析する方法を紹介します。 ここでは、Kdumpの実行環境を構築する手順を紹介します。
Linuxカーネルの準備
ArmadilloのLinuxカーネルをデバッグ用に変更します。以下で紹介する二つの方法のどちらかを選択してください。
ビルド済みのapkパッケージを利用する場合
以下のコマンドを実行します。 [armadillo ~]# persist_file -a del linux-at-x2
[armadillo ~]# persist_file -a add linux-at-x2-debug
Linuxカーネルをビルドする場合
以下のようにカーネルコンフィギュレーションを変更してください。 Kernel hacking --->
Compile-time checks and compiler options --->
[*] Compile the kernel with debug info <DEBUG_INFO>
[ ] Reduce debugging information <DEBUG_INFO_REDUCED> |
チェックを入れます
| |
チェックを外します
|
「Linux カーネルをビルドする」を参照して、ビルドおよびインストールしてください。
パッケージのインストール
kdump-toolsをインストールします。 [armadillo ~]# persist_file -a add kdump-tools
設定ファイルの編集
Kdumpの設定ファイルを編集します。 [armadillo ~]# vi /etc/conf.d/kdump-tools
# kdump-tools configuration
:(省略)
KDUMP_KERNEL=/boot/Image
#KDUMP_INITRD=/var/lib/kdump/initrd.img
:(省略)
KDUMP_COREDIR="/var/app/volumes/kdump"
:(省略)
[armadillo ~]# persist_file /etc/conf.d/kdump-tools |
Linuxカーネルイメージのパスを指定します。
| |
initrdは利用しないのでコメントアウトします。
| |
vmcoreを保存するディレクトリを指定します。少なくとも30MByte以上の空き容量が必要です。
| |
ファイルを永続化します。
|
kdump-toolsサービスの有効化
起動時に、自動的にkdump-toolsサービスを有効化するようにします。 [armadillo ~]# rc-update add kdump-tools
[armadillo ~]# persist_file /etc/runlevels/default/kdump-tools |
kdump-toolsサービスの自動起動を有効にします。
| |
ファイルを永続化します。
|
Linuxカーネル起動時パラメータの指定
Kdumpで利用するメモリサイズを、Linuxカーネル起動時パラメータのcrashkernelに指定します。「u-boot の環境変数の設定」を参照し、環境変数optargsを設定してください。 以下の例では、Kdumpで利用するメモリサイズを128MByteに指定しています。 [armadillo ~]# vi /boot/uboot_env.d/kdump
optargs=quiet nokaslr crashkernel=128M
[armadillo ~]# persist_file -v /boot/uboot_env.d/kdump
'/boot/uboot_env.d/kdump' -> '/mnt/boot/uboot_env.d/kdump'
[armadillo ~]# fw_setenv -s /boot/uboot_env.d/kdump
Environment OK, copy 0
[armadillo ~]# fw_printenv | grep optargs=
optargs=quiet nokaslr crashkernel=128M
[armadillo ~]# reboot |
コンフィグファイルを生成します。
| |
デフォルト値である"quiet nokaslr"の後ろに追加しています。デフォルト値が不要であれば、削除しても問題ありません。
| |
ファイルを永続化します。
| |
変数を書き込みます。
| |
書き込んだ変数を確認します。
| |
再起動して、設定を反映させます。
|
以上で、Kdumpを利用する準備は完了です。Linuxカーネルがクラッシュした場合に、Kdumpによってvmcoreが保存されるようになりました。
ここでは、故意にLinuxカーネルをクラッシュさせ、Kdumpの動作確認を行う手順を紹介します。 [armadillo ~]# echo 1 > /proc/sys/kernel/sysrq
[armadillo ~]# echo c > /proc/sysrq-trigger
[ 19.295633] sysrq: Trigger a crash
[ 19.299079] Kernel panic - not syncing: sysrq triggered crash
: (省略)
[ 19.386503] Starting crashdump kernel...
[ 19.390426] Bye!
[ 0.000000] Booting Linux on physical CPU 0x0000000003 [0x410fd034]
: (省略)
kdump-tools |makedumpfile Completed.
kdump-tools |kdump-config: saved vmcore in /var/app/volumes/kdump/202303101530
kdump-tools |Fri, 10 Mar 2023 15:30:39 +0900
[ 20.189148] imx2-wdt 30280000.watchdog: Device shutdown: Expect reboot!
[ 20.201853] reboot: Restarting system
: (省略)
[armadillo ~]# ls /var/app/volumes/kdump/202303101530
dmesg.202303101530 dump.202303101530 |
SysRqキーを有効化します。
| |
SysRqキーの"c"コマンドを実行してLinuxカーネルをクラッシュさせます。
| |
Kdumpに指定したLinuxカーネルがブートローダーを経由せずに起動します。
| |
Kdumpがvmcoreを保存した後、自動的に再起動します。
| |
作成されたファイルを確認します。
| |
dmesg.[DATE]はLinuxカーネルのログです。dump.[DATE]はvmcoreです。
|
Armadilloの再起動が完了後、Kdumpのログに表示されたディレクトリ(/var/app/volumes/kdump/[DATE]/)から、Linuxカーネルがクラッシュした状態でのvmcoreやdmesgを確認することができます。 | |
---|
vmcoreが保存されるディレクトリおよび、そのディレクトリ内に作成されるファイル名に付与される日時は次のコマンドで作られています。 date +"%Y%m%d%H%M" |
ここでは、vmcoreの内容を確認する手順を紹介します。 vmcoreの内容を確認するには、次の3つが必要です。 vmcoreは、「Kdumpの動作確認」で作成した /var/app/volumes/kdump/[DATE]/dump.[DATE] です。vmlinuxおよびcrashコマンドの準備については、以下の手順を参照してください。
vmlinuxの準備
現在動作しているLinuxカーネルと一緒にビルドされたvmlinuxを取得します。 「Kdumpを利用する準備」でどちらのLinuxカーネルを選択したかによって手順が異なります。以下で紹介する二つの方法のどちらかを選択してください。
ビルド済みのapkパッケージに含まれているLinuxカーネルが動作している場合
以下のコマンドを実行してvmlinuxを取得します。vmlinuxは、ホストとコンテナ間で共有する/var/app/volumes/kdump/に配置します。 [armadillo ~]# cd /var/app/volumes/kdump/
[armadillo /var/app/volumes/kdump]# apk fetch linux-at-x2-dbg
[armadillo /var/app/volumes/kdump]# mv linux-at-x2-dbg-[VERSION].apk linux-at-x2-dbg.tar.gz
[armadillo /var/app/volumes/kdump]# tar xf linux-at-x2-dbg.tar.gz
[armadillo /var/app/volumes/kdump]# ln -s usr/lib/debug/lib/modules/[VERSION]/vmlinux .
ビルドしたLinuxカーネルが動作している場合
ビルドしたLinuxカーネルディレクトリ直下にvmlinuxが作成されています。 [armadillo ~]# ls linux-[VERSION]/vmlinux
linux-[VERSION]/vmlinux vmlinuxを/var/app/volumes/kdump/にコピーしてください。
crashコマンドの準備
crashコマンドを利用する為に、「アットマークテクノが提供するイメージを使う」を参照してdebianコンテナを作成してください。 | |
---|
crashコマンドが利用できるディストリビューションであれば、debian以外を利用しても構いません。 |
以下のコマンドを実行してcrashをインストールします。 [armadillo ~]# vi /etc/atmark/containers/kdump.conf
set_image localhost/at-debian-image:latest
set_command sleep infinity
add_volumes /var/app/volumes/kdump:/mnt:ro
[armadillo ~]# podman_start kdump
Starting 'kdump'
8e7ad42534e3fb968dbf597d679246346ae4f766ac33ab0265008f30a7bf7d11
[armadillo ~]# podman exec -it kdump bash
[container /]# apt install crash |
ホスト OS 側の /var/app/volumes/kdump をコンテナ内の /mnt にマウントするように設定します。
| |
crashコマンドを含むcrashパッケージをインストールします。
|
vmcoreの確認
以下のコマンドを実行してcrashを起動します。起動に成功するとcrashのプロンプトが表示され、不具合の解析を行うことができるようになります。 [container /]# crash /mnt/vmlinux /mnt/[DATE]/dump.[DATE]
:(省略)
crash> | |
---|
crashのコマンド一覧は、helpコマンドで確認できます。 crash> help helpの引数にコマンドを与えると、そのコマンドの詳細を確認できます。例としてbtコマンドの詳細は以下のように確認できます。 crash> help bt |
| |
| | | |
| |