🙆

Menderで始める組み込みOTA 第8回 : Quickstart Part7 : リモートターミナル機能のご紹介

2022/07/19に公開

MenderはオープンソースベースのLinux向けOTA(Over the Air Update)ソリューションです。

Mender is a secure, risk tolerant and efficient over-the-air update manager. Remotely manage and deploy software updates to your IoT devices at scale, worldwide.

https://mender.io/


Menderで始める組み込みOTA」記事インデックス

はじめに

MenderではTroubleshootに利用可能な以下の3つの機能が add-onとして提供されています。

https://docs.mender.io/add-ons/overview

このTroubleshoot add-onはSaaSのmender.ioでは有償で利用可能です。(もちろんEnterpriseプランの試用期間中にも利用可能)

https://mender.io/product/pricing#add-ons

実のところ、これらの機能はsshにあるリモートターミナル/ファイル転送/ローカルポートフォワード機能に非常に近いです。ただし、デバイス側でsshサーバーポートを開く必要はなく、またMender Server経由で手元の開発PCからIoTデバイスおよびその先のポートに接続可能なところがsshとは大きく異なっています。

今回の記事ではこの中からリモートターミナル機能をご紹介します。Mender documentの 「Remote Terminal」 の説明に従って実際の動作を試します。

準備

Remote Terminal 機能を利用するために必要な要件は

  1. mender-client のインストールと接続 (デバイスのAccept)
  2. mender-connect のインストール
  3. /etc/mender/mender-connect.conf の設定

です。本来、.debモジュールのインストールや設定ファイルの調整が必要なところですが、実は 第3回 :Raspberry Pi 3/4を接続 で実施したインストール作業でこの3項目はすべてクリアされており、追加で必要な作業はありません。

/etc/mender/mender-connect.conf で可能な設定項目については以下を参照ください。

https://docs.mender.io/add-ons/mender-connect#remote-terminal-configuration

Remote Terminalの開始

ドキュメントの「Remote Terminal」に書いてある手順でRemote Terminalセッション開始します。

  1. デバイスが接続中のMender WebUIにログインします。

SaaSの Mender.io を利用中の場合は以下から。

https://hosted.mender.io/

  1. Devices画面から、いずれか接続中のデバイスをクリックして選択。

Devices画面

接続中でないデバイスはStatusが「Offline」と表示されています。

  1. 表示される Device Information画面を一番下までスクロールし、Troubleshoot の「Launch a new Remote Terminal session」をクリック

Device Information画面

  1. Troubleshoot画面がブラウザウインドウとして表示されます。この中にターミナル画面が開きます。

ちょっと遅いですが、vimなどのスクリーンコントロールも動作するようです。

Terminal接続中

実は「File Transfer」の表示をクリックすると、File Transferを実行することもできます。

File Transfer画面

  1. exit でシェルを終了するか、「DISCONNECT TERMINAL」をクリックすると、Remote Terminal Sessionが終了します。

Terminal接続中

この後「CONNECT TERMINAL」をクリックすると、デバイスに再接続します。「CLOSE」をクリックすると、ブラウザウインドウを閉じます。

mender-cli を利用して接続

MenderのServer Side APIを呼び出すことのできるLinux用のmender-cli バイナリを利用することで、Linux PCやWindows10のWSL2からMender接続中のデバイスに接続することができます。

  1. 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 にインストールする場合は、以下のように実行します。

開発PCで実行
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ファイルを置いておけばとりあえず文句は言われないみたいです。

開発PCで実行
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:~$
  1. ログインを実行

以下のようにログインします。これで JWT_TOKEN が取得され、以降のWebAPI呼び出し時にヘッダーに設定されると考えられます。

開発PCで実行
codegear@Pavilion24:~$ mender-cli login
Using configuration file: /home/codegear/.mender-clirc
Username: hiron@codegear.co.jp
Password: ************
login successful
codegear@Pavilion24:~$
  1. 接続対象のデバイスIDを取得

mender.ioのWeb UIのDEVICESで接続可能なデバイス (現在接続中のもの)を見つけ、IDをメモします。

あるいは、mender-cliで以下のように表示されたものの一つを利用します。(ここでは接続中かどうかわからないので注意)

開発PCで実行
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:~$
  1. デバイスに接続

ID: d4d1846f-05d0-4c3a-9b1f-17e6723c1b7b のデバイスに接続します。

開発PCで実行
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で公開されています。

https://github.com/mendersoftware/mender-connect

サーバー側の実装コードは以下のGitHubで公開されています。

https://github.com/mendersoftware/deviceconnect

セキュリティについて

Menderの Remote Terminal機能は

  • mender-clientに対して接続要求する
  • mender-connectがMenderサーバーに対してTerminalセッションを開く

という流れで実行されます。つまり、デバイスでオープンされているsshポートに対して外から接続する、というような動作ではありません。またこのため、(デバイスから見て)NATの内側にあるデバイスに対しても特に追加のネットワーク設定を行うことなく接続することが可能です。

これ以外のRemote Terminalセキュリティに関する事項が以下のページで説明されています。
たとえば、デバイス内で実行するターミナルのユーザーとシェルプログラムを mender-connect.conf で指定することができます。

https://docs.mender.io/add-ons/remote-terminal/security#remote-terminal

ターミナルとして開くシェルとユーザーの設定は、/etc/mender/mender-connect.conf の以下の設定が利用されるようです。これを利用して、ターミナルを実行するユーザーを変更可能です。

{
  "User": "root",
  "ShellCommand": "/bin/bash"
}

この記事のまとめ

Menderのadd-on機能であるRemote Terminal機能を紹介しました。この機能により、Mender接続中のデバイスのトラブルシュートに役立てることができます。

今後の予定

コードギアではこれまでに Menderで始める組み込みOTA のタイトルで以下のZenn記事を公開しています。


今回で Quickstart編は一区切りとし、この後は以下のテーマに沿って随時記事を公開していく予定です。

デバイスを接続

  • Nvidia社のJetsonを接続

Mender OTAサーバーを動かす

  • Linux PCでMenderサーバーを動かす

セキュリティについて

  • ARTIFACTの署名について
  • TLS双方向認証について
  • HSM (ハードウエアセキュリティモジュール)の利用

以上ご期待ください。

Discussion