Armadillo Base OSチュートリアル

本章は、一般的な Linux OS 搭載組み込み機器とArmadillo Base OSの違いや特徴、基礎的なコンテナの使い方など、 Armadillo-900 開発セット の動作確認を進めるうえで必要となる基本知識を身に着け、使い方に慣れるためのチュートリアルです。

4.1. 一般的な Linux OS 搭載組み込み機器との違いと特長

ここでは、一般的な Linux OS 搭載組み込み機器とArmadillo Base OS 搭載機器との違いや特長について説明します。

images/abos-images/development-abos-debian-diff.png
  • コンテナによるアプリケーションの起動

    上記の図に示すように、一般的な Linux OS 搭載組み込み機器ではアプリケーションの実行環境をユーザーランド上に直接用意し、Systemdなどでアプリケーションを自動実行させるのが一般的です。 Armadillo Base OS 搭載機器では、アプリケーションの実行環境をコンテナ内に用意して、「コンテナ起動設定ファイル」を所定の場所に配置することでコンテナ(=アプリケーション)を自動実行させます。 ベースとなるコンテナを生成し、アプリケーションの動作に必要なapt等のパッケージ類、python pip等の各種言語用のライブラリをインストールし、アプリケーション本体を配置します。

  • アクセス権限の分離と付与

    Armadillo Base OSとコンテナは空間分離されており、標準ではコンテナからArmadillo Base OSによって管理されているストレージやシリアル等のインターフェース、ネットワークなどへのアクセスはできません。 「コンテナ起動設定ファイル」で明示的に権限を付与することでこれらへのアクセスが可能になります。

  • セキュアエレメント標準搭載

    Armadillo Base OS 搭載機器は、標準でセキュアエレメントを搭載しており、対応した暗号化方式の認証鍵や証明書を安全に保存・利用することが可能です。

  • ルートファイルシステム領域への書き込み制限と書き込み方法

    一般的な Linux OS 搭載組み込み機器では、ストレージ(NANDフラシュメモリ)の寿命からの保護や、書き込み中の電源断等からのデータ保護のために overlayfs で運用するのが一般的です。 Armadillo Base OS搭載機器でも、Armadillo Base OSのルートファイルシステム領域がoverlayfsによって保護されており、 Linuxの cp コマンド等で書き込みを行っても揮発性のRAM上に保存され、不揮発性のストレージ(eMMC)側に保存されず、電源を入れ直すと消失します。 ルートファイルシステム内のファイルの作成や編集後、ストレージ(eMMC)に永続的に保存するには、明示的に persist_file コマンドを実行する必要があります。

  • Armadillo Base OSの障害発生時のログについて

    一般的な Linux OS 搭載組み込み機器ではシステムが出力するログは /var/log ディレクトリに保存されます。 Armadillo Base OS 搭載機器では、これに加えて、障害発生時のログが /var/at-log ディレクトリに出力されます。これをABOSイベントログと呼びます。 /var/at-log は、ルートファイルシステムとは別のパーティションになっているので、ルートファイルシステムに障害が発生した場合でも、 /var/at-log のパーティションが無事であれば、ログファイルを取り出して、不具合等の解析に利用することができます。

images/abos-images/development-abos-debian-diff-02.png
  • コンテナとArmadillo Base OSの役割分担

    上記の図に示すように、アプリケーションの起動に関わる設定をArmadillo Base OS側で実施し、アプリケーション本体の開発をコンテナ上で実施します。 コンテナの部分にのみ着目すると、Debian等のLinux OS 搭載組み込み機器の開発と同じであり、 異なる部分はアプリケーションの起動設定をArmadillo Base OSに対して行う部分となります。

4.1.1. eMMCパーティション構成の解説

images/abos-images/abos-emmc-part.png
  • eMMCパーティション構成解説

    Armadillo Base OSのalpineルートファイルシステムやKernelイメージ、DTBは二面化されたrootfs_0領域、rootfs_1領域に配置します。 bootloader(U-Boot)やU-Bootの環境変数も二面化されたboot0領域、boot1領域に配置します。これらの領域は原則リードオンリーで使用します。

    Armadillo Base OSが使用するログ領域は、Armadillo Base OSのルートファイルシステムやbootloaderとは分離されておりライト可でマウントしています。 alpineが出力するログを保存する「 /var/log 」とArmadillo Base OSの障害発生時のログを保存する「 /var/at-log 」の2種類があり、「 /var/at-log 」はバックアップされています。

    一部、ルートファイルシステムに含めることのできないファームウェア等を「firmware領域」に配置します。 また、ユーザーが自由に使える「ユーザー利用領域」も用意しています。

  • コンテナ用のApp領域とサブボリューム

    コンテナ本体及びコンテナが使用するデータ等はApp領域に保存します。 App領域はファイルシステム(btrfs形式)でフォーマットされており、btrfsのサブボリュームによって更に細かく領域が分けられています。

    コンテナはサブボリューム( /var/lib/containers/storage_readonly )内に配置され、btrfsのスナップショット機能を用いて二面化されています。 コンテナ用サブボリュームは原則リードオンリーで使用します。

    アプリケーションが使用するログや設定ファイルなどのデータは、コンテナ用サブボリュームとは分離した別のデータ用のサブボリュームをライト可でマウントして使用します。 データ用のサブボリュームには二面化された「 /var/app/rollback/volumes 」 と二面化していない「 /var/app/volumes 」の2種類があり、用途によって使い分けます。

4.2. viエディタを使ってみよう

vi は UNIX 系 OS に標準でインストールされているコマンドラインベースのテキストエディタです。Armadillo にも標準でインストールされています。 vi エディタはモードを持っていることが大きな特徴で、次の2つのモードがあります。

  • コマンドモード: 入力した文字がすべてコマンドとして扱われます。起動直後はこのモードです。ia などを入力すると入力モードに移行します。
  • 入力モード: 文字の入力ができます。ESC キーを入力するとコマンドモードに移行します。

vi エディタを初めて使う際は操作が少し特殊に感じるかもしれませんが、慣れてくると効率的にテキストを編集できるようになります。 本書では Armadillo の設定ファイルの編集などで vi エディタを使用しているため、ここでは vi エディタの使用方法について簡単に解説します。

4.2.1. viの起動

まずは、以下のコマンドを入力して vi を起動します。 file にファイル名のパスを指定すると、ファイルの編集を行います。file が存在しない場合は自動的に新規で作成されます。 また、起動直後はコマンドモードの状態です。

[armadillo ~]# vi [file]

図4.1 viの起動


4.2.2. 文字の入力

文字を入力するために、ia を入力して入力モードへ移行します。 (入力モードに移行すると、画面左下の -I に変わります。) 入力モードに移行した後は、キーを入力することで文字がそのまま入力されます。 下表や下図のように、ia では文字入力の開始位置が異なります。 状況に応じて適宜使い分けてください。

表4.1 入力モードに移行するコマンド

コマンド動作

i

カーソルのある文字の直前から文字入力を開始

a

カーソルのある文字の直後から文字入力を開始


images/common-images/vi-insert-command.svg

図4.2 入力モードに移行するコマンドによる開始位置の違い


入力モードからコマンドモードに戻りたいときは、ESCキーを入力します。 コマンドモードの状態で ESC キーを入力しても何も起こらないため、現在のモードがどちらなのか分からなくなった際は、ひとまずESCキーを入力してコマンドモードへ戻ると良いです。

4.2.3. カーソルの移動

入力モード・コマンドモードどちらの状態でも方向キーを入力してカーソルの移動ができます。 これに加えて、コマンドモードでは下表に示すコマンドを入力することでもカーソルを移動することができます。

表4.2 カーソルの移動コマンド

コマンド動作

h

左に1文字移動

j

下に1文字移動

k

上に1文字移動

l

右に1文字移動


4.2.4. 文字の削除

以下のいずれかの方法で文字を削除できます。 ただし、コンソールの環境によっては入力モードでBS(Backspace)キーを入力しても「^H」文字が表示されるだけで文字が削除できない場合があります。 その場合は後者の方法で文字を削除してください。

  • 入力モードでBS(Backspace)キーを入力する。
  • コマンドモードで下表のコマンドを入力する。

    表4.3 文字の削除コマンド

    コマンド動作

    x

    カーソル上の文字を削除

    dd

    現在行を削除


images/common-images/vi-delete-command.svg

図4.3 文字を削除するコマンドによる削除範囲の違い


4.2.5. 保存と終了

ファイルの保存や終了はコマンドモードで下表のコマンド入力後にEnterキーを押すことでできます。 これらのコマンドは「 : 」(コロン)からはじまるコマンドを使用します。 " : "キーを入力すると画面左下にカーソルが移り、入力したコマンドが表示されます。

表4.4 保存・終了コマンド

コマンド動作

:q!

変更を保存せずに終了

:w[file]

ファイルを file に指定して保存

:wq

ファイルを上書き保存して終了


4.3. persist_file について

Armadillo Base OS ではルートファイルシステムに OverlayFS を採用しています。

図4.4「OverlayFS の構成」のように、Armadillo Base OS では「下位層」である eMMC 上に存在するファイルシステムに対して「上位層」である RAM 上のファイルシステムを統合しています。

images/abos-images/overlayfs.png

図4.4 OverlayFS の構成


このシステムを OverlayFS と呼び、ユーザーランド上では OverlayFS がファイルシステムとして見えています。

Armadillo Base OS でファイルを作成すると RAM 上でファイル(またはディレクトリ)が作成されます。 これにより、ファイル内容を変更した後 Armadillo の電源を切ると変更内容は保持されません。

persist_file コマンドは RAM 上のファイル(またはディレクトリ)を eMMC 上に反映するためのコマンドです。

開発中などに rootfs の変更内容を保持するには、変更したファイルに対して persist_file コマンドを使用する必要があります。

images/abos-images/overlayfs_persist_file.png

図4.5 persist_file コマンドの説明


OverlayFS からファイルを書き込むと RAM 上のファイルに書き込みが行われます。 eMMC 上にのみファイルが存在する場合、図4.6「書き込み時の OverlayFS の挙動」に示すように、そのファイルは eMMC から読み込まれて編集した内容は RAM 上に書き込まれます。

images/abos-images/overlayfs_write.png

図4.6 書き込み時の OverlayFS の挙動


編集内容を eMMC 上のファイルに反映させるためには、図4.7「書き込み後の persist_file コマンドの実行」に示すように、persist_file コマンドを実行する必要があります。

images/abos-images/overlayfs_write_persist_file.png

図4.7 書き込み後の persist_file コマンドの実行


開発以外の時は安全のため、ソフトウェアアップデートによる更新を実行してください。 SWUpdate に関しては 「アップデート機能について」 を参照してください。

rootfs の内容を変更しても、ソフトウェアアップデートを実施した際に変更した内容が保持されない可能性があります。 ソフトウェアアップデート実施後も変更内容を保持する手順に関しては 「swupdate_preserve_files について」 を参照してください。

以下、persist_file コマンドの使い方について説明します。

persist_file コマンドの概要を 図4.8「persist_file のヘルプ」 に示します。

[armadillo ~]# persist_file -h
Usage: /usr/bin/persist_file [options] file [more files...]

Mode selection:
  (none) single entry copy
  -d, --delete   delete file
  -l, --list     list content of overlay
  -a, --apk      apk mode: pass any argument after that to apk on rootfs
  -R, --revert   revert change: only delete from overlay, making it
                 look like the file was reverted back to original state

Copy options:
  -r, --recurse  recursive copy (note this also removes files!)
  -p, --preserve make the copy persist through baseos upgrade
                 by adding entries to /etc/swupdate_preserve_files
  -P, --preserve-post   same, but copy after upgrade (POST)

Delete options:
  -r, --recurse  recursively delete files

Common options:
  -v, --verbose  verbose mode for all underlying commands

Note this directly manipulates overlayfs lower directories
so might need a reboot to take effect

図4.8 persist_file のヘルプ


  1. ファイルの保存・削除手順例

    [armadillo ~]# echo test > test
    [armadillo ~]# persist_file -rv /root
    '/root/test' -> '/mnt/root/test' 1
    '/root/.ash_history' -> '/mnt/root/.ash_history'
    [armadillo ~]# rm -f test
    [armadillo ~]# persist_file -rv /root
    removed '/mnt/root/test' 2
    removed '/mnt/root/.ash_history' 3
    '/root/.ash_history' -> '/mnt/root/.ash_history'

    図4.9 persist_file 保存・削除手順例


    1

    追加・変更したファイルを rootfs へコピーします。

    2

    -r を指定すると、ひとつ前の rm -f コマンドで削除したファイルがrootfsからも削除されますのでご注意ください。

    3

    すでに rootfs に存在するファイルも一度削除してからコピーするため、このようなメッセージが表示されます。

  2. ソフトウェアアップデート後も変更を維持する手順例

    [armadillo ~]# vi /etc/conf.d/podman-atmark 1
    [armadillo ~]# persist_file -P /etc/conf.d/podman-atmark 2
    [armadillo ~]# tail -n 2 /etc/swupdate_preserve_files 3
    # persist_file 20211216
    POST /etc/conf.d/podman-atmark

    図4.10 persist_file ソフトウェアアップデート後も変更を維持する手順例


    1

    何らかのファイルの内容を変更します。

    2

    -P オプションを付与して persist_file を実行します。

    3

    swupdate_preserve_files に追加されたことを確認します。

  3. 変更ファイルの一覧表示例

    [armadillo ~]# mkdir dir
    [armadillo ~]# persist_file -l
    directory          /
    directory          /root
    opaque directory   /root/dir 1
    whiteout           /root/test 2
    regular file       /root/.ash_history
    directory          /etc
    regular file       /etc/resolv.conf
    directory          /var
    symbolic link      /var/lock
    : (省略)

    図4.11 persist_file 変更ファイルの一覧表示例


    1

    rootfs のファイルを見せないディレクトリは opaque directory と表示されます。

    2

    削除したファイルは whiteout と表示されます。

  4. パッケージをインストールする時はapkコマンドを使用してメモリ上にインストールできますが、 persist_file コマンドで rootfs に直接インストールすることも可能です。

    [armadillo ~]# persist_file -a add strace
    (1/3) Installing fts (1.2.7-r1)
    (2/3) Installing libelf (0.185-r0)
    (3/3) Installing strace (5.14-r0)
    Executing busybox-1.34.1-r3.trigger
    OK: 251 MiB in 188 packages
    Install succeeded, but might not work in the running system
    Please reboot if installed program does not work 1
    [armadillo ~]# strace ls
    : (省略)
    exit_group(0)                           = ?
    +++ exited with 0 +++

    図4.12 persist_file でのパッケージインストール手順例


    1

    この例では Armadillo を再起動せずにインストールしたコマンドを使用できましたが、Armadillo の再起動が必要となるパッケージもありますので、その場合は Armadillo を再起動してください。

4.4. Podman を使ってみよう

4.4.1. Podman - コンテナ仮想化ソフトウェアとは

コンテナとはホスト OS 上に展開される仮想的なユーザ空間や、その仮想化技術のことです。 一般的な仮想化では仮想環境内に OS (ゲストOS)が搭載されていますが、 コンテナによる仮想化では、OS をコンテナ内に搭載しない(ゲストOSが無い)という特徴があります。 これにより、一般的な仮想化のように、

  • 異なる個体のハードウェアでも同一の環境を簡単に再現できる(再現性と移植性)
  • セキュリティリスクを低減できる

といった恩恵がありながら、これに加えて、

  • 軽量である
  • アプリケーションの起動が素早い
  • 環境を手軽に構築・削除できる

といったメリットもあります。

Podman はこのようなコンテナを管理するためのソフトウェアです。 Podman は同じコンテナ管理ソフトウェアとしてよく知られている Docker とコマンドインターフェースの互換性がある一方で、 Dockerよりもコンテナ間の独立性が高いなどのセキュリティ的な長所があります。

ABOS では Podman を採用しており、ユーザーアプリケーションはコンテナ内で実行されることを想定しています。 そのため、Podman は ABOS を搭載した Armadillo における根幹の機能であり、 Armadillo を使って機器を開発したり、アプリケーションを開発・運用したりする上で、 Podman やコンテナに関する理解が非常に重要となります。

ここでは、Podman やコンテナに慣れる・上手に活用できるようになる目的で、Podman の使用方法や動作について説明します。

4.4.2. コンテナの基本的な操作

[ティップ]

以下で紹介する Podman のコマンドの多くは、 --help オプションを付けることでより詳細な情報を確認することができます。

[armadillo ~]# podman pull --help

図4.13 podman pull --help 実行例


4.4.2.1. コンテナイメージをダウンロードする

コンテナを作成するためには、その元となるイメージ(コンテナイメージ)が必要です。 まずは、例として、Alpine Linux のコンテナイメージを Docker Hub からダウンロードしてきます。

コンテナイメージのダウンロードは podman pull [source] コマンドでできます。 これはインターネット上のレジストリ(Docker Hubなど)にある指定したイメージ( source )をローカルにダウンロードするコマンドです。

[armadillo ~]# podman pull docker.io/alpine
Trying to pull docker.io/library/alpine:latest...
Getting image source signatures
Writing manifest to image destination
8d591b0b7dea080ea3be9e12ae563eebf9869168ffced1cb25b2470a3d9fe15e

図4.14 コンテナイメージのダウンロード


4.4.2.2. コンテナイメージ一覧を表示する

先ほどダウンロードしたイメージが本当にダウンロードできたかどうかを podman images コマンドで確認します。 これは、ローカルにあるイメージ一覧を表示するコマンドです。

[armadillo ~]# podman images
REPOSITORY                TAG         IMAGE ID      CREATED       SIZE
docker.io/library/alpine  latest      8d591b0b7dea  2 months ago  8.47 MB

図4.15 イメージ一覧


先ほどダウンロードしたイメージがあることを確認できます。

4.4.2.3. イメージからコンテナを作成して起動する

Podman や Docker に詳しい方は podman run コマンドでコンテナの作成&起動ができることをご存知かもしれませんが、 ABOS では podman_start コマンドを積極的に使用してください。 このコマンドはアットマークテクノが用意したコマンドで、 「コンテナ起動設定ファイルを作成する」 で紹介するコンテナの自動起動などでも使用します。

ここでは、簡単な例として "ls /" コマンドを実行するコンテナを podman_start コマンドで作成します。

まず、podman_start コマンドを使用するためには、 コンテナについての設定(コンテナイメージの指定・実行するコマンド・デバイスへのアクセス権限など)を記述したコンフィグファイルを指定の場所に指定のファイル名であらかじめ用意しておきます。 デフォルトでは指定の場所は /etc/atmark/containers/ ディレクトリになります。 ファイル名は"コンテナの名前としたい文字列"に .conf を末尾に付加した文字列になります。

ここでは、my_container というコンテナの名前でコンフィグファイルを作成します。

[armadillo ~]# vi /etc/atmark/containers/my_container.conf
set_image docker.io/alpine 1
set_command ls / 2

図4.16 コンテナの設定ファイルを用意する


1

set_image に元となるコンテナイメージを指定します。ここでは、先ほどダウンロードしたばかりの docker.io/alpine イメージを指定しています。

2

set_command に、実行するコマンドを指定します。ここでは、簡単な例として "ls /" コマンドを指定しています。

コンフィグファイルに記述できる設定内容や、より詳細な説明については 「コンテナ起動設定ファイルを作成する」 を参照してください。

コンフィグファイルを作成したら、いよいよ podman_start コマンドでコンテナの作成&起動を行います。 後ろの引数にコンテナの名前(コンフィグファイル名の .conf を除いた部分)を指定してください。

[armadillo ~]# podman_start my_container
Starting 'my_container'
e9fbb65655be14aee6fb2e2006893050feb3ee8b7a7eceefeb7ff3fd18eb161e
[armadillo ~]#

図4.17 コンテナを作成&起動する


"ls /" を実行するだけの "my_container" という名前のコンテナが作成&起動しました。 コンテナが作成されると同時に "ls /" が実行され、その結果がログに残ります。(後述のコマンドで確認できます)

ここでは簡単な例のために podman_start コマンドを手動で呼び出しましたが、 コンフィグファイルが /etc/atmark/containers/ に置かれていると、Armadillo 起動時に podman_start コマンドでそのコンフィグファイルからコンテナが自動的に作成&起動します。 自動起動が不要な場合にはコンフィグファイルに set_autostart no を記述してください。

4.4.2.4. コンテナのログを確認する

コンテナ内のログは podman logs コマンドで確認できます。 ここでは、簡単な例として "ls /" コマンドを実行するコンテナを起動したため、 そのコマンド結果が表示されることを確認できるはずです。 ここで表示されているのは、コンテナ内部の "/" ディレクトリ内のディレクトリ・ファイル一覧です。

[armadillo ~]# podman logs my_container
bin
dev
:(省略)
usr
var
[armadillo ~]#

図4.18 コンテナのログを確認する


[ティップ]

podman_start でコンテナが正しく起動できない場合は podman_start -v my_containerpodman run のコマンドを確認し、 podman logs my_container で出力を確認してください。

4.4.2.5. コンテナ一覧を表示する

作成したコンテナの一覧は podman ps -a コマンドで確認できます。

[armadillo ~]# podman ps -a
CONTAINER ID  IMAGE                            COMMAND     CREATED         STATUS                     PORTS       NAMES
e9fbb65655be  docker.io/library/alpine:latest  ls /        40 seconds ago  Exited (0) 39 seconds ago              my_container
[armadillo ~]#

図4.19 コンテナ一覧の表示実行例


"ls /"が正常終了したため、STATUSが「Exited (0)」になっていることが確認できます。

また、コンテナ名やコンテナ ID を確認することもできます。-a オプションを付けない場合は、動作中のコンテナのみ表示されます。

4.4.2.6. 実行中のコンテナの中に入る

実行中のコンテナに入り、コンテナ内で CLI 操作するには podman exec コマンドを実行します。 podman exec コマンドでコンテナ内部のシェルを起動すると、コンテナ内部で CLI 操作できるようになります。 ここでは、sleep infinity コマンドを実行して待ち続けるだけのコンテナを作成し、そのコンテナに対して podman exec コマンドでシェルを起動する例を示します。

まずは、先ほどまで使用していた /etc/atmark/containers/my_container.conf を書き換えます。

[armadillo ~]# vi /etc/atmark/containers/my_container.conf
set_image docker.io/alpine
set_command sleep infinity
[armadillo ~]# podman_start my_container
Starting 'my_container'
2782f3ac49b94eeaa37154c21609e102fbff25d5e388e5be5b705b3684aa866b
[armadillo ~]# podman exec -it my_container sh
[container ~]# ps
PID   USER     TIME  COMMAND
    1 root      0:00 /run/podman-init -- sleep infinity
    2 root      0:00 sleep infinity
    3 root      0:00 sh
    4 root      0:00 ps

図4.20 コンテナ内部のシェルを起動する実行例


podman_start コマンドでコンテナを作成&起動し、その後コンテナ内で sh を実行しています。 sh を実行すると、コンテナ内のプロンプトが表示されコンテナ内部で CLI 操作できるようになります。 上記ではコンテナ内で、 ps コマンドを実行しています。コンテナ作成時に実行した sleep infinitypodman exec で実行した sh がプロセスとして存在していることが確認できます。

コンテナ内のシェルから抜ける時は exit コマンドを実行します。

[container ~]# exit
[armadillo ~]#

図4.21 コンテナ内部のシェルから抜ける


4.4.2.7. コンテナを停止する

exit コマンドで抜けても sleep infinity は終了していないため、コンテナはまだ実行中です。 podman stop コマンドで動作中のコンテナを停止します。

[armadillo ~]# podman stop my_container
my_container
[armadillo ~]#

図4.22 コンテナを停止する実行例


4.4.2.8. コンテナを起動する

作成済みのコンテナを再度起動するためには podman start コマンドを実行します。 podman_start コマンドとは違い、podmanstart の間はスペースであることに注意してください。

[armadillo ~]# podman start my_container
my_container
[armadillo ~]#

図4.23 コンテナを起動する実行例


4.4.2.9. コンテナを削除する

作成済みコンテナの削除は podman rm コマンドで行います。 --force オプション無しの場合はあらかじめコンテナを停止しておく必要があります。

[armadillo ~]# podman stop my_container
my_container
[armadillo ~]# podman rm my_container
my_container
[armadillo ~]# podman ps -a
CONTAINER ID  IMAGE                            COMMAND    CREATED         STATUS                    PORTS    NAMES

図4.24 コンテナを削除する


最後の podman ps -a コマンドの出力結果から、コンテナが削除されていることが確認できます。

4.4.2.10. コンテナイメージを削除する

コンテナイメージの削除には podman rmi コマンドを実行します。 イメージを削除するためには、そのイメージから作成したコンテナをあらかじめ削除しておく必要があります。 podman rmi コマンドではイメージの名前か ID を指定する必要があるため、podman images コマンドで確認します。

[armadillo ~]# podman images
REPOSITORY                TAG         IMAGE ID      CREATED       SIZE
docker.io/library/alpine  latest      8d591b0b7dea  2 months ago  8.47 MB
[armadillo ~]# podman rmi docker.io/library/alpine
Untagged: docker.io/library/alpine:latest
Deleted: 8d591b0b7dea080ea3be9e12ae563eebf9869168ffced1cb25b2470a3d9fe15e
[armadillo ~]# podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE
[armadillo ~]#

図4.25 コンテナイメージを削除する


最後の podman images コマンドの出力結果から、コンテナが削除されていることが確認できます。

[ティップ]

podman images で R/O が true として表示される(Read-Only)コンテナイメージについては、 podman rmi を実行するとエラーとなります。 Read-Only のコンテナイメージについては abos-ctrl podman-rw rmi をご使用ください。 abos-ctrl podman-rw については 「コンテナイメージを eMMC に保存する」 を参照してください。

[armadillo ~]# podman images
REPOSITORY                TAG        IMAGE ID      CREATED      SIZE       R/O
docker.io/library/alpine  latest     02480aeb44d7  2 weeks ago  5.62 MB    true
[armadillo ~]# podman rmi docker.io/alpine
Error: cannot remove read-only image "02480aeb44d78f1a44b8791af7edf7d6e1b18707397a1dfb3ff4f21c5ce4a44f"
[armadillo ~]# abos-ctrl podman-rw rmi docker.io/alpine
Untagged: docker.io/library/alpine:latest
Deleted: 02480aeb44d78f1a44b8791af7edf7d6e1b18707397a1dfb3ff4f21c5ce4a44f
[armadillo ~]# podman images
REPOSITORY                TAG        IMAGE ID      CREATED      SIZE

図4.26 Read-Only のイメージを削除する実行例


4.4.2.11. コンテナイメージを作成する

ここまでは、 podman pull でダウンロードしてきたコンテナイメージを元にコンテナを作成してきましたが、 コンテナイメージを元にして新たにカスタマイズしたコンテナイメージを作成することもできます。 これには、どのようにカスタマイズするかを記述した Dockerfilepodman build コマンドを使います。

  1. まずは Dockerfile を用意します

    [armadillo ~]# vi Dockerfile
    FROM docker.io/alpine:latest 1
    
    RUN apk upgrade && apk add python3 && rm -f /var/cache/apk/* 2

    図4.27 Dockerfileの用意


    1

    FROM に元となるコンテナイメージを指定します。指定したコンテナイメージは自動的にダウンロードされるため、あらかじめダウンロードしておく必要はありません。

    2

    RUN に、コンテナイメージ作成時に実行するコマンドを指定します。ここでは、簡単な例として Python3 をインストールしています。

  2. Dockerfile からコンテナイメージを作成します

    [armadillo ~]# podman build -t my_image ./ 1
    STEP 1/2: FROM docker.io/alpine:latest
    STEP 2/2: RUN apk upgrade && apk add python3 && rm -f /var/cache/apk/*
    
    :(省略)
    
    COMMIT my_image
    --> ba6d17aa8020
    Successfully tagged localhost/my_image:latest
    63fe9d38336c9a1b9600ae1f86d85fea2e8f4b3ac72093111a9c15de4bbb73a1

    図4.28 コンテナイメージの作成


    1

    カレントディレクトリにある Dockerfile から my_image という名前でコンテナイメージを作成します。

podman images で、たった今作成したコンテナイメージと、 FROM で指定したことで自動的にダウンロードされたコンテナイメージがあることを確認できます。

[armadillo ~]# podman images
REPOSITORY                TAG         IMAGE ID      CREATED         SIZE
localhost/my_image        latest      63fe9d38336c  11 seconds ago  53.1 MB
docker.io/library/alpine  latest      8d591b0b7dea  2 months ago    8.47 MB
[armadillo ~]#

図4.29 作成したコンテナイメージの確認


4.4.2.12. コンテナをコンテナイメージとして保存する

ここまでは、コンテナイメージからコンテナを作成してきました。 一方で、コンテナからコンテナイメージを作成することもできます。

コンテナはコンテナイメージから一方向的に作成されるため、コンテナに対する変更内容はコンテナが停止してしまうと失なわれてしまいます。 ですが、コンテナからコンテナイメージを作成することで、コンテナが停止してもコンテナに対する変更内容を残しておくことができます。 言い換えれば、コンテナをコンテナイメージとして保存できます。

これには、 podman commit コマンドを使用します。

[armadillo ~]# podman commit my_container hoge_image:latest 1
Getting image source signatures
Copying blob f4ff586c6680 skipped: already exists
Copying blob 3ae0874b0177 skipped: already exists
Copying blob ea59ffe27343 done
Copying config 9ca3c55246 done
Writing manifest to image destination
Storing signatures
9ca3c55246eaac267a71731bad6bfe4b0124afcdd2b80c4f730c46aae17a88f3

図4.30 コンテナをコンテナイメージとして保存する


1

コンテナ my_containerhoge_image という名前のコンテナイメージとして保存します。

podman commitで保存する度に、変更が行なわれた差分が保存されます。 繰り返し差分を保存すると、イメージサイズが大きくなってしまいます。 ストレージ容量が不足する場合は、元となるコンテナイメージから作り直してください。

4.4.2.13. コンフィグファイルとコンテナイメージを永続化する

ここまでで、コンテナイメージのダウンロード・作成( podman pull, podman build )とコンフィグファイルの作成を行いました。 ですが、 podman pullpodman build で用意したコンテナイメージや、作成・変更したコンフィグファイルはデフォルト状態ではメモリ上にしか保存されません。これは、Armadillo Base OS の意図した仕様です。

そのため、このまま Armadillo を終了すると、これらのデータは消えてしまいます。 Armadillo を終了してもデータが消えないようにするためには、 コンフィグファイルは persist_file コマンドで保存し、 コンテナイメージは abos-ctrl podman-storage コマンドで保存します。

(ここではチュートリアルのために簡単な内容のみ記載しています。コンテナイメージを eMMC に保存するためのより本格的な内容については 「コンテナイメージを eMMC に保存する」 を参照してください。)

まず、コンフィグファイルは次の persist_file コマンドで保存します。

[armadillo ~]# persist_file my_container.conf

図4.31 コンフィグファイルを保存する


次に、コンテナイメージは次の abos-ctrl podman-storage コマンドで保存します。

[armadillo ~]# abos-ctrl podman-storage 1
List of images configured on development storage:
REPOSITORY                TAG         IMAGE ID      CREATED         SIZE
localhost/my_image        latest      63fe9d38336c  32 minutes ago  53.1 MB
docker.io/library/alpine  latest      8d591b0b7dea  2 months ago    8.47 MB

What should we do? ([C]opy (default), [N]othing, [D]elete)
C 2

:(省略)

Podman is in tmpfs mode
[armadillo ~]# podman images 3
REPOSITORY                TAG         IMAGE ID      CREATED         SIZE        R/O
localhost/my_image        latest      63fe9d38336c  33 minutes ago  53.1 MB     true
docker.io/library/alpine  latest      8d591b0b7dea  2 months ago    8.46 MB     true
[armadillo ~]#

図4.32 コンテナイメージを保存する


1

abos-ctrl podman-storage をオプション無しで実行します。

2

書き込み可能ストレージにイメージがある場合に対応を聞かれます。今回はコピー(C)します。

3

コピーされたイメージを確認します。イメージが読み取り専用(R/O, Read only)になっていることが確認できます。

4.4.2.14. 開発時に有用な—privilegedオプション

コンテナに、全権限と全てのデバイスへのアクセスを許可するオプション --privileged があります。このオプションを利用すると、コンテナに与えるべき最小の権限を洗い出す必要が無いため、開発時に有用です。

コンフィグファイルに以下の行を追加してください。

add_args --privileged

実運用の際、このオプションを利用することはセキュリティー上問題がある為、開発時にのみご利用ください。コンテナに必要な最低限の権限を与えることをおすすめします。

Podman やコンテナについてのより詳細な使用方法については 「コンテナについて」 を参照してください。

4.5. ストレージを使用する

4.5.1. Armadillo Base OS から直接使用する

ここでは、microSD/microSDHC/microSDXCカードを microSD カードと表記し、microSD カードを接続した場合を例にストレージの使用方法を説明します。

[ティップ]

SDXC/microSDXCカードを使用する場合は、事前に「ストレージのパーティション変更とフォーマット」を参照してフォーマットを行う必要があります。

これは、LinuxカーネルがexFATファイルシステムを扱うことができないためです。 通常、購入したばかりのSDXC/microSDXCカードはexFATファイルシステムでフォーマットされています。

Linuxでは、アクセス可能なファイルやディレクトリは、一つの木構造にまとめられています。 あるストレージデバイスのファイルシステムを、この木構造に追加することを、マウントするといいます。 マウントを行うコマンドは、 mount です。

mount コマンドの典型的なフォーマットは、次の通りです。

mount [device] [dir]

図4.33 mountコマンド書式


[device] には、ストレージデバイスのデバイスファイル名を指定します。 microSDカードのパーティション1の場合は /dev/mmcblk2p1 、パーティション2の場合は /dev/mmcblk2p2 となります。

[dir] には、ストレージデバイスのファイルシステムをマウントするディレクトリを指定します。

microSD スロット (CON1) に microSD カードを挿入し、以下に示すコマンドを実行すると、 /mnt ディレクトリに microSD カードのファイルシステムをマウントすることができます。

microSD カード内のファイルは、/mnt ディレクトリ以下に見えるようになります。

[armadillo ~]# mount /dev/mmcblk2p1 /mnt
[armadillo ~]# ls /mnt

図4.34 ストレージのマウント


ストレージを安全に取り外すには、アンマウントという作業が必要です。

アンマウントを行うコマンドは、 umount です。

オプションとして、アンマウントしたいデバイスがマウントされているディレクトリを指定します。

[armadillo ~]# umount /mnt

図4.35 ストレージのアンマウント


4.5.1.1. ストレージのパーティション変更とフォーマット

通常、購入したばかりの microSD カードや USB メモリは、一つのパーティションを持ち、FAT32ファイルシステムでフォーマットされています。

パーティション構成を変更したい場合、 fdisk コマンドを使用します。

fdisk コマンドの使用例として、一つのパーティションで構成されている microSDカードのパーティションを、2つに分割する例を図4.36「fdiskコマンドによるパーティション変更」に示します。

[armadillo ~]# fdisk /dev/{sd-dev}p1

The number of cylinders for this disk is set to 12608.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): p 1
Disk /dev/mmcblk2p1: 394 MB, 413138944 bytes, 806912 sectors
12608 cylinders, 4 heads, 16 sectors/track
Units: sectors of 1 * 512 = 512 bytes

Device         Boot StartCHS    EndCHS        StartLBA     EndLBA    Sectors  Size Id Type
/dev/mmcblk2p1p1    0,1,1       1023,3,16           16     806911     806896  393M 83 Linux

Command (m for help): d 2
Selected partition 1

Command (m for help): n 3
Partition type
   p   primary partition (1-4)
   e   extended
p 4
Partition number (1-4): 1 5
First sector (16-806911, default 16): 6
Using default value 16
Last sector or +size{,K,M,G,T} (16-806911, default 806911): +100M 7

Command (m for help): n
Partition type
   p   primary partition (1-4)
   e   extended
p
Partition number (1-4): 2 8
First sector (204816-806911, default 204816):
Using default value 204816
Last sector or +size{,K,M,G,T} (204816-806911, default 806911):
Using default value 806911

Command (m for help): w 9
The partition table has been altered.
Calling ioctl() to re-read partition table
fdisk: WARNING: rereading partition table failed, kernel still uses old table: Invalid argument

[armadillo ~]# fdisk /dev/{sd-dev}p1

The number of cylinders for this disk is set to 12608.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): p 10
Disk /dev/mmcblk2p1: 394 MB, 413138944 bytes, 806912 sectors
12608 cylinders, 4 heads, 16 sectors/track
Units: sectors of 1 * 512 = 512 bytes

Device         Boot StartCHS    EndCHS        StartLBA     EndLBA    Sectors  Size Id Type
/dev/mmcblk2p1p1    0,1,1       1023,3,16           16     204815     204800  100M 83 Linux
/dev/mmcblk2p1p2    1023,3,16   1023,3,16       204816     806911     602096  293M 83 Linux

図4.36 fdiskコマンドによるパーティション変更


1

現在のパーティション構成を表示します。

2

現在のパーティションを削除します。

3

新しくパーティションを作成します。

4

プライマリーパーティションを選択します。

5

パーティション1を作成します。

6

パーティション1のセクターの始まりを位置を指定します。

7

パーティション1の最後のセクターの位置を指定します。

8

同様にパーティション2を作成します。

9

上記で設定したパーティション構成を microSD カードに書き込みます。

10

作成したパーティション構成を確認します。

fdisk コマンドの詳細な使い方は、manページ等を参照してください。

FAT32ファイルシステムでストレージデバイスをフォーマットするには、 mkfs.vfat コマンドを使用します。

また、EXT2やEXT3、 EXT4ファイルシステムでフォーマットするには、mkfs.ext2mkfs.ext3mkfs.ext4 コマンドを使用します。

microSDカードのパーティション1をEXT4ファイルシステムでフォーマットするコマンド例を、次に示します。

[armadillo ~]# mkfs.ext4 /dev/mmcblk2p1

図4.37 EXT4ファイルシステムの構築


4.5.2. コンテナ内からストレージを使用する

ここでは、 sd_example という名称の alpine ベースのコンテナを作成し、その中で microSD カードを使用します。 CON1 に microSD カードを挿入してください。

はじめに alpine コンテナイメージをダウンロードします。

[armadillo ~]# podman pull docker.io/alpine
Trying to pull docker.io/library/alpine:latest...
Getting image source signatures
Writing manifest to image destination
8d591b0b7dea080ea3be9e12ae563eebf9869168ffced1cb25b2470a3d9fe15e

図4.38 alpine コンテナイメージをダウンロードする


/etc/atmark/containers/sd_example.conf というファイルを以下の内容で作成します。

set_image docker.io/alpine
add_hotplugs mmc 1
add_args --cap-add=SYS_ADMIN 2
set_command sleep infinity

図4.39 sd_example.conf の内容


1

add_hotplugsmmc を指定することで、 コンテナ内でmicroSD カードをホットプラグで認識します

2

コンテナ内で microSD カードをマウントするための権限を与えます

コンテナを起動し、コンテナの中に入ります。

[armadillo]# podman_start sd_example
Starting 'sd_example'
1d93ecff872276834e3c117861f610a9c6716c06eb95623fd56aa6681ae021d4

[armadillo]# podman exec -it sd_example sh
[container]#

図4.40 sd_example.conf に基づきコンテナを生成


コンテナ内で microSD カードは、 /dev/mmcblk2 として認識されますので /mnt にマウントします。

[container]# mount /dev/mmcblk2p1 /mnt

図4.41 コンテナ内で microSD カードをマウント


4.6. ユーザー登録

アットマークテクノ製品をご利用のユーザーに対して、 購入者向けの限定公開データの提供や大切なお知らせをお届けするサービスなど、 ユーザー登録すると様々なサービスを受けることができます。 サービスを受けるためには、「アットマークテクノ Armadilloサイト」 にユーザー登録をする必要があります。

ユーザー登録すると次のようなサービスを受けることができます。

  • 製品仕様や部品などの変更通知の閲覧・配信
  • 購入者向けの限定公開データのダウンロード
  • 該当製品のバージョンアップに伴う優待販売のお知らせ配信
  • 該当製品に関する開発セミナーやイベント等のお知らせ配信

詳しくは、「アットマークテクノ Armadilloサイト」をご覧ください。

4.6.1. 購入製品登録

ユーザー登録完了後に、購入製品登録することで、「購入者向けの限定公開データ」をダウンロードすることができるようになります。

購入製品登録の詳しい手順は以下のURLをご参照ください。