3.3. ソフトウェアアップデート
Terminal System 2は、Menderを利用したソフトウェアアップデートをサポートしています。
Menderとは
Menderは、northern.tech社のIoTデバイス向けのOTA(Over the Air)ソフトウェアアップデートソリューションです。 Menderサーバーと、デバイスにインストールされたMenderクライアント間で通信し、ソフトウェアアップデートを実現します。
- Menderサーバー
WebブラウザでMenderの操作を行うMender Web UIや、各種バックエンド機能を提供するサーバーです。 ユーザー認証、デバイス認証、リリース(Menderアーティファクト)管理、デプロイメント管理、トラブルシューティング機能、デバイスモニタリング機能など、IoTデバイスの遠隔管理に必要な各種機能を備えています。
Menderの操作はMender Web UIだけでなく、Mender APIを利用して行うことも可能です。
- Menderクライアント
エッジコンピューターにインストールされるMenderのクライアントアプリケーションです。 MenderサーバーからデプロイされたアーティファクトをMenderクライアントがインストールすることで、ソフトウェアアップデートを実現します。
ソフトウェアアップデートの他に、デバイスの情報を定期的にMenderサーバーに送信する インベントリ送信 や、 デバイス設定の変更 にも対応しています。
- Menderアーティファクト
ソフトウェアアップデートで利用するファイルです。 OSのアップデートで使用するOSアップデートアーティファクトと、アプリケーションのアップデートで使用するアプリケーションアップデートアーティファクトの2つの種類があります。 Menderサーバーは同じ名前を持つ複数のアーティファクトを1つのリリースとして管理し、デプロイメントに使用します。
注釈
Menderの詳細については、 Mender docs を参照してください。
パーティション構成
Menderに対応したデバイスは、2つのrootfsパーティションとdataパーティションで主に構成されます。
- rootfsパーティション
Linuxカーネルを含むシステムパーティションです。 rootfsパーティションはA/Bの2つの領域で構成され、OSアップデートアーティファクトにより更新されます。
- dataパーティション
Menderの更新間で保持するデータを格納するパーティションです。 通常はアップデートで更新されません。
重要
デバイスがMenderに対応するためには、利用したいデバイス毎にMenderボード統合(board integration)と呼ばれる作業を行い、Menderのアップデートの仕組みに対応した上記のパーティションで構成されたイメージを作成する必要があります。 Terminal System 2は、サポートするエッジコンピューターについてボード統合を行うことで、Menderに対応しています。
アップデートの種類
Menderのソフトウェアアップデートの種類は、OSアップデートとアプリケーションアップデートの2つです。
- OSアップデート
OSアップデートアーティファクトを使用して、現在アクティブではないrootfsパーティションをアップデートし、デバイスを再起動してrootfsパーティションを切り替えます。
Terminal System 2では、Yoctoを利用して、OSアップデートアーティファクトを作成します。
- アプリケーションアップデート
アプリケーションアップデートアーティファクトを使用して、現在アクティブなrootfsパーティションをアップデートします。 デバイスの再起動は任意で、rootfsパーティションは切り替わりません。
アプリケーションアップデートは、アップデート種類に応じたアップデートモジュールを利用します。 アップデートモジュールで提供される生成スクリプトを利用して、アプリケーションアップデートアーティファクトを作成します。
- アップデートモジュール
新しい種類のソフトウェアアップデートをサポートするための、Menderクライアントの拡張機能です。 Terminal System 2では、単一のファイルをインストールする
single-file
や、debパッケージをインストールするdeb
など Menderが提供しているアップデートモジュールのほか、 任意のアップデート処理が可能なcustom
アップデートモジュールを利用できます。注釈
Terminal System 2で利用可能なアップデートモジュールは、デバイスのイベントリで確認することができます。 Menderのアップデートモジュールの詳細については、 Mender Hub を参照してください。
アップデートフロー
OSアップデートとアプリケーションアップデートのフローを説明します。
OSアップデート
Yoctoを利用して、Terminal System 2イメージおよびOSアップデートアーティファクトを作成します。
注釈
作成したTerminal System 2イメージを利用して、プロビジョニングすることも可能です。
作成したアーティファクトをMenderサーバーへアップロードします。
Mender Web UIで新しく追加されたアーティファクトのリリースを選択し、デプロイメントを作成します。
デバイスのMenderクライアントは定期的にデプロイメントの有無を確認し、デプロイメントが存在する場合はアーティファクトをダウンロードします。
現在アクティブではないrootfsパーティションに、OSアップデートアーティファクトに含まれるイメージが書き込まれ、起動するrootfsパーティションが切り替えられてデバイスが再起動されます。これによりOSアップデートが完了します。 何らかの理由によりアップデートに失敗した場合は、起動するパーティションを元のパーティションに戻してロールバックします。
アプリケーションアップデート
custom
アップデートモジュールを利用して、外部デバイスのファームウェアを更新する例を説明します。
custom
アップデートモジュールの生成スクリプトを利用して、アプリケーションアップデートアーティファクトを作成します。作成したアーティファクトをMenderサーバーへアップロードします。
Mender Web UIで新しく追加されたアーティファクトのリリースを選択し、デプロイメントを作成します。
デバイスのMenderクライアントは定期的にデプロイメントの有無を確認し、デプロイメントが存在する場合はダウンロードを実行します。
デバイスに格納されている
custom
アップデートモジュールのスクリプトが実行されます。注釈
custom
アップデートモジュールの場合、/usr/share/mender/modules/v3/custom
のスクリプトが呼び出されます。アーティファクトに含まれるアップデートファイルが展開され、スクリプトが実行されることで、外部デバイスのファームウェアが更新されます。
custom
アップデートモジュールは任意のスクリプトを処理を実行できるため、以下のような操作が可能です。
ファイル更新
デバイス設定変更(Terminal System API呼び出し)
更新失敗時のロールバック処理
再起動処理
外部デバイスの操作/更新
バージョン管理
アーティファクトはバージョン管理が可能です。 デバイスにインストールされているアーティファクトのバージョンは、Menderサーバーにインベントリとして報告され、以下の方法で確認することができます。
Mender web UIの[Software]タブを確認する
デバイスで
mender show-provides
コマンドを実行する
# mender show-provides
artifact_name=terminal-system-image-xxxxxx
data-partition.custom.sample.version=1.0.0
data-partition.mender-configure.version=configuration-6d3918e5-037d-48c9-b9fd-fba94de0b95f
rootfs-image.checksum=f1db13617c4214317ded54a9b65fad907d1b4709095eed959e450bfb251e97bd
rootfs-image.update-module.custom.mender_update_module=custom
rootfs-image.update-module.custom.version=terminal-system-image-xxxxxx
... omitted ...
rootfs-image.version=terminal-system-image-xxxxxx
バージョン情報は以下の2つの種類があります。
- rootfs-image
rootfsにインストールされているソフトウェアのバージョンです。 OSアップデートでrootfsパーティションが更新されると、全てのrootfs-imageのソフトウェアバージョンが削除され、新しいrootfsパーティションのバージョンがMenderサーバーに報告されます。
- data-partition
dataパーティションにインストールされているソフトウェアのバージョンです。 OSアップデートをしてもdataパーティションは更新されないため、OSアップデートの前後でソフトウェアバージョンを維持します。
OSアップデートアーティファクトのバージョンは、 rootfs-image.version
インベントリとして報告されます。
アプリケーションアップデートアーティファクトは、rootfsにソフトウェアをインストールする場合は rootfs-image.<アップデートモジュール名>.<アーティファクト名>.version
として、
dataパーティションにインストールする場合は data-partition.<アップデートモジュール名>.<アーティファクト名>.version
として報告する必要があります。
注釈
Menderを利用したソフトウェアバージョン管理についての詳細は、 Mender Docs の Software versioning を参照してください。
データ保持
OSアップデートを行うとrootfsパーティションのデータは全て更新され古いデータは削除されます。 保持する必要のあるデータは、dataパーティションや拡張ストレージに格納する必要があります。
Terminal System 2は、以下の方法でOSアップデート間のデータ保持を行います。
dataパーティション
dataパーティションの内容は、OSアップデートをしても保持されます。
rootfs内のいくつかのディレクトリは、dataパーティション内のディレクトリへのリンボリックリンクになっています。そのため、dataパーティションが保持されることにより、これらのディレクトリで行われた変更は維持されます。
また、rootfs内のいくつかのディレクトリではOverlayfsが使用されており、upperdir(書き込み可能レイヤ)としてdataパーティション内のディレクトリが設定されています。そのため、この場合も同様に、これらのディレクトリで行われた変更は維持されます。
以下に、Terminal System 2でのdataパーティションの構成を説明します。
dataパーティションのディレクトリ |
データ保持方法 (リンクするrootfsディレクトリ) |
説明 |
---|---|---|
/data/mender |
シンボリックリンク (/var/lib/mender) |
OSアップデート間で保持するMenderの情報(Menderサーバー設定、デプロイログ等)を格納するディレクトリ |
/data/mender-configure |
シンボリックリンク (/var/lib/mender-configure) |
Mender Configureのデバイス設定ファイルを格納するディレクトリ |
/data/mender-monitor |
シンボリックリンク (/var/lib/mender-monitor) |
Mender Monitorのアラート情報を格納するディレクトリ |
/data/overlay/etc |
Overlayfs (/etc) |
システム設定を保持するディレクトリ |
/data/overlay/home/admin/.ssh |
Overlayfs (/home/admin/.ssh) |
adminユーザーのSSH設定を保持するディレクトリ |
/data/overlay/home/maint/.ssh |
Overlayfs (/home/maint/.ssh) |
maintユーザーのSSH設定を保持するディレクトリ |
/data/serial_number |
リンクなし |
Menderでデバイスを識別するシリアル番号 |
/data/var/cache |
バインドマウント (/var/cache) |
キャッシュを格納するディレクトリ |
/data/var/log |
バインドマウント (/var/log) |
ログを格納するディレクトリ |
これらのdataパーティションの内容は、OSアップデート間で維持されます。
拡張ストレージ
拡張ストレージを利用している場合も、OSアップデート間で内容は維持されます。 EDGEPLANT T1は拡張ストレージとしてSSDを搭載し、以下のディレクトリをバインドマウントして使用します。
SSDのディレクトリ |
マウントポイント (rootfs) |
説明 |
---|---|---|
/media/ssd/var/lib/core |
/var/lib/core |
Terminal System 2の設定やintdash Edge Agent2がアップデート間で維持する必要があるファイルを格納するディレクトリ。 デバイスコネクター設定、オーバーライドファイル、カスタム開発したデバイスコネクターサービス、計測データなど。 |
/media/ssd/var/lib/docker |
/var/lib/docker |
Dockerのデータディレクトリ(Dockerイメージを含む) |