柔軟なカスタマイズを実現する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(日本語版)」


hypervisor


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形式の設定ファイルのみで済ませることができるため、習得工数もほとんど要りません。

hypervisor


LATの使い方

LATは前述した機能の実行時に、その機能により作成する成果物の構成を決めるyamlファイルを指定することにより、期待するパッケージやイメージを作成することができます。LATは段階的に利用します。まずLATを利用してRPMパッケージを作成し、次にLATを利用して作成されたRPMパッケージを含んだイメージを作成します。Initramfsのみの作成や、コンテナイメージの作成もLATにより可能です。LATのドキュメントには、繰り返しLATコマンドが登場しますが、これはそれぞれのLATの機能を段階的に呼び出して、実行しているという意味です。LATを使った開発をする際は、今の作業が開発全体のどの部分に当たるのかを把握することが重要です。

hypervisor

examplesyaml

LATを実行する際に指定するyamlファイルを書いたことが無いエンジニアも多くいると思います。そうした場合に便利な機能が、appsdkツールのexamplesyaml作成機能です。examplesyaml機能を利用すると、カレントディレクトリに"examplesyaml"フォルダを作成し、参考となるyamlファイルを作成してくれます。examplesyaml機能によって作成できるyamlサンプルは下記のとおりです。例えば、appsdkでイメージを作成する際に"core-image-minimal-bcm-2xxx-rpi4.yaml"と"feature/package_management.yaml"を指定することにより、パッケージ管理機能であるdnfを内蔵したminimalイメージを作成することができます。

hypervisor
作成される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(日本語版)」


hypervisor
動画:簡単にカスタマイズ/パッケージ管理もできるLinux Assembly Tools(LAT)
※動画は LTS21 となっておりますが、LTS22 も類似の手順で実行可能です。



hypervisor


Yamlファイルの準備

バイナリイメージを作成する作業では、まず、yamlファイルのテンプレートを作成し、appsdk genimageコマンドを使ってイメージを作成します。

ホストPC上での操作
                        
$ 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(日本語版)」

hypervisor


パッケージへ格納するファイル・ディレクトリ構成を準備する

まず、ソースコードをクロスコンパイルした結果を、サブディレクトリへインストールします。

ホストPC上での操作
                        
$ 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)

ホストPC上での操作
                        
$ 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として作成されます。

ホストPC上での操作
                        
$ appsdk genrpm -f hello.yaml -i /path-to/install-hello 
                        
                    


LATを利用してパッケージサーバーにRPMを公開する

なお、LATにはパッケージサーバーを起動してRPMをHTTPで配信する機能もあります。これを利用することにより、パッケージサーバーからRPMパッケージを入手してインストールできるdnfコマンドを使って、作成したRPMパッケージを簡単にシステムへ統合することができます。

ホストPC上での操作
                        
$ 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"を作成し、以下の内容を記述します。

Wind River Linux上での操作
                        
# 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
                        
                    

以上で準備が整いましたので、パッケージをインストールし、プログラムを実行します。

Wind River Linux上での操作
                        
# 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(日本語版)」

hypervisor


追記後、appsdk genimageコマンドによりイメージを作成します。作成後のバイナリイメージをQEMUで実行する方法は、通常のバイナリイメージを実行する方法と同じです。起動後、helloコマンドが追加されており、実行することができます。

ホストPC上での操作
                        
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
                        
                    
ホストPC上での操作
                        
$ appsdk genimage image-with-hello.yaml
$ appsdk gensdk -f image-with-hello.yaml
                        
                    


組込みシステムでは様々の用途に対応が必要となりますが、LAT は yaml サンプルも活用でき、簡単にカスタマイズイメージを作成できる有用なツールです。ぜひご活用ください

次回はクラウドネイティブ機能を活用できる、コンテナ基盤、Dockerについて解説いたします。さらに LAT でカスタムコンテナイメージをデプロイまで挑戦してみようと思います!

リソース

Previous Next