Appendix

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

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

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

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

7.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

    図7.1 mkswuの取得


  2. mkswuの初期設定

    図7.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'
    アップデートイメージを暗号化しますか? (N/y) y 3
    /home/atmark/mkswu/swupdate.aes-key を作成しました。
    アットマークテクノが作成したイメージをインストール可能にしますか? (Y/n) 4
    rootパスワード: 5
    rootパスワード(確認):
    atmarkユーザのパスワード(空の場合はrootパスワードを使います): 6
    atmarkユーザのパスワード(確認):
    BaseOSイメージのarmadillo.atmark-techno.comサーバーからの自動アップデートを行いますか? (y/N) 7
    /home/atmark/mkswu/initial_setup.swu を作成しました。
    
    "/home/atmark/mkswu/initial_setup.swu" をそのまま使うことができますが、モジュールを追加してイメージを再構築する場合は
    次のコマンドで作成してください: mkswu "/home/atmark/mkswu/initial_setup.desc" other_desc_files
    
    インストール後は、このディレクトリを削除しないように注意してください。
    鍵を失うと新たなアップデートはデバイスの /etc/swupdate.pem
    を修正しないとインストールできなくなります。
    
    [ATDE ~/]$ ls ~/mkswu 8
    initial_setup.desc  initial_setup.swu  mkswu.conf  swupdate.aes-key  swupdate.key  swupdate.pem

    図7.2 mkswuの初期設定を行う


    1

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

    2

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

    3

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

    4

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

    5

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

    6

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

    7

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

    8

    初期化処理の結果生成されたファイルを確認しています。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

    図7.3 swuイメージの配置


    1

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

    2

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

    3

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

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

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

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

    [警告]

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

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

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

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

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

このファイルは、 podman load コマンドを使用することで、別なArmadillo上であってもコンテナイメージとしてインポートすることができます。 サンプルアプリケーションのコンテナイメージを使用した実行例を図7.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

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


1

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

2

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

3

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

4

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

5

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

7.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

    図7.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

    図7.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 を作成しました。

    図7.7 swuイメージの作成


    1

    図7.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

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


    1

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

    2

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

    3

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

  3. SWUpdateの実行

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

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

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

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

以下では、Device Treeについての説明と、開発時及び製造・運用時それぞれの場合においてArmadilloにDevice Treeを書き込む手順について紹介します。 具体的なDevice Treeの記述方法については触れませんが、アットマークテクノが提供するDevice Tree作成ツールを紹介します。

7.3.1. Device Treeとは

Device Treeとは、ハードウェア情報を記述したデータ構造体であり、前述のハードウェア拡張時のパラメータを指定するものです。

Device Treeに対応しているメリットの1つは、ハードウェアの変更に対するソフトウェアの変更が容易になることです。 例えば、Armadillo-IoT ゲートウェイ G4ではCON11(拡張インターフェース1)及び、CON12(拡張インターフェース2)に接続する拡張基板を作成した場合、主にC言語で記述されたLinuxカーネルのソースコードを変更する必要はなく、やりたいことをより直感的に記述できるDTS(Device Tree Source)の変更で対応できます。

ただし、Device Treeは「データ構造体」であるため、ハードウェアの制御方法などの「処理」を記述することはできない点に注意してください。 Device Treeには、CPUアーキテクチャ、RAMの容量、各種デバイスのベースアドレスや割り込み番号などのハードウェア構成情報のみが記述されます。

Device Treeのより詳細な情報については、Linuxカーネルのソースコードに含まれているドキュメント(Documentation/devicetree/)、devicetree.orgで公開されている「Device Tree Specification」を参照してください。

7.3.2. Device Treeをカスタマイズする

DTSファイルを編集し、コンパイルすることでDTB(Device Tree Blob)ファイルが生成されます。 このDTBファイルをArmadilloに書き込むことで、カスタマイズしたDevice TreeでArmadilloを起動することができます。

もちろんエディタでDTSファイルを編集することも可能ですが、アットマークテクノが提供しているat-dtwebというマウス操作でDTS及びDTBを生成できるアプリケーションを使用するのが手軽でおすすめです。

at-dtwebを使用したDevice Treeのカスタマイズ方法については、Armadillo-IoT ゲートウェイ G4の製品マニュアルの「Device Treeをカスタマイズする」を参照してください。

7.3.3. 開発中のDTBファイルの書き換え

Device Treeはその特性上、記述内容に誤りがあるとうまく接続デバイスが動作しない場合や、最悪Armadilloが起動すらしない場合があります。 最初から正しく動作するDTBファイルを作成できるとは限りませんので、開発中はArmadilloの起動に使用するDTBファイルを何度も書き換えなければならない場合があります。 そのようなシステム開発中におけるDTBファイルの書き換え方法の一例について紹介します。

  1. 生成したDTBファイルをArmadilloに転送

    at-dtwebなどで生成したDTBファイルをArmadilloに転送します。 転送方法についてはUSBメモリを使用してして転送したり、図6.29「ATDEからArmadilloへファイルを送信」で紹介しているようにウェブサーバ経由で転送したりするなど、お好きな方法で転送してください。

  2. DTBファイルの書き込み

    転送したDTBファイルを所定のディレクトリ(/boot)にarmadillo.dtbというファイル名で書き込むことで、Armadilloの起動時にそのDTBファイルを使用できるようになります。 /boot/armadillo.dtbは最初から存在しますが、これは上書きしてしまって問題ありません。

    図7.9「DTBファイルの配置」に示すコマンドを実行して、作成したDTBファイル(以下の例ではarmadillo_iotg_g4-at-dtweb.dtb)を/boot/armadillo.dtbに上書きします。

    [armadillo ~/]# ls armadillo_iotg_g4-at-dtweb.dtb
    armadillo_iotg_g4-at-dtweb.dtb
    [armadillo ~/]# rm -f /boot/armadillo.dtb
    [armadillo ~/]# cp armadillo_iotg_g4-at-dtweb.dtb /boot/armadillo.dtb
    [armadillo ~/]# persist_file /boot/armadillo.dtb

    図7.9 DTBファイルの配置


    上記手順でDTBファイルを書き込んだ後にArmadilloを再起動することで、次回以降は作成したDTBを使用して起動します。

7.3.3.1. 作成したDTBファイルに差し替えて期待した動作をしなかった場合

ここまでの手順を実行して、作成したDTBファイルを使用して起動する際に、DTSの記述に誤りがあり期待した動作をしない場合があります。 誤ったDTBファイルに書き換えた場合のArmadilloの挙動として、以下の3つのパターンが考えられます。

  1. 正常に起動するが、拡張したいデバイスや今まで動いていたデバイスを認識しない
  2. Armadilloが正常に起動せず、Armadillo Base OSのロールバック機能が作動する
  3. Armadilloは起動しているが、シリアルコンソールに何も表示されず、何も入力できない

上記のそれぞれのパターンについて対処法を紹介します。

  1. 正常に起動するが、拡張したいデバイスや今まで動いていたデバイスを認識しない場合

    新規にDTSファイルに追加した記述が誤っている、既存の記述を削除や上書きしてしまったなど、作成したDTSファイルの記述に問題がある可能性が高いです。 そのような場合は再度at-dtwebなどでDTSファイルを修正し、新たに生成したDTBファイルをArmadilloに転送する手順からやり直してください。

  2. Armadilloが正常に起動せず、Armadillo Base OSのロールバック機能が作動する場合

    書き込んだDTBファイルが壊れている、DTSファイル内の起動に関わる重要な箇所に誤りがあるなどの可能性が高いです。

    Armadillo Base OSは何らかの原因によってルートファイルシステムが破損し正常に起動できない場合に、前のバージョンに戻して再起動するロールバック機能が自動で働きます。 これによって起動したArmadilloは作成したDTBファイルを書き込む前の状態に戻っているので起動できるはずです。

    Armadillo Base OSのロールバック機能の詳細については、「 ロールバックの確認」を参照してください。

    ロールバック機能が働いたかどうかは起動ログでも確認できますが、以下のコマンドで確認できます。

    [armadillo /]# abos-ctrl status
    Currently booted on /dev/mmcblk2p1
    WARNING: Currently running on non-latest version (expected /dev/mmcblk2p2 installed on Mon Apr  4 15:39:42 JST 2022)
    rollback-status: rolled back 1

    1

    rollback-statusrolled back となっているため、ロールバック機能が働いて起動したことがわかります。

    このような場合は再度at-dtwebなどでDTSファイルを修正し、新たに生成したDTBファイルをArmadilloに転送する手順までをやり直してください。 修正したDTBファイルをArmadilloへ転送後、今起動していない方のルートファイルシステムに修正後のDTBファイルを配置します。

    [armadillo /]# ls armadillo_iotg_g4-at-dtweb.dtb
    armadillo_iotg_g4-at-dtweb.dtb
    [armadillo /]# abos-ctrl mount-old && mount -o remount,rw /target 1
    [armadillo /]# cp armadillo_iotg_g4-at-dtweb.dtb /target/boot/armadillo.dtb 2

    1

    起動していない方のルートファイルシステムを/targetに読み書き可能モードでマウントします。

    2

    armadillo_iotg_g4-at-dtweb.dtbを起動していない方のルートファイルシステムの/boot/armadillo.dtbに上書き保存します。

    その後、以下のコマンドを実行し、現在起動していない方のルートファイルシステムを用いて起動します。

    [armadillo /]# abos-ctrl rollback
    [armadillo /]# reboot

    修正したDTBが誤りがなければ正常に起動します。 誤りが解消されなければ再度ロールバックしますので、再度同様の手順で復旧するまでDTBを修正してください。

  3. Armadilloは起動しているが、シリアルコンソールに何も表示されず、何も入力できない場合

    DTB内のシリアルコンソールを設定する記述に誤りがあり、起動こそしていても何も入出力できない状態になっている可能性が高いです。

    この場合は一度Armadilloの電源を投入し直し、U-bootの環境変数を変更することで、Armadillo-IoT ゲートウェイ G4の標準のDTBで起動するように設定します。

    電源投入後、U-bootにて以下のコマンドを実行します。

    U-Boot 2020.04-at6 (Mar 25 2022 - 08:09:26 +0000)
    :(省略)
    Hit any key to stop autoboot:  0 1
    u-boot=> setenv fdt_file boot/armadillo_iot_g4.dtb 2
    u-boot=> boot 3

    1

    ここでカウントダウンが0になる前に何かキー入力をすることでプロンプトに入ります。

    2

    Armadillo-IoT ゲートウェイ G4の標準のDTB(armadillo_iot_g4.dtb)で起動するよう環境変数を設定します。

    3

    起動します。

    起動後、再度at-dtwebなどでDTSファイルを修正し、新たに生成したDTBファイルをArmadilloに転送する手順からやり直してください。

    次回以降の起動は、また/boot/armadillo.dtbを使用して起動するようになっています。

7.3.4. DTB確定後の書き換え

「開発中のDTBファイルの書き換え」で紹介した方法はあくまでも開発中に何度も書き換える際にのみ推奨している手順です。 最終的に期待した動作をするDTBファイルが完成し、それをArmadilloに書き込む際には前述の手順は非推奨です。 最終的に確定したDTBファイルをArmadilloに書き込む際には、Armadillo Base OSにて提供されているSWUpdateを使用してください。 SWUpdateについては、「SWUpdateを用いてソフトウェアをアップデートする」を参照してください。

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

「SWUpdateによる初回アップデート」の手順を実行し、自分専用の署名鍵でSWUpdateが実行できるようにしておきます。

7.3.4.2. DTBファイルアップデート用のswuイメージを作成する

  1. 作成したDTBファイル配置用のswuイメージを作成する

    まず、適当な作業用ディレクトリ(以下の例では~/mkswu/update-dtb-descs)を作成し、その中に作成したDTBファイルをarmadillo.dtbにリネームして配置します。 DTBファイルへのパスは適宜読み替えてください。 また、今回のswuイメージを作成時に使用するスクリプトファイルもあわせて配置します。

    [ATDE ~/]$ cd mkswu
    [ATDE ~/mkswu]$ mkdir -p update-dtb-descs && cd update-dtb-descs
    [ATDE ~/mkswu/update-dtb-descs]$ cp /path/to/armadillo_iotg_g4-at-dtweb.dtb ./armadillo.dtb
    [ATDE ~/mkswu/update-dtb-descs]$ cp /usr/share/mkswu/examples/update_preserve_files.sh ./

    図7.10 作業用ディレクトリの作成と各種ファイルの配置


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

    [ATDE ~/mkswu/update-dtb-descs]$ cat usb_dtb_sample.desc
    component=extra_os.dtb 1
    version=1 2
    
    swdesc_files --dest /boot \
            "armadillo.dtb" 3
    
    swdesc_script update_preserve_files.sh -- \
            "/boot/armadillo.dtb" 4

    図7.11 usb_dtb_sample.desc作成例


    1

    componentを指定します。今回はrootfsの変更を行うのでextra_osを指定しています。

    2

    バージョンを指定します。今後さらにアップデートする際にはこの数値を上げます。

    3

    /bootにarmadillo.dtbを配置します。

    4

    Armadilloに書き込んだ/boot/armadillo.dtbが今後のOSアップデートによって削除されないように設定します。詳しくは、Armadillo-IoT ゲートウェイ G4の製品マニュアルの「 swupdate_preserve_files について」を参照してください。

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

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

    [ATDE ~/mkswu/update-dtb-descs]$ mkswu usb_dtb_sample.desc
    Enter pass phrase for /home/atmark/mkswu/swupdate.key: 1
    usb_dtb_sample.swu を作成しました。

    図7.12 swuイメージの作成


    1

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

    これでDTBファイルをArmadilloの所定のディレクトリに配置するswuイメージが完成しました。

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

    mkswu実行時に表示された指示に従って、作成したswuイメージをUSBメモリに配置します。 ATDEにUSBメモリを接続して以下を実行してください。

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

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


    1

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

    2

    swuイメージをUSBメモリへコピーします。

    3

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

  3. SWUpdateの実行

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

    自動的に再起動するので、再度Armadilloにログインし、DTBファイルが書き換わって起動していることをご確認ください。

    以上で、作成したDTBファイルをSWUpdateを用いてArmadilloに配置することができました。

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

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

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

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

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

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

7.4.1.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ルールを永続化します。

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

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

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

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

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

    以下では、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を例に紹介しましたが、他のコマンドやシェルスクリプトの実行なども可能です。

7.4.1.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を例に紹介しましたが、他のコマンドやシェルスクリプトの実行なども可能です。

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

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

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

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

表7.1 機械学習の活用範囲

分野 具体例

画像・映像データの処理

不良品検知

顔認識

文字認識

テキストデータの処理

チャットボット

多言語への翻訳

文章要約

音声データの処理

音声認識

数値データの処理

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


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

7.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

図7.14 TensorFlow Lite のインストール


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

図7.15 ONNX Runtime のインストール


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

図7.16 ArmNN のインストール


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

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

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

7.5.4. 機械学習以外の方法

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

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

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

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

図7.17 OpenCV のインストール


[container /]# apt install julius

図7.18 Julius のインストール


[container /]# pip3 install pillow

図7.19 PIL のインストール


7.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 /]#

図7.20 コンテナ内に入る


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

[container /]# apt install julius

図7.21 コンテナへ 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

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


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:  テスト

図7.23 音声認識を実行