はじめに
Yocto Projectではmeta-virtualizationでdockerなどのコンテナや仮想化に関する機能を提供している。
dockerを組み込むことは YoctoProject ラズパイ4でdocker で行ったが、コンテナ用イメージ自体を作成することもできるようになっている。
bitbakeで作成したイメージをdockerにインポートするところまで試してみる。
環境構築
作業ディレクトリ
作業ディレクトリを作成する。
$ mkdir -p ~/yocto/scarthgap $ cd ~/yocto/scarthgap
Pokyの取得
scarthgapブランチの最新を使用する場合は下記。
$ git clone git://git.yoctoproject.org/poky.git -b scarthgap
リリースされたタグのバージョンを使用する場合は下記。
$ git clone git://git.yoctoproject.org/poky.git $ git fetch --tags $ git checkout -b tags/scarthgap-5.0.5 scarthgap-5.0.5
環境変数の設定
oe-init-build-envを実行する。
$ source poky/oe-init-build-env build
meta-virtualizationの取得
meta-virtualizationを取得する。
$ bitbake-layers layerindex-fetch meta-virtualization
local.confの修正
qemuのための設定とdockerを組み込むための設定を追加する。
MACHINE ?= "qemuarm64" INIT_MANAGER ?= "systemd" DL_DIR ?= "${TOPDIR}/../downloads" QB_OPT_APPEND:append = " -echr 0x14" EXTRA_IMAGE_FEATURES += "ssh-server-openssh" IMAGE_INSTALL:append = " packagegroup-docker" DISTRO_FEATURES:append = " virtualization" IMAGE_ROOTFS_EXTRA_SPACE = "5242880"
ビルド
bitbakeを実行する。
$ bitbake core-image-base
これで、実行する環境は整った。
コンテナをビルド
app-container.bb
meta-virtualizatoinにはrecipes-demo/images/app-container.bbが提供されている。
このレシピでは、dockerやpodmanにimport可能なイメージが作成できる。
ビルド
$ bitbake app-conatiner
エラー
このようなエラーが発生する
ERROR: Nothing RPROVIDES 'app' (but /home/mickey/seagate/yocto/scarthgap/poky/meta-virtualization/recipes-demo/images/app-container.bb RDEPENDS on or otherwise requires it) NOTE: Runtime target 'app' is unbuildable, removing... Missing or unbuildable dependency chain was: ['app'] ERROR: Required build target 'app-container' has no buildable providers. Missing or unbuildable dependency chain was: ['app-container', 'app']
原因はこれ
OCI_IMAGE_ENTRYPOINT = "/usr/bin/flask-app" CONTAINER_SHELL = "busybox" IMAGE_INSTALL:append = "helloworld-flask" ★これ IMAGE_FSTYPES = "container oci"
このように修正する。
CONTAINER_SHELL = "busybox" -IMAGE_INSTALL:append = "helloworld-flask" +IMAGE_INSTALL:append = " helloworld-flask" IMAGE_FSTYPES = "container oci"
これはmasterブランチでは修正されているので、YP5.2相当では解消される見込み。
コンテナの実行
QEMUの実行
まずはQEMUを起動する。
$ runqemu nographic ... (snip) ... Poky (Yocto Project Reference Distro) 5.0.5 qemuarm64 ttyAMA0 qemuarm64 login: root WARNING: Poky is a reference Yocto Project distribution that should be used for testing and development purposes only. It is recommended that you create your own distribution for production use. root@qemuarm64:~#
起動時のメッセージ
筆者が講師をするセミナでも説明するようにしているが、 「Pokyはあくまでもリファレンスでテスト用なので、製品にそのまま使用することは推奨しない」。
最近のバージョンではOS起動時にその旨のメッセージが表示されるようになっている。
WARNING: Poky is a reference Yocto Project distribution that should be used for testing and development purposes only. It is recommended that you create your own distribution for production use.
コンテナ用イメージの転送
別の端末を開いてコンテナ用イメージをQEMUに転送する。
$ cd tmp/deploy/images/qemuarm64 $ scp ./app-container-qemuarm64.rootfs.tar.bz2 root@192.168.7.2:/root
コンテナの実行
QEMUの端末で操作する。
まずはイメージをインポートする。
# docker import ./app-container-qemuarm64.rootfs.tar.bz2 app:latest # docker images REPOSITORY TAG IMAGE ID CREATED SIZE app latest 000695ac3617 3 minutes ago 269MB
コンテナを実行する。
$ docker run --rm -it app /bin/ls [ 1324.825149] docker0: port 1(vethb3abd02) entered blocking state [ 1324.827097] docker0: port 1(vethb3abd02) entered disabled state [ 1324.827685] vethb3abd02: entered allmulticast mode [ 1324.829767] vethb3abd02: entered promiscuous mode [ 1329.394801] eth0: renamed from vethe3628e0 [ 1329.432275] docker0: port 1(vethb3abd02) entered blocking state [ 1329.433104] docker0: port 1(vethb3abd02) entered forwarding state bin dev home media proc run sys usr boot etc lib mnt root sbin tmp var [ 1331.354307] vethe3628e0: renamed from eth0 [ 1331.380880] docker0: port 1(vethb3abd02) entered disabled state [ 1331.498644] docker0: port 1(vethb3abd02) entered disabled state [ 1331.509925] vethb3abd02 (unregistering): left allmulticast mode [ 1331.510781] vethb3abd02 (unregistering): left promiscuous mode [ 1331.511041] docker0: port 1(vethb3abd02) entered disabled state
実行できた。
まとめ
meta-virtualizationではdockerを組み込むことができるだけではなく コンテナ用のイメージをビルドするためのレシピが提供されている。
これを参考に自分たちのカスタムイメージを作成することができる。 このイメージはdockerだけではなく、podmanでもインポートができる。
現時点では、bitbake時にこれを組み込むような仕組みは用意されていないが、 コンテナベースの組み込みOSを設計・実装するヒントになるかもしれない。