Appendix

この章では、サンプルアプリケーション開発内で扱いきれなかった、Armadillo Base OSでの開発に関わる情報を紹介します。

11.1. SWUpdateを用いてソフトウェアをアップデートする

Armadillo Base OSではソフトウェアのアップデート方法としてSWUpdateを利用できます。 SWUpdateについて詳細はArmadillo-IoT ゲートウェイ G4の製品マニュアルの「 Armadilloのソフトウェアをアップデートする」を参照してしてください。

今回の例ではUSBメモリを使用してアップデートしますので、4GB以上のUSBメモリを用意してください。

11.1.1. SWUpdateによる初回アップデート

SWUpdateでは、ソフトウェアアップデートを行うためにSWUイメージというファイルを使用しますので、まずは開発用PC(本ドキュメントではATDE)でSWUイメージを作成します。

出荷時のArmadilloは署名されていないSWUイメージでもSWUpdateを行うようになっています。 そのため、まずはじめに自分専用の署名鍵を生成して公開鍵をArmadilloに配置する作業をSWUpdateを用いて行うことで、自分が作成したSWUイメージでしかアップデートを行わないArmadilloを作成します。

使用しているArmadilloに、過去に一度でもこの初回アップデート作業を行っている場合は二度同じ作業を行うことはできず、する必要もありません。

  1. mkswu の取得

    初めに、そのSWUイメージを作成するソフトウェアであるmkswuをインストールします。

    [ATDE ~/]$ sudo apt update && sudo apt install mkswu

    図11.1 mkswuの取得


  2. mkswuの初期設定

    図11.2「mkswuの初期設定を行う」に示すコマンドを実行することで、swuパッケージの署名に用いる鍵や、公開鍵をArmadilloに書き込むためのSWUイメージを作成できます。

    [ATDE ~/]$ mkswu --init
    mkdir: ディレクトリ '/home/atmark/mkswu' を作成しました
    設定ファイルを更新しました:/home/atmark/mkswu/mkswu.conf
    証明書のコモンネーム(一般名)を入力してください: abos-guide-sample 1
    証明書の鍵のパスワードを入力ください(4-1024文字) 2
    証明書の鍵のパスワード(確認):
    Generating an EC private key
    writing new private key to '/home/atmark/mkswu/swupdate.key.tmp'
     -----
    アップデートイメージを暗号化しますか? (N/y) y 3
    /home/atmark/mkswu/swupdate.aes-key を作成しました。
    アットマークテクノが作成したイメージをインストール可能にしますか? (Y/n) 4
    rootパスワード: 5
    root のパスワード(確認):
    atmarkユーザのパスワード(空の場合はアカウントをロックします): 6
    atmark のパスワード(確認):
    BaseOS/プリインストールコンテナを armadillo.atmark-techno.com サーバーから自動アップデートしますか? (N/y) 7
    abos-web のパスワードを設定してください。
    abos-web のパスワード(空の場合はサービスを無効にします): 8
    abos-web のパスワード(確認):
    /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 9
    initial_setup.desc  initial_setup.swu  mkswu.conf  swupdate.aes-key  swupdate.key  swupdate.pem

    図11.2 mkswuの初期設定を行う


    1

    会社や製品が分かるような任意の名称を指定します(今回はabos-guide-sample)。

    2

    証明鍵を保護するパスフレーズを2回入力します。

    3

    SWUイメージ自体を暗号化する場合に「y」を選択します。

    4

    アットマークテクノが提供するアップデートイメージをインストールできるようにするかを選びます。例では有効にしています。

    5

    ここでArmadilloのrootユーザーのパスワードを設定します。2回入力してください。

    6

    atmarkユーザーのパスワードも同様に設定します。2回入力してください。

    7

    Armadillo Base OSの定期アップデートの有効/無効を設定します。例では無効にしています。

    8

    ABOS Web で使用するパスワードを設定します。

    9

    初期化処理の結果生成されたファイルを確認しています。swupdate.aes-keyはSWUイメージの暗号化を行うと作成されます。

  3. SWUpdateの実行

    上記の手順で生成された初回セットアップ用のSWUイメージ(initial_setup.swu)をArmadilloに書き込みます。

    ATDEにUSBメモリを接続し、作成したSWUイメージを配置します。

    [ATDE ~/]$ df -h
    Filesystem                  Size  Used Avail Use% Mounted on
    : (省略)
    /dev/sdb1                   15G   24K   14G    1% /media/atmark/USBDRIVE 1
    
    [ATDE ~/]$ cp ~/mkswu/initial_setup.swu /media/atmark/USBDRIVE/ 2
    [ATDE ~/]$ umount /media/atmark/USBDRIVE/ 3

    図11.3 SWUイメージの配置


    1

    USBメモリがマウントされている場所を確認します。

    2

    ファイルをコピーします。

    3

    /media/atmark/USBDRIVEをアンマウントします。コマンド終了後にUSBメモリを取り外してください。

    SWUイメージを配置したUSBメモリを動作中のArmadilloに挿入すると、自動的にアップデートが開始され、アップデートが完了すると再起動します。

    再起動後にはrootユーザ、atmarkユーザともに、図11.2「mkswuの初期設定を行う」で設定したパスワードでログインできます。

    これでこのArmadilloに公開鍵が配置され、手元の秘密鍵で作成されたSWUイメージでアップデート可能になりました。

    [警告]

    Armadilloに公開鍵を配置した後に対応する鍵や、 mkswu.conf を紛失すると、当該のArmadilloにSWUpdateを行うことができなくなりますのでご注意ください。

11.2. 作成したコンテナを他のArmadilloに組み込む

「アプリケーションを作成する」では、Armadillo上でコンテナイメージを作成する方法を紹介してきましたが、他のArmadilloなど外部で作成されたコンテナイメージを別なArmadilloに組み込む方法を紹介します。

11.2.1. podman loadでコンテナイメージを組み込む

「podmanコンテナのエクスポート」で紹介した通り、 podman images コマンドで表示されるコンテナイメージは podman save コマンドを使用することでファイルとして保存することができました。

このファイルは、 podman load コマンドを使用することで、別なArmadillo上であってもコンテナイメージとしてインポートすることができます。 サンプルアプリケーションのコンテナイメージを使用した実行例を図11.4「コンテナイメージファイルをインポートする」に示します。

コンテナイメージのサイズはそのイメージの内容によって異なりますが、1GBを超えることもよくあります。 OverlayFS上で保存できるファイルサイズでは保存しきれないことがありますので、この方法でコンテナイメージをインポートする際には、イメージファイルは外部のUSBメモリやSDカードに配置しておくことをお勧めします。

[armadillo /]# podman_switch_storage --disk 1
[armadillo /]# mount /dev/sda1 /mnt && cd /mnt 2
[armadillo /mnt]# wget https://download.atmark-techno.com/armadillo-iot-g4/example/armadillo-base-os-dev-guide/abos-dev-guide-v1.0.0.tar 3
[armadillo /mnt]# podman load -i abos-dev-guide-v1.0.0.tar 4
[armadillo /mnt]# podman images abos-dev-guide 5
REPOSITORY                TAG         IMAGE ID      CREATED       SIZE
localhost/abos-dev-guide  v1.0.0      05304c68979f  15 hours ago  917 MB

図11.4 コンテナイメージファイルをインポートする


1

podmanコンテナイメージの保存先をeMMCに変更します。

2

/dev/sda1として認識されているUSBメモリ(もしくはSDカード)を/mntにマウントしディレクトリ移動します。

3

USBメモリ上にサンプルアプリケーション用コンテナイメージをダウンロードします。

4

podman load コマンドでコンテナイメージをインポートします。

5

podman images コマンドでインポートできていることを確認します。

11.2.2. SWUpdateでコンテナイメージを組み込む

「podmanコンテナのエクスポート」で紹介した、 podman save コマンドを用いて生成したコンテナイメージファイルは、SWUpdateによって他のArmadilloに適用することも可能です。 以下ではSWUpdateを用いてサンプルアプリケーションを含むコンテナイメージと、コンテナを自動実行するためのsample_container.confをArmadilloに書き込む手順を紹介します。

SWUpdateについては「SWUpdateを用いてソフトウェアをアップデートする」を参照してください。 以下の手順を実行するためには、予め「SWUpdateによる初回アップデート」の手順を実行してSWUpdateの初回アップデートを実施しておく必要があります。

  1. コンテナインストール用のSWUイメージを作成する

    導入したいコンテナイメージを含んだSWUイメージを作成します。

    まず、~/mkswu/abos-dev-guide-descsディレクトリを作成し、その中にArmadilloに組み込みたいコンテナイメージと、自動実行用の.confファイルを配置します。 コンテナの自動実行については「podmanコンテナとアプリケーションの自動実行」を参照してください。

    [ATDE ~/mkswu]$ mkdir -p abos-dev-guide-descs && cd abos-dev-guide-descs
    [ATDE ~/mkswu/abos-dev-guide-descs]$ wget https://download.atmark-techno.com/armadillo-iot-g4/example/armadillo-base-os-dev-guide/abos-dev-guide-v1.0.0.tar
    [ATDE ~/mkswu/abos-dev-guide-descs]$ wget https://download.atmark-techno.com/armadillo-iot-g4/example/armadillo-base-os-dev-guide/sample_container.conf

    図11.5 作業用ディレクトリの作成と書き込むファイルのダウンロード


    次に、SWUイメージ作成に用いるusb_container_sample.descを以下のように作成します。

    [ATDE ~/mkswu/abos-dev-guide-descs]$ cat usb_container_sample.desc
    version=1
    
    swdesc_usb_container "abos-dev-guide-v1.0.0.tar" 1
    swdesc_files --extra-os --dest /etc/atmark/containers sample_container.conf 2

    図11.6 usb_container_sample.desc作成例


    1

    abos-dev-guide-v1.0.0.tarをコンテナイメージとして組み込みます。

    2

    sample_container.confをArmadillo内の/etc/atmark/containersに配置します。

    descファイルの詳細についてはArmadillo-IoT ゲートウェイ G4の製品マニュアルの「 mkswuのdescファイル」を参照してください。 /usr/share/mkswu/examples以下のdescファイルはサンプルですので、そちらも参考にしてください。

    SWUイメージを作成します。

    [ATDE ~/mkswu/abos-dev-guide-descs]$ mkswu usb_container_sample.desc
    Enter pass phrase for /home/atmark/mkswu/swupdate.key: 1
    以下のファイルをUSBメモリにコピーしてください:
    '/home/atmark/mkswu/abos-dev-guide-descs/usb_container_sample.swu' '/home/atmark/mkswu/abos-dev-guide-descs/abos-dev-guide-v1.0.0.tar' '/home/atmark/mkswu/abos-dev-guide-descs/.usb_container_sample/abos-dev-guide-v1.0.0.tar.sig'
    
    usb_container_sample.swu を作成しました。

    図11.7 SWUイメージの作成


    1

    図11.2「mkswuの初期設定を行う」で設定した証明書の鍵のパスワードを入力してください。

    これでコンテナイメージをインストールし、Armadillo起動時に自動実行するためのSWUイメージが完成しました。

  2. USBメモリにSWUイメージを書き込む

    mkswu実行時に表示された指示に従って、作成したSWUイメージと付属のファイル群をUSBメモリに配置します。 ATDEにUSBメモリを接続して以下を実行してください。

    [ATDE ~/mkswu/abos-dev-guide-descs]$ df -h
    Filesystem                  Size  Used Avail Use% Mounted on
    : (省略)
    /dev/sdb1                   15G   24K   14G    1% /media/atmark/USBDRIVE 1
    
    [ATDE ~/mkswu/abos-dev-guide-descs]$ sudo cp usb_container_sample.swu \
    abos-dev-guide-v1.0.0.tar \
    .usb_container_sample/abos-dev-guide-v1.0.0.tar.sig \
    /media/atmark/USBDRIVE/ 2
    [ATDE ~/mkswu/abos-dev-guide-descs]$ umount /media/atmark/USBDRIVE/ 3

    図11.8 アップデート用ファイル群の配置


    1

    USBメモリがマウントされている場所を確認します。

    2

    ファイル群をコピーします。

    3

    /media/atmark/USBDRIVEをアンマウントします。コマンド終了後にUSBメモリを取り外してください。

  3. SWUpdateの実行

    initial_setupと同様に、ArmadilloにUSBメモリを挿入すると自動的にアップデートが実行され、コンテナイメージの組み込みとコンテナの自動実行設定が行われます。 その後Armadilloが自動的に再起動し、サンプルアプリケーションが自動実行します。

    以上で、SWUpdateを用いてArmadilloにコンテナイメージと自動実行用のconfファイルの配置ができました。 他にもSWUpdateを用いて出来ることは多々ありますので、詳細はArmadillo-IoT ゲートウェイ G4の製品マニュアルの「 Armadilloのソフトウェアをアップデートする」を参照してください。

11.3. Device Treeを変更しハードウェアを拡張する

Armadilloの拡張インターフェースに外部デバイスを接続する際には、対象のピンの機能やパラメータを変更しなければならない場合があります。 具体的には、Armadilloの各ピンの機能やパラメータを記述しているファイルであるDevice Tree Sourceを編集・ビルドし、Armadilloに書き込み、起動時にロードする必要があります。

こちらの詳細は Device Treeをカスタマイズする を参照してください。

11.4. コンテナデザインパターン

Armadillo Base OSでは基本的にユーザーアプリケーションはコンテナ内に格納されます。 場合によっては機能毎にコンテナを複数使用したり、コンテナ内からホストであるArmadillo Base OS側のリソースへのアクセスやコマンド実行をしたりしたい場合などがあります。 この章では、上記のような場合にArmadillo Base OS上でコンテナをどう構築するのが良いかを例を示しつつ紹介します。

11.4.1. 複数コンテナで処理を行いコンテナ間でデータを共有する

ここでは、以下のような処理を行うシステムについて考えます。

  1. Armadilloに接続したセンサからデータを読み出す
  2. 読み出したデータをローカルに保存
  3. 保存したデータをArmadilloに接続したPCで表示できるようにする

このシステムは、1つのコンテナに全ての処理を任せても実現可能ですが、役割毎にコンテナを分けることで以下のようなメリットを得ることができるためおすすめです。

  • 不具合が発生した場合にコンテナ毎に切り分けや修正がしやすい
  • アップデート時にアップデートするコンテナ以外への影響が少ない
  • 再利用性が高い
  • 開発時に分業化しやすい

役割毎にコンテナを分けたシステムの構成図を図11.9「センサから読み取ったデータをPCに出力するシステム構成図」に示します。 なお、図中でグレーアウトしている箇所は使用しない部分、枠が2つ重なっている箇所は二面化されている部分です。

./images/container_design-pattern1.jpg

図11.9 センサから読み取ったデータをPCに出力するシステム構成図


図11.9「センサから読み取ったデータをPCに出力するシステム構成図」に示したシステムにおける各コンテナは以下のような処理を行います。

  • Container1

    • 定期的に/var/app/volumes以下のデータベースからデータを取得する
    • Armadilloに接続しているPCでそのデータを見られるようにする
  • Container2

    • 定期的に外部のセンサからデータを取得する
    • センサから読み取った値を/var/app/volumes以下にデータベースとして配置する

実装のポイントや注意点は以下の通りです。

  • データは/var/app/volumesに保存します

    • ここは二面化されておらず、rollbackが発生しても変化はありません
    • eMMCに書き込むため、電源を切るタイミングによってはデータが破損する可能性があります
    • 各コンテナは同じデータベースに読み書きするため、排他制御する必要があります
    • USBメモリなどの外部ストレージに置き換えても問題ありません

11.4.2. 複数コンテナ間でデータを共有し、クラウドにアップロードする

ここでは、以下のような処理を行うシステムについて考えます。

  1. Armadilloに接続したセンサからデータを読み出す
  2. 読み出したデータをローカルに保存
  3. 読み出したデータをクラウドにアップロードする

このシステムに関しても、役割毎にコンテナを分けることで「複数コンテナで処理を行いコンテナ間でデータを共有する」と同様のメリットを得ることができるためおすすめです。

役割毎にコンテナを分けたシステムの構成図を図11.10「センサからデータを読み取りクラウドに出力するシステム構成図」に示します。 なお、図中でグレーアウトしている箇所は使用しない部分、枠が2つ重なっている箇所は二面化されている部分です。

./images/container_design-pattern2.jpg

図11.10 センサからデータを読み取りクラウドに出力するシステム構成図


図11.10「センサからデータを読み取りクラウドに出力するシステム構成図」に示したシステムにおける各コンテナは以下のような処理を行います。

  • Container1

    • /var/app/rollback/volumes以下に配置したクラウド認証情報を読み出してクラウドに接続する
    • 定期的に/var/app/volumes以下のデータベースからデータを取得する
    • 外部のクラウドにデータをアップロードする
  • Container2

    • 定期的に外部のセンサからデータを取得する
    • センサから読み取った値を/var/app/volumes以下にデータベースとして配置する

実装のポイントや注意点は以下の通りです。

  • データは/var/app/volumesに保存します

    • ここは二面化されておらず、rollbackが発生しても変化はありません
    • eMMCに書き込むため、電源を切るタイミングによってはデータが破損する可能性があります
    • 各コンテナは同じデータベースに読み書きするため、排他制御する必要があります
    • USBメモリなどの外部ストレージに置き換えても問題ありません
  • クラウドの認証情報は/var/app/rollback/volumesに保存します

    • ここは二面化されており、rollbackが発生するとこの中に配置されたファイルも前のバージョンに戻ります
    • 認証情報やコンフィグファイルなどの、アプリケーションのバージョンに依存するようなデータはここに保存することを推奨しています

11.4.3. コンテナを増やす

ここでは、以下のような処理を行うシステムについて考えます。

  1. Armadilloに接続した2つのセンサからデータを読み出す
  2. 読み出したデータをArmadillo内部のデータベースに保存
  3. データベース内のデータをArmadilloに接続したPCで表示できるようにする

基本的には、「複数コンテナで処理を行いコンテナ間でデータを共有する」で紹介したシステムと同一ですが、入力となるセンサが2つに増えています。

この場合、各センサとのインターフェースの差異にもよりますが、先に挙げたメリットのひとつである再利用性を活かして、センサからデータを取得するコンテナを増やすだけで容易に対応することができます。

ただし、コンテナを増やす場合には考慮すべき問題があります。

1つ目は、Armadilloの容量です。 当然ではありますが、コンテナが増えれば増えるほどArmadilloのeMMCの容量を消費します。 コンテナを必要以上に構築するとArmadilloの容量が足りなくなる恐れがあります。 特に、コンテナのベースイメージが異なる場合は容量を大量に消費するので、複数のコンテナを使用する場合はベースイメージを統一するとコンテナのサイズを抑えることができます。

2つ目は処理速度の低下です。 コンテナを分ければ分けるほど、コンテナ1つで全ての処理を行なった際に比べてシステム全体としての処理速度は低下します。 完成したシステムで動作確認を十分に行い、システム全体における動作速度に問題がないことを確認した上で運用してください。 場合によってはセンサ1つに対してコンテナ1つでなく、全てのセンサに対してコンテナを1つにまとめるなど、コンテナを分ける粒度を荒くして動作速度の改善を考えるべきです。

処理毎にコンテナを分けたシステムの構成図を図11.11「複数のセンサからデータを読み取るシステム構成図」に示します。 なお、図中でグレーアウトしている箇所は使用しない部分、枠が2つ重なっている箇所は二面化されている部分です。

./images/container_design-pattern3.jpg

図11.11 複数のセンサからデータを読み取るシステム構成図


図11.10「センサからデータを読み取りクラウドに出力するシステム構成図」に示したシステムにおける各コンテナは以下のような処理を行います。

  • Container1

    • 定期的に/var/app/volumes以下のデータベースからデータを取得する
    • Armadilloに接続しているPCでそのデータを見られるようにする
  • Container2

    • 定期的に外部のセンサ1からデータを取得する
    • センサから読み取った値を/var/app/volumes以下にデータベースとして配置する
  • Container3

    • 定期的に外部のセンサ2からデータを取得する
    • センサから読み取った値を/var/app/volumes以下にデータベースとして配置する

実装のポイントや注意点は、「複数コンテナで処理を行いコンテナ間でデータを共有する」に挙げたものに加えて以下が挙げられます。

  • インターフェースの違いなどにもよりますが、Container2とContainer3はほとんど同じものを使い回すことができます
  • 各コンテナのベースイメージを統一することでコンテナのサイズを抑えることができます

11.4.4. ホストコマンドを実行する

ホスト(Arnadillo Base OS)のコマンドは、コンテナ内から直接実行することはできません。 しかし、実現したいシステムによってはコンテナ内からホストコマンドを実行したいことがあります。

コンテナ内からホストコマンドを実行する方法を以下の2つのパターンに分けて紹介します。

  • ボタン押下や、USB挿抜などのイベントをトリガにホストコマンドを実行する場合
  • コンテナ内から任意のタイミングでホストコマンドを実行する場合

11.4.4.1. イベントをトリガにホストコマンドを実行する

Armadillo Base OSが特定のイベントを検知した際にホストコマンドを実行するように設定できます。 そのため、厳密に言うとコンテナ内からホストコマンドを実行することにはなりませんが、コンテナ内のアプリケーションが動作中でもホストコマンドが実行されます。

トリガとするイベントによって設定方法が異なります。 以下ではudevを用いてデバイスの挿抜を検知してホストコマンドを実行するパターンと、buttondを用いてユーザースイッチや外付けのキーボード等の入力を検知してホストコマンドを実行するパターンの2パターンについて説明します。

  1. udevを用いてUSBメモリの挿入を検知しmountコマンドを実行する

    udevは、Linuxカーネル用のデバイス管理ツールです。 デバイスが接続もしくは接続解除された時にカーネルはueventをudevに通知します。 この時udevは予め設定しておいたルールに従って、受け取ったueventに対応した処理を行います。

    udevを活用することでデバイスの挿抜をトリガに任意のホストコマンドを実行できますので、コンテナ内で何かを設定する必要はありません。

    以下ではUSBメモリの挿抜時にmountコマンドを実行し、/mntディレクトリにマウントする例を紹介します。

    まず、/etc/udev/rules.d/に、99-usb-automount.rulesというファイルを作成して、以下のように内容を編集します。

    [armadillo ~/]# cat /etc/udev/rules.d/99-usb-automount.rules
    ACTION=="add", KERNEL=="sd*", SUBSYSTEM=="block", ENV{ID_FS_USAGE}=="filesystem", RUN+="/bin/mount /dev/%k /mnt"

    その後、以下のコマンドを実行してudevルールの再読込みを行います。

    [armadillo ~/]# udevadm control -R

    以上で設定完了ですので、動作確認をしてみます。

    [armadillo ~/]# mount | grep /mnt 1
    [armadillo ~/]# 2
    [84250.573893] usb 1-1: new high-speed USB device number 8 using xhci-hcd
    [84250.732277] usb-storage 1-1:1.0: USB Mass Storage device detected
    : (省略)
    [84252.013348]  sda: sda1
    [84252.020039] sd 0:0:0:0: [sda] Attached SCSI removable disk
    [84252.214274] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)
    [armadillo ~/]# mount | grep /mnt 3
    /dev/sda1 on /mnt type ext4 (rw,relatime)

    1

    /mntディレクトリに何もマウントされていないことを確認します。

    2

    ここでUSBメモリを挿入します。

    3

    USBメモリが/mntディレクトリに自動的にマウントされていることを確認します。

    動作確認後、persist_fileコマンドを実行して設定したudevルールを永続化します。 -p オプションでアップデートで保存するための /etc/swupdate_preserve_files にも記載します。

    swupdate_preserve_files については Armadillo-IoT ゲートウェイ G4 の製品マニュアルの「 swupdate_preserve_files について」を参照してください。

    [armadillo ~/]# persist_file -p /etc/udev/rules.d/99-usb-automount.rules

    上記手順ではmountを例に紹介しましたが、他のコマンドやシェルスクリプトの実行なども可能です。

  2. buttondを用いてユーザースイッチの押下を検知してホストコマンドを実行する

    Armadillo Base OSには、ユーザースイッチや外付けのキーボードなどの入力をイベントとして検知し、予め定義したルールによってそのイベントに対応させた処理を実行できるbuttondという仕組みがあります。

    buttondについての詳細は、Armadillo-IoT ゲートウェイ G4の製品マニュアルの「 Armadillo Base OSの操作」内の「ボタンやキーを扱う」を参照してしてください。

    以下では、buttondを用いてユーザースイッチを5秒以上長押しするとrebootコマンドを実行する例を紹介します。

    まず、/etc/atmark/buttond.confを以下のように作成して、persist_fileコマンドで永続化します。 また、buttondサービスを再起動させます。

    [armadillo ~/]# vi /etc/atmark/buttond.conf 1
    BUTTOND_ARGS="$BUTTOND_ARGS -l prog1 -t 5000 -a 'reboot'"
    [armadillo ~/]# persist_file /etc/atmark/buttond.conf 2
    [armadillo ~/]# rc-service buttond restart 3

    1

    /etc/atmark/buttond.confを作成・編集します。

    2

    persist_fileコマンドで永続化します。

    3

    buttondサービスを再起動させます。

    その後、Armadillo-IoT ゲートウェイ G4のユーザースイッチ(SW1)を5秒長押しして再起動することを確認してください。

    上記手順ではrebootを例に紹介しましたが、他のコマンドやシェルスクリプトの実行なども可能です。

11.4.4.2. 任意のタイミングでホストコマンドを使用する

「イベントをトリガにホストコマンドを実行する」で紹介した方法は、デバイスの挿抜やスイッチの押下などのイベントをトリガとしてホストコマンドを実行するものでした。

イベントをトリガとせずに任意のタイミングでホストコマンドを実行したい場合は、コンテナからホストに対してsshで接続して実行します。

  1. Armadillo Base OS側の準備1

    まず、sshサーバとなるArmadillo Base OS側の設定を行います。 以下のコマンドを実行して、sshサーバを自動的に起動するよう設定し、sshdサービスを再起動します。

    [armadillo ~/]# rc-update add sshd
     * service sshd added to runlevel default
    [armadillo ~/]# persist_file /etc/runlevels/default/sshd
    [armadillo ~/]# rc-service sshd restart
  2. コンテナの準備

    以下では説明の為にat-debian-imageをベースとしたコンテナを作成します。 予め「サンプルコンテナをビルド」の手順に従って、at-debian-imageのDockerfileからイメージを生成しておく必要があります。

    [armadillo ~/]# podman run -it --name=ssh_sample \
    localhost/at-debian-image:latest /bin/bash
    [container /]#

    コンテナ内で以下のコマンドを実行してsshの準備をします。

    [container /]# apt install -y openssh-client 1
    [container /]# ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa 2
    [container /]# ls /root/.ssh/id_rsa*    3
    /root/.ssh/id_rsa     /root/.ssh/id_rsa.pub
    [container /]# <Ctrl+P> <Ctrl+Q> 4
    [armadillo ~/]#

    1

    openssh-clientをコンテナ内にインストールします。

    2

    公開鍵認証のための認証鍵を生成します。

    3

    公開鍵・秘密鍵が生成されていることを確認します。

    4

    コンテナから抜けます。

  3. Armadillo Base OS側の準備2

    sshサーバであるArmadillo Base OSの方に、先程コンテナ内で生成した公開鍵を登録します。

    [armadillo ~/]# mkdir /root/.ssh
    [armadillo ~/]# chmod 600 /root/.ssh
    [armadillo ~/]# podman exec -it ssh_sample /bin/cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
  4. sshでコンテナ内からホストコマンドを実行

    再度コンテナ側に戻り、ssh経由でホストコマンドであるrebootを実行してみます。 コンテナからArmadillo Base OSへはIPアドレス10.88.0.1でアクセスできます。

    [armadillo ~/]# podman attach ssh_sample
    [container /]# ssh root@10.88.0.1 reboot
    : (省略)

    初回ssh時に、「Are you sure you want to continue connecting (yes/no/[fingerprint])?」と表示される場合があります。 手動実行であればyを選択すれば問題ありませんが、シェルスクリプトなど非手動実行の場合はssh実行時に -o StrictHostKeyChecking=no オプションを指定すると上記質問を回避できます。

    上記手順ではrebootを例に紹介しましたが、他のコマンドやシェルスクリプトの実行なども可能です。

11.5. 機械学習と NPU の使いどころ

Armadillo-IoT ゲートウェイ G4 で採用している i.MX 8M Plus には、機械学習に特化した演算処理 ユニットである NPU (Neural Processor Unit) が搭載されています。 機械学習と聞くと、何でもできるといったイメージが先行してしまいがちですが、そうとも言い切れません。 機械学習を使うためには解決しなければならない課題も多く、 これから開発しようとしている製品やサービスに機械学習という手法がマッチするかどうかは、 それらの課題をよく考慮した上で決定する必要があります。 この章では、機械学習と NPU を採用する前に考慮するべき点、および機械学習以外の方法について説明します。

11.5.1. 機械学習を活用できる範囲

機械学習は主に以下に挙げる 4 つの範囲で活用できます。

表11.1 機械学習の活用範囲

分野 具体例

画像・映像データの処理

不良品検知

顔認識

文字認識

テキストデータの処理

チャットボット

多言語への翻訳

文章要約

音声データの処理

音声認識

数値データの処理

EC サイトのレコメンド機能


Armadillo-IoT ゲートウェイ G4 でこれらのことを実現したい場合は、 NPU を活用した機械学習は選択肢の一つとなります。 これら以外のことを実現したいのであれば、機械学習以外の方法を検討することも必要かもしれません。

11.5.2. NPU でできること

NPU は学習済みデータを使って推論を行うことに特化した演算処理ユニットです。このため、 学習自体には適していません。学習は別途 PC やクラウドサービスなどを使って行う必要があります。 また、NPU は INT8 で量子化された学習データで推論が高速になるように設計されており、 INT8 ではない学習データは CPU で演算が行われるため処理速度は落ちてしまいます。

NPU は以下のツールキットから利用できます。

  • TensorFlow Lite
  • ONNX Runtime
  • ArmNN

これらは、アットマークテクノが提供しているコンテナ at-debian-image であれば、 apt コマンドでインストールすることができます。 プログラミング言語としては Python が広く使われています。

[container /]# apt install tensorflow-lite tensorflow-lite-dev python3-tflite-runtime \
tim-vx tensorflow-lite-vx-delegate

図11.12 TensorFlow Lite のインストール


[container /]# apt install onnxruntime onnxruntime-dev onnxruntime-tools python3-onnxruntime

図11.13 ONNX Runtime のインストール


[container /]# apt install libarmnn22 libarmnn-dev python3-pyarmnn armnn-examples

図11.14 ArmNN のインストール


11.5.3. 機械学習と NPU を使うことの課題

機械学習を用いると従来のアルゴリズムではできなかったことができるようになる反面、 5章仕様を検討・決定する でも言及していますが、以下のような課題を考える必要があります。

  • 学習用に大量のデータを用意する必要がある。
  • 期待したような認識率がでない場合は、いろいろとパラメータを変えて試行錯誤する必要がある。
  • 確率的な処理があるために自動テストが難しい。
  • なぜそういう結果になったのかという理由がブラックボックス化されてしまっている。
  • 長期運用しているとトレンドの変化などで入力の傾向が変化する。
  • 精度が100%となることはない。

11.5.4. 機械学習以外の方法

機械学習を活用しなくても、例えば画像処理や音声処理などであれば以下のようなライブラリがあります。 これらのライブラリでも十分にサービスを提供できるのであれば、採用を検討してもよいかもしれません。

  • OpenCV
  • PIL (Python Image Library)
  • Julius (音声認識エンジン)

この内、OpenCV と Julius はアットマークテクノが提供しているコンテナ at-debian-image であれば、 apt コマンドでインストールできます。 PIL は pip コマンドでインストールできます。

[container /]# apt install libopencv-dev python3-opencv

図11.15 OpenCV のインストール


[container /]# apt install julius

図11.16 Julius のインストール


[container /]# pip3 install pillow

図11.17 PIL のインストール


11.5.4.1. Julius を動かす

ここでは、前章で機械学習以外の方法として紹介した音声認識エンジンである Julius のデモ実行手順を説明します。 細かい設定などの詳細な情報については Julius の 公式サイト のマニュアル等を参照してください。

なお、音声認識のデモであるため Armadillo-IoT ゲートウェイ G4 本体に USBマイク等の 音声入力デバイスを接続しておく必要があります。

準備として、「サンプルコンテナをビルド」 に示した手順通りにコンテナイメージを作成してください。

コンテナを起動してコンテナ内に入ります。

[armadillo /]# podman run -ti \
        --name=julius_demo_container \
        --device=/dev/snd \
        --volume=/run/udev:/run/udev:ro \
        localhost/abos-dev-guide:v0.0.0 /bin/bash
[container /]#

図11.18 コンテナ内に入る


Julius をインストールします。

[container /]# apt install julius

図11.19 コンテナへ Julius をインストール


Julius の 公式サイト から 音声認識パッケージをダウンロードします。 音声認識パッケージパッケージには、音声認識に必要な音響モデルが含まれており、 「ディクテーションキット」、「話し言葉モデルキット」、「講演音声モデルキット」の3つがあります。 ここではディクテーションキットを使用します。他のキットに関する詳細は公式サイトを参照してください。

[container /]# cd
[container ~]# apt install -y unzip wget
[container ~]# wget --trust-server-names https://osdn.net/projects/julius/downloads/71011/dictation-kit-4.5.zip/
[container ~]# unzip dictation-kit-4.5.zip

図11.20 ディクテーションキットのダウンロード


julius コマンドで音声認識を実行します。 <<< please speak >>> と表示された後に、マイクに向かって発話すると、認識された文章が表示されます。

[container ~]# cd dictation-kit-4.5
[container ~]# export ALSADEV="plughw:1,0"
[container ~]# julius -C main.jconf -C am-gmm.jconf -demo
STAT: include config: main.jconf
STAT: include config: am-gmm.jconf
STAT: jconf successfully finalized
: (省略)
<<< please speak >>>
sentence1:  テスト

図11.21 音声認識を実行


11.6. ネットワーク

本章では、Armadillo-IoT ゲートウェイ G4 各製品のネットワーク構成や Podman のネットワーク概要等について説明したうえで、具体的なネットワーク構成を挙げ、その設定方法を記載しています。 さらに、量産製造時に一括してネットワークの設定を行う方法や、運用を開始した後の設定変更の方法についても案内しています。

なお、ネットワーク設定方法を記載していますが、必ずしも記載の通り設定する必要はありません。ご利用の環境・システム構成にあわせて適宜読み替えてください。

11.6.1. Armadillo-IoT ゲートウェイ G4 のネットワーク概要

ここでは、Armadillo-IoT ゲートウェイ G4 のネットワークに関して記載します。

11.6.1.1. ネットワークデバイスの種類

Armadillo-IoT ゲートウェイ G4 は以下の通信規格に対応しています。 利用可能な種別・通信規格と Linux から使用するネットワークデバイスの対応を以下に示します。

表11.2 種別・通信規格とネットワークデバイス

種別・通信規格 ネットワークデバイス 備考

有線LAN(Ethernet)

eth0

有線 LAN インターフェース 1

有線LAN(Ethernet)

eth1

有線 LAN インターフェース 2 [a]

モバイル通信(3G/LTE)

ttyCommModem

LTEモデルのみ搭載 [b]

[a] 10BASE-T 非対応

[b] Quectel 製 EC25-J


11.6.1.2. ネットワーク設定方法

Armadillo-IoT ゲートウェイ G4 では、通常の Linux システムと同様、ネットワークインターフェースの設定は NetworkManager を使用します。 NetworkManager はデフォルトで eth0 と eth1 が自動で up し、DHCP でネットワーク設定を取得するようになっています。

NetworkManager はすべてのネットワーク設定をコネクションとして管理します。 コネクションには「どのようにネットワークへ接続するか」、「どのようにネットワークを作成するか」を記述し、 /etc/NetworkManager/system-connections/ に保存します。 また、1つのデバイスに対して複数のコネクション設定を保存することは可能ですが、1つのデバイスに対して有効化できるコネクションは1つのみです。

NetworkManager は、従来の /etc/network/interfaces を使った設定方法もサポートしていますが、本書では nmclinmtui を用いた方法を中心に紹介します。

  1. nmcli

    nmcli は NetworkManager を操作するためのコマンドラインツールです。

    図11.22「nmcli のコマンド書式」nmcli の書式を示します。このことから、 nmcli は「オブジェクト (OBJECT) というものが存在し、 それぞれのオブジェクトに対してコマンド (COMMAND) を実行する。」という書式でコマンドを入力することがわかります。 また、オブジェクトそれぞれに help が用意されていることもここから読み取れます。

    nmcli [ OPTIONS ] OBJECT { COMMAND | help }

    図11.22 nmcli のコマンド書式


    なお、基本的な使い方については、Armadillo-IoT ゲートウェイ G4の製品マニュアルの「ネットワーク」を参照してください。

  2. nmtui

    nmtui は NetworkManager を操作するためのユーザーフレンドリーなツールです。

    NetworkManager を操作するための画面がテキストユーザーインターフェースで表示されるため、一つずつコマンドを入力する必要がなく、現在の設定項目を確認しながら設定することができます。 ただし、nmtui で設定できる項目には限りがあるため、設定する内容によっては nmcli を使用する必要があります。

    ./images/nmtui_edit_con.png

    図11.23 nmtui 起動後の画面


11.6.2. podman のネットワークの仕組み

Armadillo Base OS では ユーザーアプリケーションを「podman コンテナ」内で動作させますが、 ネットワークの設定は基本的に Armadillo Base OS (ホストOS) の設定に帰結します。 ここでは、 podman のネットワークの仕組みについて説明します。

なお、本項のコマンド実行結果や構成図については Armadillo-IoT ゲートウェイ G4 LTE モデルの内容を記載しており、 記述中の ppp0 は LTE モデルにのみ存在するネットワークインターフェースです。

11.6.2.1. podman のネットワークモード

podman のネットワークモードはブリッジモードがデフォルトです。 その他のモードに指定する場合は、コンテナ作成時に --net オプションを付けることで指定することができます。 例として、podman run 実行時に --net=host を指定すると、host モードになります。

下記でブリッジモードと host モードの2つについて説明します。 その他のモードについては、Podman のドキュメントを参照してください。

  1. ブリッジモード

    前述の通り、ブリッジモードがデフォルトとなります。

    ./images/podman_bridge_mode.png

    図11.24 ブリッジモードの構成


    仮想ブリッジ podman0 がコンテナとホスト OS のネットワークインターフェースを繋ぐ役割を担い、コンテナは veth を経由して仮想ブリッジに接続します。 コンテナから外部に接続する場合は、仮想ブリッジで IPマスカレードが行われます。 そのため、ホスト OS 側で複数のネットワークインターフェースを持っていたとしても、コンテナ内のネットワークインターフェースは eth0(veth) となります。

    ネットワークの設定が基本的に Armadillo Base OS の設定に帰結するのはこの仕組みによるものです。

    実際にコンテナを podman run コマンドで作成し、ホスト OS 側のネットワークインターフェースを確認すると、 podman0 と veth が作成されています。

    [armadillo ~]# podman run -itd --name=my_container --cap-add=NET_ADMIN --cap-add=NET_RAW docker.io/alpine:latest /bin/sh
    eca23e90f6a59bbeee0a92edd88e3c3c24575f9ee061e43ae8a8238e27c2cd4e
    [armadillo ~]# ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000
        link/ether 00:11:00:11:0c:00 brd ff:ff:ff:ff:ff:ff
    3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
        link/ether 0c:00:0a:c4:0a:c3 brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.18/24 brd 192.168.1.255 scope global dynamic noprefixroute eth1
           valid_lft 86328sec preferred_lft 86328sec
        inet6 240d:18:38:cd00:2e4e:94c4:ce84:bc8/64 scope global dynamic noprefixroute
           valid_lft 9031sec preferred_lft 9031sec
        inet6 fe80::a61c:e27c:705a:4d96/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    4: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 3
        link/ppp
        inet 10.231.34.86/32 scope global noprefixroute ppp0
           valid_lft forever preferred_lft forever
    5: podman0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
        link/ether 72:70:b6:93:a5:34 brd ff:ff:ff:ff:ff:ff
        inet 10.88.0.1/16 brd 10.88.255.255 scope global podman0
           valid_lft forever preferred_lft forever
        inet6 fe80::4a4:7dff:fe59:ddfe/64 scope link
           valid_lft forever preferred_lft forever
    6: veth7b836e00@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master podman0 state UP qlen 1000
        link/ether 72:70:b6:93:a5:34 brd ff:ff:ff:ff:ff:ff
        inet6 fe80::7070:b6ff:fe93:a534/64 scope link
           valid_lft forever preferred_lft forever

    図11.25 ブリッジモード時のネットワークインターフェース一覧 (ホスト OS)


    コンテナ内のネットワークインターフェースはこのようになります。

    [container /]# ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP qlen 1000
        link/ether 3e:81:21:41:ed:f2 brd ff:ff:ff:ff:ff:ff
        inet 10.88.0.2/16 brd 10.88.255.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::3c81:21ff:fe41:edf2/64 scope link
           valid_lft forever preferred_lft forever

    図11.26 ブリッジモード時のネットワークインターフェース一覧 (コンテナ内)


  2. host モード

    コンテナ作成時に --net=host オプションをつけると host モードになり、 ホスト OS のネットワークインターフェースをそのままコンテナに渡すことができます。

    ./images/podman_host_mode.png

    図11.27 hostモードの構成


    コンテナを podman run コマンドで作成した時に表示されるログを見ると、ブリッジモードとは異なり、ホスト OS 側に podman0 と veth は存在しません。

    [armadillo ~]# podman run -itd --name=my_container --net=host --cap-add=NET_ADMIN --cap-add=NET_RAW docker.io/alpine:latest /bin/sh
    3f9ce7adcf7c583b6cec0b82f7ec0f3ab134cef41550bd7f9514d48bd6a4986b
    [armadillo ~]# ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000
        link/ether 00:11:00:11:0c:00 brd ff:ff:ff:ff:ff:ff
    3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
        link/ether 0c:00:0a:c4:0a:c3 brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.18/24 brd 192.168.1.255 scope global dynamic noprefixroute eth1
           valid_lft 85893sec preferred_lft 85893sec
        inet6 240d:18:38:cd00:a5a3:440a:4c47:a41c/64 scope global dynamic noprefixroute
           valid_lft 7850sec preferred_lft 7850sec
        inet6 fe80::648f:5ec2:82fb:f291/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    4: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 3
        link/ppp
        inet 10.231.34.86/32 scope global noprefixroute ppp0
           valid_lft forever preferred_lft forever

    図11.28 host モード時のネットワークインターフェース一覧 (ホスト OS)


    コンテナ内のネットワークインターフェースは以下の通り、ホスト OS と同じ内容になります。

    [container /]#  ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000
        link/ether 00:11:00:11:0c:00 brd ff:ff:ff:ff:ff:ff
    3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
        link/ether 0c:00:0a:c4:0a:c3 brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.18/24 brd 192.168.1.255 scope global dynamic noprefixroute eth1
           valid_lft 85621sec preferred_lft 85621sec
        inet6 240d:18:38:cd00:a5a3:440a:4c47:a41c/64 scope global dynamic noprefixroute
           valid_lft 7578sec preferred_lft 7578sec
        inet6 fe80::648f:5ec2:82fb:f291/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    4: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 3
        link/ppp
        inet 10.231.34.86/32 scope global noprefixroute ppp0
           valid_lft forever preferred_lft forever

    図11.29 host モード時のネットワークインターフェース一覧 (コンテナ内)


    host モードは、コンテナからホスト OS のネットワークインターフェースの設定を行いたい場合に適しています。

11.6.2.2. コンテナの IP アドレス

コンテナをブリッジモードにすると veth が作られますが、この veth のアドレスがコンテナ自身のアドレスとなります。 同じネットワークのコンテナ (接続されている仮想ブリッジが同じことを指します) の間では、このアドレスを用いて通信を行うことができます。 コンテナ間の通信については、コンテナ名でも行うことができます。

なお、ユーザー定義のネットワークの設定を行うことにより、固有の IP アドレスを設定することができます。 設定方法の詳細は Armadillo-IoT ゲートウェイ G4の製品マニュアルの「ネットワークを扱う」を参照してください。

11.6.2.3. ネットワーク関連の Capability

コンテナを作成する際には、コンテナ内のアプリケーションの動作内容に応じて、ネットワーク関連の権限を渡すことが必要となります。 開発時は --privileged を設定し全ての権限を渡すことが有用ですが、運用時はセキュリティの都合上、最低限の Capability とすることを推奨します。 ネットワークに関連する代表的な Capability を以下に記載します。

表11.3 ネットワークに関連する代表的な Capability

Capability  

NET_ADMIN

ネットワークスタックを操作する場合に指定

NET_RAW

RAW と PACKET sockets を利用する場合に指定

NET_BIND_SERVICE

特権ポート(1024以下)でリッスンする場合に指定。ただし、コンテナにrootユーザーでloginする場合は考慮不要。


11.6.3. ネットワーク構成例とその設定方法

ここでは、具体的なネットワーク構成を挙げ、その設定方法を紹介します。 なお、必ずしも記載の通り設定する必要はありません。 ご利用の環境・システム構成にあわせて適宜読み替えてください。 また、Armadillo-IoT ゲートウェイ G4 のネットワーク設定が何も行われていない場合を想定して記載しています。

ハードウェア接続方法等については、Armadillo-IoT ゲートウェイ G4の製品マニュアルの「接続方法」を参照してください。

11.6.3.1. 各 Ethernet ポートを ローカルネットワーク に接続し 3G/LTE は WAN に接続する

以下の通り、各 Ethernet ポートそれぞれを別セグメントのローカルネットワークに接続し、 3G/LTE で WAN に接続します。 このとき、 3G/LTE 接続に使用する SIM は固定 IP アドレスが割り当てられるなど WAN 側から接続できるものを想定し、外部からの攻撃を防ぐためファイアーウォールを設定します。

eth0 側のネットワークで シーケンサなどの機器を制御、eth1 側のネットワークは工場内LANに接続しそのデータを集約し、 3G/LTE 経由で Armadillo-IoT ゲートウェイ G4 のコンテナに ssh 接続し、診断を行う場合などに利用できる構成です。

./images/networkdiag_1.png

図11.30 ネットワークの構成


表11.4 ネットワークのアドレス情報

ノード名 ネットワークデバイス IPアドレス ネットワークアドレス

Armadillo

eth0

192.168.10.10

192.168.10.0/24

eth1

192.168.20.20

192.168.20.0/24

ttyCommModem

xxx.xxx.xxx.xxx

xxx.xxx.xxx.xxx

Router1

-

192.168.10.1

192.168.10.0/24

Server1

-

192.168.30.1

192.168.30.0/24

Router2

-

192.168.20.1

192.168.20.0/24

PLC1

-

192.168.40.1

192.168.40.0/24

PLC2

-

192.168.40.2

192.168.40.0/24


  • 設定手順

    上記のネットワークを構築する際のネットワーク設定手順は以下のようになります。全てコンソール上で実行します。 有線 LAN インターフェースの設定については nmclinmtui のそれぞれの手順を記載しています。使いやすい方を選択して設定を行ってください。

    なお、Armadillo-IoT ゲートウェイ G4 は overlayfs を採用しているため、シャットダウンや再起動でシステムを OFF すると作成したファイルが消えてしまいます。 それにより nmcli コマンド等で指定した設定も消えてしまうため、各設定の最後には設定の永続化を行っています。

    また、全ての設定はホスト OS 側で実施します。

    1. 有線 LAN インターフェースの設定

      • nmcli

      下記にコマンドを記載します。表11.5「有線 LAN インターフェース の設定情報(nmcli)」 に記載する内容に置き換えて 有線 LAN インターフェース 1(eth0)、2(eth1) それぞれを設定してください。

      表11.5 有線 LAN インターフェース の設定情報(nmcli)

      eth0 eth1

      interface name

      eth0

      eth1

      connection name

      ethernet-eth0

      ethernet-eth1

      address

      "192.168.10.10/24"

      "192.168.20.20/24"

      route

      "192.168.30.0/24 192.168.10.1"

      "192.168.40.0/24 192.168.20.1"


      [armadillo ~]# nmcli connection add type ethernet ifname [interface name] 1
      [armadillo ~]# nmcli connection modify [connection name] ipv4.method manual ipv4.addresses [address] 2
      [armadillo ~]# nmcli connection modify [connection name] ipv4.routes [route] 3
      [armadillo ~]# nmcli connection modify [connection name] ipv4.never-default yes 4
      [armadillo ~]# nmcli connection down [connection name] 5
      [armadillo ~]# nmcli connection up [connection name] 6

      図11.31 有線 LAN インターフェースの設定を行う (nmcli)


      1

      有線 LAN インターフェースのコネクションを作成します。

      2

      有線 LAN インターフェースのコネクションに固定 IP アドレスを設定します。

      3

      有線 LAN インターフェースのコネクションに経路情報を追加します。

      4

      有線 LAN インターフェースのコネクションのデフォルトゲートウェイを無効化します。

      5

      修正を反映させるため、有線 LAN インターフェースのコネクションを無効化します。

      6

      有線 LAN インターフェースのコネクションを有効化します。

      • nmtui

      下記の通り、nmtui を実行して設定を行います。入力する内容は 表11.6「有線 LAN インターフェース の設定情報(nmtui)」 に記載する内容に置き換えて 有線 LAN インターフェース 1(eth0)、2(eth1) それぞれを設定してください。

      表11.6 有線 LAN インターフェース の設定情報(nmtui)

      eth0 eth1

      Profile name

      ethernet-eth0

      ethernet-eth1

      Device

      eth0

      eth1

      Addresses

      192.168.10.10/24

      192.168.20.20/24

      Destination/Prefix

      192.168.30.0/24

      192.168.40.0/24

      Next Hop

      192.168.10.1

      192.168.20.1


      nmtui を起動します。

      [armadillo ~]# nmtui

      図11.32 nmtui を起動する


      Edit a connection を選択します。

      ./images/nmtui_edit_con.png

      図11.33 nmtui 起動後の画面


      <Add> を選択します。

      ./images/nmtui_connection_list_add.png

      図11.34 nmtui コネクション選択画面


      コネクション種別の選択画面が表示されるので Ethernet を選択します。

      ./images/nmtui_connection_list_add_eth.png

      図11.35 nmtui コネクション種別選択画面


      Profile name Ethernet と Device を入力します。

      ./images/nmtui_edit_con_name.png

      図11.36 nmtui コネクション入力画面


      IPv4 CONFIGURATION を <Manual> に変更し、Show を選択します。 入力画面が表示されるので、 Addresses と Routing を入力します。

      ./images/nmtui_edit_con_ipv4.png

      図11.37 nmtui IPv4設定画面


      Routing については、 <Edit…> 選択後に表示される画面の <Add…> を選択すると入力画面が表示されるので、項目入力後 <OK> を選択してください。

      ./images/nmtui_edit_con_route.png

      図11.38 nmtui Route設定画面


      デフォルトゲートウェイを無効化するため、 <Never use this network for default route> にチェックを入れます。 カーソルを合わせ、スペースキーを押すと、チェックが入ります。

      ./images/nmtui_edit_con_defaultGW.png

      図11.39 nmtui デフォルトゲートウェイ無効化


      全ての設定入力後、 <OK> を選択し設定を保存してください。

      次に、ネットワーク設定を反映させるために一度コネクションを Deactivate します。 コネクション選択画面で <Back> を選択し、 Activate a connection を選択してください。

      現在 Active になっているコネクションには、コネクション名の横に *(アスタリスク) がついています。 もし *(アスタリスク) がついていない場合は、Deactivate 作業はスキップし、Activate を行ってください。

      ./images/nmtui_deactivate.png

      図11.40 nmtui コネクション Activate画面


      対象のコネクションにカーソルを合わせ、 <Deactivate> を選択すると、 *(アスタリスク) が消えます。

      ./images/nmtui_activate.png

      図11.41 nmtui コネクション Deactivate後の画面


      Deactivate 後、再び対象のコネクションにカーソルを合わせ、 <Activate> を選択すると、ネットワーク設定が反映され、 コネクション名の横に *(アスタリスク) が表示されます。

    2. 有線 LAN インターフェース設定の永続化

      [armadillo ~]# persist_file /etc/NetworkManager/system-connections/ethernet-eth0.nmconnection 1
      [armadillo ~]# persist_file /etc/NetworkManager/system-connections/ethernet-eth1.nmconnection 2

      図11.42 有線 LAN インターフェース設定を永続化する


      1

      有線 LAN インターフェース 1(eth0) のコネクション設定ファイルを永続化します。

      2

      有線 LAN インターフェース 2(eth1) のコネクション設定ファイルを永続化します。

    3. 3G/LTE(ttyCommModem) の接続設定

      [armadillo ~]# nmcli connection add type gsm ifname ttyCommModem apn [apn] user [user] password [password] 1
      [armadillo ~]# persist_file /etc/NetworkManager/system-connections/gsm-ttyCommModem.nmconnection 2

      図11.43 3G/LTE 回線の接続設定を行う


      1

      3G/LTE(ttyCommModem) のコネクションを作成します。

      2

      3G/LTE(ttyCommModem) のコネクション設定ファイルを永続化します。

    4. ファイアーウォールの設定

      3G/LTE(ttyCommModem) のファイアーウォールを設定します。 今回は、外部から 50000 番ポートにアクセスされた場合のみ通信を許可するよう設定します。 また、 ICMP プロトコルと DNS( 53 番ポート) も許可しています。

      ここでは、iptables を用いて設定を行っています。IPv6 の場合は、以下の手順の iptables の箇所を ip6tables に置き換えて実行してください。

      [armadillo ~]# iptables -A INPUT -i ppp0 -p tcp --dport 50000 -j ACCEPT 1
      [armadillo ~]# iptables -A INPUT -i ppp0 -p tcp --dport 53 -j ACCEPT 2
      [armadillo ~]# iptables -A INPUT -i ppp0 -p udp --sport 53 -j ACCEPT
      [armadillo ~]# iptables -A INPUT -i ppp0 -p icmp -j ACCEPT 3
      [armadillo ~]# iptables -A INPUT -i ppp0 -j DROP 4

      図11.44 ファイアーウォールの設定を行う


      1

      3G/LTE のネットワークデバイス ppp0 について、50000 番ポートのパケットを許可するよう設定します。

      2

      3G/LTE のネットワークデバイス ppp0 について、 DNS ( 53 番ポート) を許可します。

      3

      3G/LTE のネットワークデバイス ppp0 について、 ICMP プロトコルを許可します。なお、 IPv6 の場合は icmpicmpv6 に置き換えてください。

      4

      3G/LTE のネットワークデバイス ppp0 について、全てのパケットを破棄するよう設定します。

      iptables の設定は overlayfs に関係なくシャットダウンや再起動でシステム OFF すると消えてしまうため、以下の手順で設定を永続化します。

      [armadillo ~]# /etc/init.d/iptables save 1
      [armadillo ~]# persist_file -p /etc/iptables/rules-save 2
      [armadillo ~]# rc-update add iptables 3
      [armadillo ~]# persist_file -p /etc/runlevels/default/iptables 4

      図11.45 ファイアーウォールの設定を永続化する


      1

      iptables の設定をファイルに書き出します。コマンドを実行すると、 /etc/iptables/rules-save に保存されます。

      2

      書き出したファイルを永続化し、-p オプションで OS アップデートの際にもファイルが削除されないように設定します。

      3

      iptables サービスを有効にします。これにより、Armadillo-IoT ゲートウェイ G4 が起動時に iptables が自動起動します。

      4

      iptables サービスの自動起動設定を永続化し、-p オプションで OS アップデートの際にも設定が保持されるように設定します。

      [ティップ]

      ipv6 を使う予定がない場合は完全に無効化できます。IPv4 にフィルターが必要と判断した場合には必ず IPv6 に同様なフィルターを設定するか、IPv6 を無効化してください。

      [armadillo ~]# vi /etc/sysctl.d/20-disable-ipv6.conf
      net.ipv6.conf.all.disable_ipv6=0
      [armadillo ~]# persist_file /etc/sysctl.d/20-disable-ipv6.conf

      図11.46 IPv6 の無効化を行う


  • 設定確認

    1. ネットワークデバイスの状態確認

      設定したネットワークデバイスの状態が connected になっていることを確認します。

      [armadillo ~]# nmcli device
      DEVICE        TYPE      STATE      CONNECTION
      ttyCommModem  gsm       connected  gsm-ttyCommModem
      eth0          ethernet  connected  ethernet-eth0
      eth1          ethernet  connected  ethernet-eth1
      lo            loopback  unmanaged  --
      ppp0          ppp       unmanaged  --

      図11.47 ネットワークデバイスの状態を確認する


    2. IP アドレス設定確認

      [armadillo ~]# ip addr
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
          link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
          inet 127.0.0.1/8 scope host lo
             valid_lft forever preferred_lft forever
          inet6 ::1/128 scope host
             valid_lft forever preferred_lft forever
      2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
          link/ether 00:11:00:11:0c:00 brd ff:ff:ff:ff:ff:ff
          inet 192.168.10.10/24 brd 192.168.10.255 scope global noprefixroute eth0
             valid_lft forever preferred_lft forever
          inet6 fe80::aa84:668a:56ce:5d51/64 scope link noprefixroute
             valid_lft forever preferred_lft forever
      3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
          link/ether 0c:00:0a:c4:0a:c3 brd ff:ff:ff:ff:ff:ff
          inet 192.168.20.20/24 brd 192.168.20.255 scope global noprefixroute eth1
             valid_lft forever preferred_lft forever
          inet6 fe80::bdee:42d6:1307:325e/64 scope link noprefixroute
             valid_lft forever preferred_lft forever
      4: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 3
          link/ppp
          inet 10.231.34.86 peer 10.64.64.64/32 scope global ppp0
             valid_lft forever preferred_lft forever
          inet 10.231.34.86/32 scope global noprefixroute ppp0
             valid_lft forever preferred_lft forever

      図11.48 IP アドレスの設定を確認する


    3. ルーティングテーブルの確認

      [armadillo ~]# route
      Kernel IP routing table
      Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
      default         *               0.0.0.0         U     700    0        0 ppp0
      10.64.64.64     *               255.255.255.255 UH    0      0        0 ppp0
      192.168.10.0    *               255.255.255.0   U     103    0        0 eth0
      192.168.20.0    *               255.255.255.0   U     104    0        0 eth1
      192.168.30.0    192.168.10.1    255.255.255.0   UG    103    0        0 eth0
      192.168.40.0    192.168.20.1    255.255.255.0   UG    104    0        0 eth1

      図11.49 ルーティングテーブルの内容を確認する


    4. ファイアーウォールの確認

      [armadillo ~]# iptables -L
      Chain INPUT (policy ACCEPT)
      target     prot opt source               destination
      ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:50000
      ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
      ACCEPT     udp  --  anywhere             anywhere             udp spt:domain
      ACCEPT     icmp --  anywhere             anywhere
      DROP       all  --  anywhere             anywhere
      
      Chain FORWARD (policy ACCEPT)
      target     prot opt source               destination
      
      Chain OUTPUT (policy ACCEPT)
      target     prot opt source               destination
      
      [armadillo ~]# iptables -S
      -P INPUT ACCEPT
      -P FORWARD ACCEPT
      -P OUTPUT ACCEPT
      -A INPUT -i ppp0 -p tcp -m tcp --dport 50000 -j ACCEPT
      -A INPUT -i ppp0 -p tcp -m tcp --dport 53 -j ACCEPT
      -A INPUT -i ppp0 -p udp -m udp --sport 53 -j ACCEPT
      -A INPUT -i ppp0 -p icmp -j ACCEPT
      -A INPUT -i ppp0 -j DROP

      図11.50 ファイアーウォールの設定を確認する


  • コンテナ作成例

    ここでは、ホスト OS の 50000 番ポートへのアクセスでコンテナの 22 番ポートに接続することができるコンテナの作成手順を紹介します。 コンテナ内での IP アドレスの設定等は必要ありません。

    なお、本項では podman_start を使用してコンテナを作成・起動する方法を記載しています。 「podmanコンテナとアプリケーションの自動実行」 で述べている通り、Armadillo Base OS では /etc/containers/ 以下の .conf ファイルを参照し、 記述されている内容に従ってコンテナを作成します。

    以下に、 IPv4 と IPv6 それぞれの .conf ファイル作成例を記載します。 また、作成した .conf ファイルについても永続化の設定が必要なため、あわせて記載しています。

    [armadillo ~]# cat /etc/atmark/containers/my_container.conf
    set_image docker.io/alpine
    
    add_args -ti
    add_ports 50000:22 1
    set_autostart no 2
    
    set_command sh
    
    [armadillo ~]# persist_file /etc/atmark/containers/my_container.conf 3

    図11.51 .conf ファイル設定例 (IPv4 の場合)


    1

    コンテナの22番ポートをホストの50000番ポートに割り当てます。

    2

    自動起動を無効にしています。自動起動させたい場合は、この行を削除してください。

    3

    設定ファイル my_container.conf ファイルを永続化します。

    [armadillo ~]# cat /etc/atmark/containers/my_net.conf
    set_type network
    add_args --ipv6 1
    
    [armadillo ~]# cat /etc/atmark/containers/my_container.conf
    set_image docker.io/alpine
    
    add_args -ti
    add_ports 50000:22 2
    set_network my_net 3
    set_autostart no 4
    
    set_command sh
    
    [armadillo ~]# persist_file /etc/atmark/containers/my_net.conf 5
    [armadillo ~]# persist_file /etc/atmark/containers/my_container.conf 6

    図11.52 .conf ファイル設定例 (IPv6 の場合)


    1

    --ipv6 オプションを指定してユーザー定義のネットワークを作成します。

    2

    コンテナの22番ポートをホストの50000番ポートに割り当てます。

    3

    作成したユーザー定義のネットワーク名を指定します。

    4

    自動起動を無効にしています。自動起動させたい場合は、この行を削除してください。

    5

    設定ファイル my_net.conf を永続化します。

    6

    設定ファイル my_container.conf を永続化します。

    コンテナの起動方法はそれぞれ下記の通りです。

    [armadillo ~]# podman_start my_container 1

    図11.53 コンテナ起動方法 (IPv4 の場合)


    1

    コンテナを起動します。

    [armadillo ~]# podman_start my_net 1
    [armadillo ~]# podman_start my_container 2

    図11.54 コンテナ起動方法 (IPv6 の場合)


    1

    コンテナ起動前にユーザー定義のネットワークを作成します。 なお、my_net.conf 設定後はArmadillo-IoT ゲートウェイ G4 起動時に自動的にネットワーク my_net が作成されます。

    2

    コンテナを起動します。

    また、下記のコマンドでコンテナ内に入ることができます。

    [armadillo ~]# podman attach my_container

    図11.55 コンテナ内に入る (IPv4, IPv6 共通)


11.6.4. 量産製造時のネットワーク設定

量産製造時に一括してネットワーク設定を行う場合の方法を紹介します。 以下のいずれの場合であっても、 「クローンインストールディスクを用いてイメージ書き込みを行なう」 に示す通り、クローンインストールディスクを用いてネットワーク設定を行います。

11.6.4.1. 全ての機器が同一の設定内容の場合

設定する 3G/LTE の接続情報が同一の場合など、全ての機器で同一のネットワーク設定となる場合は、 8章量産用インストールディスクの作成 の手順に従って作成したクローンインストールディスクを用いることで一括して設定を行うことができます。

11.6.4.2. 機器ごとに設定内容が異なる場合

機器ごとに異なる固定 IP アドレスを設定する場合など、各機器でネットワーク設定が異なる場合は、 「インストール時に任意の処理を行なう」 に示す通り、インストール時に任意の処理を行うようにすることで異なる設定を行うことができます。

異なる固定 IP アドレスを設定する場合の手順については、 「個体ごとに異なる固定IPアドレスを設定する」 に記載しています。 また、インストール時に実行する処理の内容を変えることで、固定 IP アドレス以外にも様々なネットワーク設定を柔軟に行うことができます。

11.6.5. 運用開始後に設定を変更する

ここでは、運用開始後にネットワークの設定を変更する場合の方法について記述します。

運用中の機器に対してネットワークの設定の変更は SWUpdate で実施します。

SWUpdate の詳細は Armadillo-IoT ゲートウェイ G4 の製品マニュアルの「Armadilloのソフトウェアをアップデートする」を参照してください。

11.6.5.1. SWUpdate でネットワーク設定を変更する

SWUpdate は swu というイメージ形式のファイルを用いてアップデートを実行します。

以下は 有線 LAN インターフェース(eth0) の ネットワーク設定を変更する場合の手順を例に説明します。 このパターンでは、 swu イメージにコネクションファイルを含める形となります。

swu ファイル作成に必要となるツール mkswu については、Armadillo-IoT ゲートウェイ G4 の製品マニュアルの「Armadilloのソフトウェアをアップデートする」を参照してください。 なお、 「SWUpdateによる初回アップデート」 に示す mkswu を用いた初回アップデート作業が完了していることを前提としています。

  1. swu イメージの作成

    swu イメージの作成は、 ATDE 上で実施します。

    ATDE 上にコネクションファイルをコピーし、パーミッションを 600 に設定します。

    [ATDE ~/mkswu]# mkdir network-setting && cd network-setting
    [ATDE ~/mkswu/network-setting]# cp /path/to/ethernet-eth0.nmconnection . 1
    [ATDE ~/mkswu/network-setting]# ls
    ethernet-eth0.nmconnection
    [ATDE ~/mkswu/network-setting]# chmod 600 ethernet-eth0.nmconnection 2

    図11.56 ATDE上へのコネクションファイルのコピーとパーミッションの設定を行う


    1

    コネクションファイルをコピーします。コピー元のパスは適宜読み替えてください。

    2

    コネクションファイルのパーミッションを 600 に設定します。

    swu イメージ作成に用いる network-setting.desc ファイルを以下の通り作成します。

    [ATDE ~/mkswu/network-setting]$ cat network-setting.desc
    component=extra_os.nw_eth0
    version=1
    
    swdesc_files --dest /etc/NetworkManager/system-connections "ethernet-eth0.nmconnection" 1

    図11.57 network-setting.desc ファイルを作成する


    1

    ethernet-eth0.nmconnection を Armadillo-IoT ゲートウェイ G4 の /etc/NetworkManager/system-connections/ に配置します。

    mkswu を実行して swu イメージを作成します。

    [ATDE ~/mkswu/network-setting]# mkswu network-setting.desc
    Enter pass phrase for /home/atmark/mkswu/swupdate.key: 1
    network-setting.swu を作成しました。
    
    [ATDE ~/mkswu/network-setting]# ls
    ethernet-eth0.nmconnection  network-setting.desc  network-setting.swu

    図11.58 コネクションファイルを含む swu イメージを作成する


    1

    初回アップデート作業時に指定した鍵のパスワードを入力してください。

  2. swu イメージのインストール

    swu イメージの Armadillo-IoT ゲートウェイ G4 への転送方法ですが、既にネットワークに接続されている場合はリモートアップデートで実施、ネットワーク接続していない機器に対し設定を行う場合は USBメモリを用いて実施するなど、 それぞれの環境に応じて選択してください。

    インストール方法については、Armadillo-IoT ゲートウェイ G4 の製品マニュアルの「Armadilloのソフトウェアをアップデートする」を参照してください。