Menderで始める組み込みOTA 第8回 : Quickstart Part7 : リモートターミナル機能のご紹介
MenderはオープンソースベースのLinux向けOTA(Over the Air Update)ソリューションです。
「Menderで始める組み込みOTA」記事インデックス
- 第0回 : 組み込み製品、IoTシステムに適したOTAとは?
- 第1回 : Menderのご紹介
- 第2回 : Quickstart Part1 : mender.ioの試用アカウントを取得
- 第3回 : Quickstart Part2 : Raspberry Pi 3/4を接続
- 第4回 : Quickstart Part3 : アプリケーションを更新(その1)
- 第5回 : Quickstart Part4 : アプリケーションを更新(その2)
- 第6回 : Quickstart Part5 : OSアップデートを実行
- 第7回 : Quickstart Part6 : コンテナアップデートを実行
- 第8回 : Quickstart Part7 : リモートターミナル機能のご紹介 (本記事)
- 第9回 : 接続編1 : QEMUエミュレータを接続
- 第10回 : 接続編2 : Armadillo IoT G3を接続
はじめに
MenderではTroubleshootに利用可能な以下の3つの機能が add-onとして提供されています。
このTroubleshoot add-onはSaaSのmender.ioでは有償で利用可能です。(もちろんEnterpriseプランの試用期間中にも利用可能)
実のところ、これらの機能はsshにあるリモートターミナル/ファイル転送/ローカルポートフォワード機能に非常に近いです。ただし、デバイス側でsshサーバーポートを開く必要はなく、またMender Server経由で手元の開発PCからIoTデバイスおよびその先のポートに接続可能なところがsshとは大きく異なっています。
今回の記事ではこの中からリモートターミナル機能をご紹介します。Mender documentの 「Remote Terminal」 の説明に従って実際の動作を試します。
準備
Remote Terminal 機能を利用するために必要な要件は
- mender-client のインストールと接続 (デバイスのAccept)
- mender-connect のインストール
- /etc/mender/mender-connect.conf の設定
です。本来、.debモジュールのインストールや設定ファイルの調整が必要なところですが、実は 第3回 :Raspberry Pi 3/4を接続 で実施したインストール作業でこの3項目はすべてクリアされており、追加で必要な作業はありません。
/etc/mender/mender-connect.conf で可能な設定項目については以下を参照ください。
Remote Terminalの開始
ドキュメントの「Remote Terminal」に書いてある手順でRemote Terminalセッション開始します。
- デバイスが接続中のMender WebUIにログインします。
SaaSの Mender.io を利用中の場合は以下から。
- Devices画面から、いずれか接続中のデバイスをクリックして選択。
接続中でないデバイスはStatusが「Offline」と表示されています。
- 表示される Device Information画面を一番下までスクロールし、Troubleshoot の「Launch a new Remote Terminal session」をクリック
- Troubleshoot画面がブラウザウインドウとして表示されます。この中にターミナル画面が開きます。
ちょっと遅いですが、vimなどのスクリーンコントロールも動作するようです。
実は「File Transfer」の表示をクリックすると、File Transferを実行することもできます。
- exit でシェルを終了するか、「DISCONNECT TERMINAL」をクリックすると、Remote Terminal Sessionが終了します。
この後「CONNECT TERMINAL」をクリックすると、デバイスに再接続します。「CLOSE」をクリックすると、ブラウザウインドウを閉じます。
mender-cli を利用して接続
MenderのServer Side APIを呼び出すことのできるLinux用のmender-cli バイナリを利用することで、Linux PCやWindows10のWSL2からMender接続中のデバイスに接続することができます。
- Webブラウザで以下のURLから mender-cli バイナリをダウンロード保存するか、wget等でコマンドラインからダウンロード
https://downloads.mender.io/mender-cli/1.8.0/linux/mender-cli
コマンドラインでwgetを利用する場合は、例えば以下のように実行します。ダウンロードしただけでは実行権限が付かないので、chmod +x などで実行権限を付けます。
wget https://downloads.mender.io/mender-cli/1.8.0/linux/mender-cli -O mender-cli
第6回でmender-artifact をダウンロードしているのと同様の手順で ~/bin にインストールする場合は、以下のように実行します。
codegear@Pavilion24:~$ which wget
/usr/bin/wget
codegear@Pavilion24:~$ which mender-cli ← まだ存在していない?
codegear@Pavilion24:~$ ls -l ~/bin/mender-cli ← 存在してません。
codegear@Pavilion24:~$ wget https://downloads.mender.io/mender-cli/1.8.0/linux/mender-cli -O ${HOME}/bin/mender-cli
--2022-07-27 17:14:59-- https://downloads.mender.io/mender-cli/1.8.0/linux/mender-cli
Resolving downloads.mender.io (downloads.mender.io)... 13.227.62.46, 13.227.62.36, 13.227.62.73, ...
Connecting to downloads.mender.io (downloads.mender.io)|13.227.62.46|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 12432080 (12M) [binary/octet-stream]
Saving to: ‘/home/codegear/bin/mender-cli’
/home/codegear/bin/ 100%[===================>] 11.86M 17.7MB/s in 0.7s
2022-07-27 17:15:00 (17.7 MB/s) - ‘/home/codegear/bin/mender-cli’ saved [12432080/12432080]
codegear@Pavilion24:~$ ls -l ~/bin/mender-cli
-rw-r--r-- 1 codegear codegear 12432080 Jun 14 15:31 /home/codegear/bin/mender-cli ←ダウンロードされたけど、実行権がない
codegear@Pavilion24:~$ chmod +x !$
chmod +x ~/bin/mender-cli
codegear@Pavilion24:~$ ls -l ~/bin/mender-cli
-rwxr-xr-x 1 codegear codegear 12432080 Jun 14 15:31 /home/codegear/bin/mender-cli ←実行可能になった
codegear@Pavilion24:~$ file !$
file ~/bin/mender-cli
/home/codegear/bin/mender-cli: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=gF6xb5aDBIkhlnCFyC_3/Ikax_j8vXOA-HmQyoQko/nLzNoxzT2Amm39iiuc4q/UyfbOFdG1RJLQEchuB6S, not stripped ← スタティックリンクのx64バイナリです
codegear@Pavilion24:~$ hash -r
codegear@Pavilion24:~$ which mender-cli
/home/codegear/bin/mender-cli
codegear@Pavilion24:~$ mender-cli --version
Configuration file not found. Continuing.
mender-cli version 1.8.0
codegear@Pavilion24:~$
Configuration fileの説明は以下にあります。
https://github.com/mendersoftware/mender-cli#configuration-file
$HOME/.mender-clirc に空のJSONファイルを置いておけばとりあえず文句は言われないみたいです。
codegear@Pavilion24:~$ echo '{}' > ~/.mender-clirc
codegear@Pavilion24:~$ cat ~/.mender-clirc
{}
codegear@Pavilion24:~$ mender-cli --version
Using configuration file: /home/codegear/.mender-clirc
mender-cli version 1.8.0
codegear@Pavilion24:~$
- ログインを実行
以下のようにログインします。これで JWT_TOKEN が取得され、以降のWebAPI呼び出し時にヘッダーに設定されると考えられます。
codegear@Pavilion24:~$ mender-cli login
Using configuration file: /home/codegear/.mender-clirc
Username: hiron@codegear.co.jp
Password: ************
login successful
codegear@Pavilion24:~$
- 接続対象のデバイスIDを取得
mender.ioのWeb UIのDEVICES
で接続可能なデバイス (現在接続中のもの)を見つけ、IDをメモします。
あるいは、mender-cliで以下のように表示されたものの一つを利用します。(ここでは接続中かどうかわからないので注意)
codegear@Pavilion24:~$ mender-cli devices list
Using configuration file: /home/codegear/.mender-clirc
ID: 370d8b0d-f090-4fb4-be7c-5b25d00697ce
Status: accepted
--------------------------------------------------------------------------------
ID: 4df0d972-5bb3-4fe9-975d-d0cc7443aae5
Status: accepted
--------------------------------------------------------------------------------
ID: 8659d047-9b59-42db-9c32-cd31e154a123
Status: accepted
--------------------------------------------------------------------------------
ID: d4d1846f-05d0-4c3a-9b1f-17e6723c1b7b
Status: accepted
--------------------------------------------------------------------------------
codegear@Pavilion24:~$
- デバイスに接続
ID: d4d1846f-05d0-4c3a-9b1f-17e6723c1b7b のデバイスに接続します。
codegear@Pavilion24:~$ mender-cli terminal d4d1846f-05d0-4c3a-9b1f-17e6723c1b7b
Using configuration file: /home/codegear/.mender-clirc
Connecting to the device d4d1846f-05d0-4c3a-9b1f-17e6723c1b7b...
Press CTRL+] to quit the session
Wi-Fi is currently blocked by rfkill.
Use raspi-config to set the country before use.
root@raspberrypi:~# uname -a
Linux raspberrypi 5.4.83-v7+ #1379 SMP Mon Dec 14 13:08:57 GMT 2020 armv7l GNU/Linux
root@raspberrypi:~# vi /etc/hosts
root@raspberrypi:~# exit
logout
codegear@Pavilion24:~$
上記はWindows 10 WSL2 としてインストールしたUbuntu 20.04 の ターミナルから実行しましたが、こちらもvimで利用するようなスクリーン制御が可能でした。
実装について
Troubleshoot add-on の各機能はOTA対象デバイス内では mender-connect サービスとして動作します。mender-connectサービスは単独で動作する事は出来ず、OTAクライアントの実体である mender-clientサービスと協調して動作します。このときD-Bus APIが利用されます。
クライアント側の実装コードは以下のGitHubで公開されています。
サーバー側の実装コードは以下のGitHubで公開されています。
セキュリティについて
Menderの Remote Terminal機能は
- mender-clientに対して接続要求する
↓ - mender-connectがMenderサーバーに対してTerminalセッションを開く
という流れで実行されます。つまり、デバイスでオープンされているsshポートに対して外から接続する、というような動作ではありません。またこのため、(デバイスから見て)NATの内側にあるデバイスに対しても特に追加のネットワーク設定を行うことなく接続することが可能です。
これ以外のRemote Terminalセキュリティに関する事項が以下のページで説明されています。
たとえば、デバイス内で実行するターミナルのユーザーとシェルプログラムを mender-connect.conf で指定することができます。
ターミナルとして開くシェルとユーザーの設定は、/etc/mender/mender-connect.conf の以下の設定が利用されるようです。これを利用して、ターミナルを実行するユーザーを変更可能です。
{
"User": "root",
"ShellCommand": "/bin/bash"
}
この記事のまとめ
Menderのadd-on機能であるRemote Terminal機能を紹介しました。この機能により、Mender接続中のデバイスのトラブルシュートに役立てることができます。
今後の予定
コードギアではこれまでに 「Menderで始める組み込みOTA」 のタイトルで以下のZenn記事を公開しています。
- 第0回 : 組み込み製品、IoTシステムに適したOTAとは?
- 第1回 : Menderのご紹介
- 第2回 : Quickstart Part1 : mender.ioの試用アカウントを取得
- 第3回 : Quickstart Part2 : Raspberry Pi 3/4を接続
- 第4回 : Quickstart Part3 : アプリケーションを更新(その1)
- 第5回 : Quickstart Part4 : アプリケーションを更新(その2)
- 第6回 : Quickstart Part5 : OSアップデートを実行 (本記事)
- 第7回 : Quickstart Part6 : コンテナアップデートを実行
- 第8回 : Quickstart Part7 : リモートターミナル機能のご紹介 (本記事)
- 第9回 : 接続編1 : QEMUエミュレータを接続
- 第10回 : 接続編2 : Armadillo IoT G3を接続
- 第11回 : 接続編3 : Jetson AGX Orinを接続
今回で Quickstart編は一区切りとし、この後は以下のテーマに沿って随時記事を公開していく予定です。
デバイスを接続
- Nvidia社のJetsonを接続
Mender OTAサーバーを動かす
- Linux PCでMenderサーバーを動かす
セキュリティについて
- ARTIFACTの署名について
- TLS双方向認証について
- HSM (ハードウエアセキュリティモジュール)の利用
以上ご期待ください。
Discussion