柔軟なカスタマイズを実現するLAT
バイナリディストリビューションであるWind River Linux Distroは、ダウンロードしてUSBストレージまたはmicro SDカードへ書き込むだけで使える便利な提供形態です。一方で、組込みLinuxシステムでは、Linuxディストリビューション全体の再構成とはいかないまでも、特定のパッケージを利用したい、特定のソフトウェア構成を導入したい、といった要望もあるかと思います。これらの要望を叶えるWind River Linuxで提供されているツールが「Linux Assembly Tools(LAT)」です。LATを利用することにより、Linuxディストリビュージョンへ追加するRPMパッケージの作成をはじめ、RPMパッケージを統合したイメージの作成や、ソフトウェア開発に利用できるSDKの作成が可能となります。
これにより、組込みシステムのハードウェアリソースを効率的に活用できる小フットプリントのバイナリイメージの作成はもちろん、LATのコンテナイメージ作成機能を使うことにより、複数のコンテナが混在する環境において、各コンテナが必要最低限のリソースのみを消費しサービスを提供できる、高効率なクラウドネイティブアーキテクチャのシステムを実現することができます。
Linux Assembly Tools(LAT)の詳細な利用方法
「WIND RIVER LINUX DISTRO DEVELOPER'S GUIDE, LTS 22(日本語版)」
Linux Assembly Tools(LAT)の特徴
Linux Assembly Toolは、パッケージのビルド、パッケージサーバー構築とパッケージの公開など、簡単にカスタムパッケージのビルド、公開までを支援するツールです。さらに、yaml を使用して、パッケージの追加/削除、設定ファイル記述など様々なニーズに合わせてイメージをカスタマイズすることができます。Wind River Linux Distro の Development SDK には Linux Assembly Tool が同梱されています。Wind River Linux Distroの入手方法は「ビルド無し!バイナリ配布で簡単にはじめるYoctoベースの組込みLinuxディストリビューション」をご参照ください。Wind River Linux DistroのDevelopment SDKをインストールすると"appsdk"というコマンドを介してLATを利用できます。LATは下記の機能を提供します。
機能名 | 概要 |
---|---|
appsdk gensdk | Development SDKを作成 |
appsdk checksdk | 作成されたDevelopment SDKをチェック |
appsdk genrpm | RPMパッケージを作成 |
appsdk publishrpm | RPMパッケージをパッケージサーバーで公開 |
appsdk genimage | バイナリイメージを作成 |
appsdk geninitramfs | initramfsを作成 |
appsdk gencontainer | コンテナイメージを作成 |
appsdk genyaml | バイナリイメージに対応するyamlファイルを作成 |
appsdk exampleyamls | yamlファイルのサンプルを作成 |
LATの大きなメリットは、わずかな設定ファイルでLinuxディストリビュージョンを再構成できる、という点です。ソースコードベースのWind River Linuxもlocal/conf.conf等で設定が可能でしたが(詳細は「ソースコードでゼロからビルドする、Yoctoベースの組込みLinuxディストリビューション」をご参照ください)、LATではyaml形式のファイルにインストールしたい機能や、インストール作業の手順の一部を列挙するだけで、Linuxディストリビュージョンや、それにインストールするRPMパッケージなどを作成することができます。すべての作業をyaml形式の設定ファイルのみで済ませることができるため、習得工数もほとんど要りません。
LATの使い方
LATは前述した機能の実行時に、その機能により作成する成果物の構成を決めるyamlファイルを指定することにより、期待するパッケージやイメージを作成することができます。LATは段階的に利用します。まずLATを利用してRPMパッケージを作成し、次にLATを利用して作成されたRPMパッケージを含んだイメージを作成します。Initramfsのみの作成や、コンテナイメージの作成もLATにより可能です。LATのドキュメントには、繰り返しLATコマンドが登場しますが、これはそれぞれのLATの機能を段階的に呼び出して、実行しているという意味です。LATを使った開発をする際は、今の作業が開発全体のどの部分に当たるのかを把握することが重要です。
examplesyaml
LATを実行する際に指定するyamlファイルを書いたことが無いエンジニアも多くいると思います。そうした場合に便利な機能が、appsdkツールのexamplesyaml作成機能です。examplesyaml機能を利用すると、カレントディレクトリに"examplesyaml"フォルダを作成し、参考となるyamlファイルを作成してくれます。examplesyaml機能によって作成できるyamlサンプルは下記のとおりです。例えば、appsdkでイメージを作成する際に"core-image-minimal-bcm-2xxx-rpi4.yaml"と"feature/package_management.yaml"を指定することにより、パッケージ管理機能であるdnfを内蔵したminimalイメージを作成することができます。
作成されるyamlサンプル | 概要 |
---|---|
container-base-bcm-2xxx-rpi4.yaml | コンテナイメージを作成するためのyaml |
core-image-minimal-bcm-2xxx-rpi4.yaml | minimal imageを作成するためのyaml |
core-image-sato-bcm-2xxx-rpi4.yaml | full imageを作成するためのyaml |
initramfs-ostree-image-bcm-2xxx-rpi4.yaml | initramfsを作成するためのyaml |
wrlinux-image-small-bcm-2xxx-rpi4.yaml | 最小構成のバイナリイメージを作成するためのyaml |
feature/debug-tweaks.yaml | デバッグ機能を使うためのfeature |
feature/install-over-wifi-eap.yaml feature/install-over-wifi-psk.yaml feature/set-wifi-eap.yaml feature/set-wifi-psk.yaml |
WiFi機能を使うためのfeature |
feature/package_management.yaml | パッケージ管理機能(dnf)を使うためのfeature |
feature/set_root_password.yaml | 初期起動時にrootパスワード変更を求めるfeature |
feature/xfce_desktop.yaml | XFCEデスクトップを使うためのfeature |
minimal imageとfull imageに対応するバイナリイメージを作成し、実行する
LATと、LATにより作成できるyamlファイルのテンプレートを利用することにより、Wind River Linux Distroのminimal imageとfull imageに対応するバイナリイメージを作成することができます。バイナリイメージの拡張方法は、本稿の最後で紹介いたします。
Linux Assembly Tools(LAT)の詳細な利用方法
「WIND RIVER LINUX DISTRO DEVELOPER'S GUIDE, LTS 22(日本語版)」
動画:簡単にカスタマイズ/パッケージ管理もできるLinux Assembly Tools(LAT)
※動画は LTS21 となっておりますが、LTS22 も類似の手順で実行可能です。
Yamlファイルの準備
バイナリイメージを作成する作業では、まず、yamlファイルのテンプレートを作成し、appsdk genimageコマンドを使ってイメージを作成します。
$ appsdk exampleyamls
# minimal imageの場合(dnfを追加する)
$ appsdk genimage exampleyamls/core-image-minimal-bcm-2xxx-rpi4.yaml
exampleyamls/feature/package_management.yaml
# full imageの場合
$ appsdk genimage exampleyamls/core-image-sato-bcm-2xxx-rpi4.yaml
上記のコマンドを実行すると、バイナリイメージへ統合するRPMパッケージが自動的に収集され、OSTreeへと登録され、minimal imageとfull imageが完成します。作成するファイルはminimal imageの場合は"core-image-minimal-bcm-2xxx-rpi4.yaml"、full imageの場合は"core-image-sato-bcm-2xxx-rpi4.yaml"です。
作成したイメージをQEMUで実行する手順は下記のとおりです。本手順はminimal imageのものとなっておりますが、full imageの場合もバイナリイメージのパスを変更するだけで実行することができます。
パッケージサーバーを構築して、サーバーからインストールする
LATでRPMを作成する方法は「Using the Linux Assembly Tool to Add a Source Package」を参照してください。システムへ組込みたいソースコードを準備し、Development SDKを使ってクロスコンパイルします。クロスコンパイルの詳細については「はじめてのクロスプラットフォーム開発~組込みLinuxアプリケーションを作ってみよう」をご参照ださい。
Linux Assembly Tools(LAT)の詳細な利用方法
「WIND RIVER LINUX DISTRO DEVELOPER'S GUIDE, LTS 22(日本語版)」
パッケージへ格納するファイル・ディレクトリ構成を準備する
まず、ソースコードをクロスコンパイルした結果を、サブディレクトリへインストールします。
$ wget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
$ tar xzvf hello-2.10.tar.gz
$ cd hello-2.10
$ ./configure $CONFIGURE_FLAGS
$ make
$ make DESTDIR=/path-to/install-hello install
パッケージを作成する
そしてインストールされたディレクトリ構成を基にRPMパッケージを作成します。作成に必要なyamlファイルは以下の通りです(hello.yaml)
$ vi hello.yaml
name: hello
version: '2.10'
release: r0
summary: Hello World Program From Gnu
license: GPLv3
description: |
A simple hello world program that only does one thing.
It's from GNU.
# dirs:
# - /usr
# - /usr/local
# - /usr/local/bin
files:
- /usr/local/bin/hello
post_install: |
#!/bin/sh
echo "This is the post install script of hello program"
echo "It only prints some message."
最後にappsdk genrpmコマンドを利用して、RPMパッケージを作成します。RPMパッケージはコマンドを実行したディレクトリにdeploy/rpmとして作成されます。
$ appsdk genrpm -f hello.yaml -i /path-to/install-hello
LATを利用してパッケージサーバーにRPMを公開する
なお、LATにはパッケージサーバーを起動してRPMをHTTPで配信する機能もあります。これを利用することにより、パッケージサーバーからRPMパッケージを入手してインストールできるdnfコマンドを使って、作成したRPMパッケージを簡単にシステムへ統合することができます。
$ mkdir -p /path-to/http_service_data/third_party_repo
$ python3 -m http.server 8888 --directory /path-to/http_service_data &
$ appsdk publishrpm -r /path-to/http_service_data/third_party_repo deploy/rpms/cortexa72/hello-2.10-r0.cortexa72.rpm
パッケージサーバーからRPMをターゲットへインストールする
それでは最後に、パッケージサーバーより配信されているRPMをdnfコマンドでターゲットへインストールしてみましょう。まず、dnfコマンドが参照するパッケージサーバーを追加するため、ターゲットデバイス上に"/etc/yum.repos.d/test.repo"を作成し、以下の内容を記述します。
# vi /etc/yum.repos.d/test.repo
[appsdk-test-repo]
name=appsdk test repo
baseurl=http://host-IP-address:8888/third_party_repo/
gpgcheck=0
以上で準備が整いましたので、パッケージをインストールし、プログラムを実行します。
# ostree admin unlock --hotfix
# dnf update
# dnf install hello -y
# hello
Hello, world
LATで作成したRPMを含むバイナリイメージを作成する
LATで作成したRPMを含むバイナリイメージの作成は、非常に簡単です。LATでバイナリイメージの作成する際に利用したyamlファイルに、まず、パッケージサーバーを追記し、external-packagesにインストールしたいパッケージ名を追記します。
Linux Assembly Tools(LAT)の詳細な利用方法
「WIND RIVER LINUX DISTRO DEVELOPER'S GUIDE, LTS 22(日本語版)」
追記後、appsdk genimageコマンドによりイメージを作成します。作成後のバイナリイメージをQEMUで実行する方法は、通常のバイナリイメージを実行する方法と同じです。起動後、helloコマンドが追加されており、実行することができます。
machine: bcm-2xxx-rpi4
image_type:
- ostree-repo
- ustart
package_feeds:
- https://distro.windriver.com/dist/wrlinux/lts-21/bcm-2xxx-rpi4/repos/rpm/bcm_2xxx_rpi4
- https://distro.windriver.com/dist/wrlinux/lts-21/bcm-2xxx-rpi4/repos/rpm/cortexa72
- https://distro.windriver.com/dist/wrlinux/lts-21/bcm-2xxx-rpi4/repos/rpm/noarch
- http://host-IP-address:8888/third_party_repo
package_type: rpm
…
packages:
- alsa-utils
- ca-certificates
- crda
…
external-packages:
- hello
$ appsdk genimage image-with-hello.yaml
$ appsdk gensdk -f image-with-hello.yaml
組込みシステムでは様々の用途に対応が必要となりますが、LAT は yaml サンプルも活用でき、簡単にカスタマイズイメージを作成できる有用なツールです。ぜひご活用ください
次回はクラウドネイティブ機能を活用できる、コンテナ基盤、Dockerについて解説いたします。さらに LAT でカスタムコンテナイメージをデプロイまで挑戦してみようと思います!