Appendix

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

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

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

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

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

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

コンテナイメージのサイズはそのイメージの内容によって異なりますが、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.1 コンテナイメージファイルをインポートする


1

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

2

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

3

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

4

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

5

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

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

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

本手順では、SWUpdateを用いてサンプルアプリケーションを含むコンテナイメージと、コンテナを自動実行するためのsample_container.confをArmadilloに書き込む手順を紹介します。

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

まずは開発用PC(本ドキュメントではATDE)でswuイメージを作成します。

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

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

使用しているArmadilloに、過去に一度でもこの初回アップデート作業を行っている場合は二度同じ作業を行うことはできず、する必要もありません。 その際にArmadilloに配置した公開鍵に対応する秘密鍵でアップデートを行いますので、「コンテナイメージを書き込む」に進んでください。

  1. swupdate-mkimage の取得

    SWUpdateでは、ソフトウェアアップデートを行うためにswuイメージというファイルを作成します。 アットマークテクノのGithubリポジトリから、swuイメージを作成するソフトウェアであるswupdate-mkimageをクローンします。

    [ATDE ~/]$ git clone https://github.com/atmark-techno/swupdate-mkimage
    [ATDE ~/]$ cd swupdate-mkimage

    図7.2 swupdate-mkimageの取得


  2. 署名鍵の生成

    genkey.sh を実行して鍵を生成します。 この鍵は、swuイメージを署名するために使用します。

    [ATDE ~/swupdate-mkimage]$ ./genkey.sh --cn abos-dev-guide 1
    Creating signing key swupdate.key and its public counterpart swupdate.pem
    Generating an EC private key
    writing new private key to 'swupdate.key'
    Enter PEM pass phrase:(パスワードを入力) 2
    Verifying - Enter PEM pass phrase:(パスワードを入力) 3
     -----
    swupdate.pem must be copied over to /etc/swupdate.pem on boards.
    The suggested way is using swupdate:
        ./mkimage.sh examples/initial_setup.desc
    Please set user passwords in initial_setup.desc and generate the image.
    If you would like to encrypt your updates, generate your aes key now with:
        ./genkey.sh --aes
    [ATDE ~/swupdate-mkimage]$ ls swupdate.*
    swupdate.key  swupdate.pem 4

    図7.3 署名鍵の生成


    1

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

    2

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

    3

    確認のためもう一度同じパスフレーズを入力します。

    4

    swupdate.key swupdate.pem が生成されます。

  3. 暗号化用鍵の生成

    この手順は行わなくても良いオプションですが、swuイメージの暗号化も行うことができます。 swuイメージの暗号化を行うために、暗号化に利用する鍵を作成します。

    [ATDE ~/swupdate-mkimage]$ ./genkey.sh --aes
    Info: using default aes key path
    Creating encryption keyfile swupdate.aes-key
    You must also enable aes encryption with examples/initial_setup.desc
    or equivalent

    図7.4 暗号化用鍵の作成


  4. 初回アップデート用swuイメージの作成

    生成したswupdate.keyをArmadilloに書き込むためにinitial_setup用のswuイメージを作成します。

    [ATDE ~/swupdate-mkimage]$ python3 -c 'import crypt,getpass; print(crypt.crypt(getpass.getpass(), crypt.METHOD_SHA512))'
    Password: (パスワードを入力) 1
    $6$3g...(省略)...zskUAvyQ1 2
    
    [ATDE ~/swupdate-mkimage]$ vi examples/initial_setup.desc
    : (省略)
    # Set your own passwords for root and atmark users.
    # /!\ The install will fail if this is either are left unset
    # You can generate your own hash with the following command:
    #   python3 -c 'import crypt,getpass; print(crypt.crypt(getpass.getpass(), crypt.METHOD_SHA512))'
    # and update the part within the inner quotes e.g.
    #       "usermod -p '"'$6$hfq6eDj4DpwIbn./$E...(省略)...wlFwBRIekdENJ1/3.'"' root"
    # You can also lock the account, e.g.
    #       "usermod -L atmark"
    swdesc_command --version extra_os.initial_setup 1 \
            "usermod -p '"'$6$3g...(省略)...zskUAvyQ1'"' atmark" \ 3
            "usermod -p '"'$6$3g...(省略)...zskUAvyQ1'"' root" 4
    
    
    # uncomment if you would like to poweroff the system after the update is complete
    #POST_ACTION=poweroff
    
    [ATDE ~/swupdate-mkimage]$ ./mkimage.sh examples/initial_setup.desc 5
    Enter pass phrase for swupdate.key: 6
    : (省略)
    31 blocks
    
    [ATDE ~/swupdate-mkimage]$ ls examples/initial_setup.swu 7
    examples/initial_setup.swu

    図7.5 初回アップデート用swuイメージの作成


    1

    ここで設定したパスワードは、後にアップデート後のArmadilloへのログインパスワードとなります。

    2

    出力された文字列をコピーします。

    3

    「$6$salt$hash」の部分をコピーした文字列に置き換えてください。

    4

    「$6$salt$hash」の部分をコピーした文字列に置き換えてください。

    5

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

    6

    genkey.shで設定したパスフレーズを入力してください。

    7

    initial_setup.swuが生成されたことを確認します。

  5. USBメモリにswuイメージを配置

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

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

    図7.6 swuイメージの配置


    1

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

    2

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

    3

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

  6. ArmadilloにUSBメモリを挿入

    USBメモリを起動しているのArmadilloに挿入すると、自動的にアップデートが開始され、完了すると再起動します。

    rootユーザ、atmarkユーザともに、図7.5「初回アップデート用swuイメージの作成」で設定したパスワードでログインできます。

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

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

7.1.2.2. コンテナイメージを書き込む

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

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

[ATDE ~/swupdate-mkimage]$ mkdir -p abos-dev-guide-descs && cd abos-dev-guide-descs
[ATDE ~/swupdate-mkimage/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 ~/swupdate-mkimage/abos-dev-guide-descs]$ wget https://download.atmark-techno.com/armadillo-iot-g4/example/armadillo-base-os-dev-guide/sample_container.conf

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


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

[ATDE ~/swupdate-mkimage/abos-dev-guide-descs]$ cat usb_container_sample.desc
swdesc_files --version extra_os.containers 1 --dest /etc/atmark/containers sample_container.conf 1
swdesc_usb_container "abos-dev-guide-v1.0.0.tar" --version abos_dev_guide 1 2

図7.8 usb_container_sample.desc作成例


1

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

2

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

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

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

[ATDE ~/swupdate-mkimage/abos-dev-guide-descs]$ ./mkimage.sh -o abos-dev-guide-v1.0.0.swu abos-dev-guide-descs/usb_container_sample.desc

/home/atmark/swupdate-mkimage/.abos-dev-guide-v1.0.0/scripts.tar : 23.86%   ( 51200 =>  12218 bytes, /home/atmark/swupdate-mkimage/.abos-dev-guide-v1.0.0/scripts.tar.zst.tmp)
/home/atmark/swupdate-mkimage/.abos-dev-guide-v1.0.0/___etc_atmark_contai..ample_container_conf_2a867b9b8c5d537126136100b62a7b5d66a4ba73.tar :  4.64%   ( 10240 =>    475 bytes, /home/atmark/swupdate-mkimage/.abos-dev-guide-v1.0.0/___etc_atmark_contai..ample_container_conf_2a867b9b8c5d537126136100b62a7b5d66a4ba73.tar.zst.tmp)
Enter pass phrase for /home/atmark/swupdate-mkimage/swupdate.key: 1
/home/atmark/swupdate-mkimage/swupdate_post.sh : 48.48%   (   922 =>    447 bytes, /home/atmark/swupdate-mkimage/.abos-dev-guide-v1.0.0/swupdate_post.sh.zst.tmp)
Enter pass phrase for /home/atmark/swupdate-mkimage/swupdate.key: 2
sw-description
sw-description.sig
scripts.tar.zst.enc
___etc_atmark_contai..ample_container_conf_2a867b9b8c5d537126136100b62a7b5d66a4ba73.tar.zst.enc
__TMPDIR___var_tmp__..dev_guide_v1_0_0_tar_e89da8078f0d2dcf5f6dd7d5ba057a6a47451494
swupdate_post.sh.zst.enc
34 blocks
\----------------
You have sideloaded containers, copy all these files to USB drive:
'/home/atmark/swupdate-mkimage/abos-dev-guide-v1.0.0.swu' '/home/atmark/swupdate-mkimage/abos-dev-guide-descs/abos-dev-guide-v1.0.0.tar' '/home/atmark/swupdate-mkimage/.abos-dev-guide-v1.0.0/abos-dev-guide-v1.0.0.tar.sig' 3

[ATDE ~/swupdate-mkimage/abos-dev-guide-descs]$ cd ..
[ATDE ~/swupdate-mkimage]$

図7.9 swuイメージの作成


1

genkey.shで設定したパスフレーズを入力してください。

2

genkey.shで設定したパスフレーズを入力してください。

3

ここで挙げられたファイルを全てUSBメモリに書き込みます。

ATDEにUSBメモリを接続し、作成したswuイメージと、付属のファイル群を配置します。

[ATDE ~/swupdate-mkimage]$ df -h
Filesystem                  Size  Used Avail Use% Mounted on
: (省略)
/dev/sdb1                   15G   24K   14G    1% /media/atmark/USBDRIVE 1

[ATDE ~/swupdate-mkimage]$ sudo cp abos-dev-guide-v1.0.0.swu \
abos-dev-guide-descs/abos-dev-guide-v1.0.0.tar \
.abos-dev-guide-v1.0.0/abos-dev-guide-v1.0.0.tar.sig \
/media/atmark/USBDRIVE/ 2
[ATDE ~/swupdate-mkimage]$ umount /media/atmark/USBDRIVE/ 3

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


1

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

2

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

3

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

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

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