今回の初心者講座では、Linuxディストリビューションのカスタマイズ方法を解説します。カスタマイズすることにより、オープンソースの魅力のひとつ「既存のソフトウェア資産の活用」を組み込みLinuxディストリビューションで実現。各セグメントに適応したサービスを効率的に開発することができます。本記事ではWind River Linuxのビルドシステムの特徴とビルドシステムを使ったカスタマイズ方法を解説します。
8本すべて無料!組み込みLinuxウェビナー
組み込みLinuxの基礎知識から、Docker/コンテナ技術の開発方法、さらには起動シーケンスを理解し、実際のLinuxアプリ開発も学べる。開発デモはRaspberry Pi 4を使用しているので、受講後すぐにお試しいただくことで可能です。
視聴申込はこちらから
組み込みボードでWEBサービスとDockerを実行する
第4回と第5回では、組み込みシステムにおいて人気の高いアプリケーション(サービス)を、組み込みボード上で構築する方法を紹介します。文章だけでは理解しにくい内容もありますので、実際にアプリケーションを導入する方法を例に解説します。今回(第4回)は軽量なWEBサービスとして人気の高いnginx(エンジンエックス)を、次回(第5回)はシステムのコンソリデーションに高い効果を発揮するDocker(ドッカー:コンテナー技術)を導入する手順を説明します。お手元で試しながら理解を深めていきましょう。
nginx – Wikipedia
Docker – Wikipedia
Wind River Linux Community版(無償版)のRaspberry Pi 4対応状況について
Wind River Linux Community版(無償版)LTS19では、Raspberry Pi 4 Model B、Revision 1.1及び1.2 、4GBで動作検証しております(※1)。
※1:Raspberry Pi 4 Model B Revision 1.4 では firmware等の変更も必要となります。なお、最新版(2021.10)の Wind River Linux Community版(無償版)LTS21では、Raspberry Pi 4 Model B Revision 1.4 にも対応しています。
目次
組み込みLinuxをカスタマイズするために、Wind River Linuxのビルドシステムを知る
組み込みLinuxをベースとするサービスは、複数のコンポーネントの連携により実現されています。複数のアプリケーション(ユーザーモードパッケージ)や、アプリケーションの実行を支援するライブラリやユーティリティ、ハードウェアを制御するためのBSP(Board-Support-Package:デバイスドライバなど)やカーネルが連携しています。Wind River Linux開発環境では、図1に示す階層構造を定義し、開発者がそれぞれの階層でコンポーネントを取捨選択することで、組み込みLinuxのカスタマイズが可能です。このビルドシステムはYocto Projectそのものを使用していますが、Wind River Linux開発環境は独自の「WRTEMPLATE」を独自に定義、追加することにより、より簡単なカスタマイズ操作を提供します(図1)。
- Recipe
ソースコードを収集しビルドする方法を定義する。 - Layer
Recipeを統合し、実行ファイルや関連するライブラリの組み合わせを定義する。 - WRTEMPLATE
サービスやアプリケーションの構築を円滑化するため、Layerに含まれたWind River Linux独自のカスタマイズ機能。アプリケーションが利用するコンポーネントを闇雲に探すことなく簡単にLinuxディストリビューションにサービスを追加することができる。feature/*と命名されたコンポーネントとして提供されている。 - DISTRO
組み込みLinuxをカスタマイズする際に基となるテンプレート化されたディストリビューション。 - MACINE
ハードウェアを制御するBSP。
組み込みLinux入門に最適な1冊
「市場投入までの期間の短縮」「サポートとメンテナンスコストの削減」「コンプライアンス問題への対応」「クラウドネイティブアーキテクチャとコンテナ技術」など、気になるTopicsを網羅したeBookが無料でダウンロードできます。是非ご覧ください。 無料のeBookをダウンロード
Recipe
Recipeは最も上位の層で、ユーザーモードパッケージやライブラリといったコンポーネントをビルドする機能を提供します。Recipeに記載されたURL、Git、ファイルシステムの位置からソースコードを収集し、インストール用のパッケージへと変換します(図2)。なお、かき集められたソースコードはビルドシステム内の「downloads」に格納されます。
Layer
Layerは、Recipeによって生成されたアプリケーション、ライブラリ、ユーティリティを統合し、関連するソフトウェアのセットを定義します。例えば、Layerにはmeta-networkingやmeta-webserverなどがあります(図3)。依存関係のあるプログラムのRecipeをLayerとしてビルドシステムが定義し、提供することにより、開発者はプログラム間の依存関係に頭を悩ませることなく簡単にアプリケーションの実行環境を整えることができます。なお、デフォルトの設定ではLayerに含まれているRecipeがすべてビルドされるわけでなく、一部のデフォルト有効のRecipeのみがビルドされ、Linuxディストリビューションに組み込まれます。デフォルト無効のRecipeが必要な場合は、設定ファイルにて有効化する必要があります。
WRTEMPLATE
WRTEMPLATEはWind River Linux独自のコンフィグレーション機能です。図4に示すように、WRTEMPLATEはLayerに含まれています。導入したい機能にあわせて機能名(下表はその一例)を設定ファイルへ追記することにより、アプリケーションに必要なコンポーネントを闇雲に探すことなく、簡単にLinuxディストリビューションにサービスを追加することができます。今回の記事ではネットワーク機能をLinuxディストリビューションへ統合するため「feature/openssl-no-weak-ciphers
」を指定します。
WRTEMPLATEの一例 | 概要 |
---|---|
feature/gdb | デバッグ機能 |
feature/docker | コンテナー技術によるサービス統合機能 |
feature/ntp | 時刻同期機能 |
feature/selinux | セキュリティ機能 |
feature/openssl-no-weak-ciphers | 各種ネットワーク連携機能 |
LayerとWRTEMPLATE
Yocto に対してウインドリバー社はアーキテクチャの設計を含む多くの領域で参加しており、Layer構造をはじめ、Yoctoのビルドシステム自身の構築に深くかかわっています。WRTEMPLATE等の機能もこうした知見より生み出されたものです。Wind River Linuxの提供する「WRTEMPLATEによるLinuxディストリビューションの拡張機能」を活用することで、開発者はより簡単に目的の機能を実装する事が出来ます。もちろん、Yoctoの機能も全てお使いいただけます。
DISTROとMACHINE
すべてのプログラムを実行するための土台がDISTROとMACHINEです。DISTROは、Linuxディストリビューションの雛形を提供します。プログラムの実行に不可欠なLinuxカーネルや基本的なライブラリなどが含まれています。MACHINEは、BSPを定義し、プログラムと組み込みボード(ハードウェア)を結合する役割を担います(図5)。
カスタマイズを加えたLinuxディストリビューションの開発方法
ここからは、WEBサーバーアプリケーション「nginx」をRaspberry Pi 4 Model B上で実行できるLinuxディストリビューションに統合する手順を例に、ドキュメントの参照方法をはじめ、ビルドシステムの使い方や実行方法を紹介します。Linuxディストリビューションにnginxが追加されると、Raspberry Pi 4起動後にHTTPサーバ機能が開始され、他のPCからWEBブラウザでコンテンツを参照できるようになります。
Linuxディストリビューションのカスタマイズ手順
Linuxディストリビューションをカスタマイズする方法を図6に示します。まず、①MACHINEにより組み込みボードを選択し、②おおよその基本を備えているDISTROを選択します。次に③組み込みLinuxディストリビューションへ組み込みたいアプリケーション名からRecipe名を特定し、④Recipeを含むWRTEMPLATEとLayerを設定ファイルへ追記します(※2)。最後に⑤設定ファイルにて目的とするRecipeを有効化します。この手順を実施し、Linuxディストリビューションをビルドすることにより、自社製品に必要な機能を備えた組み込みLinux環境を構築することができます。
※2:WRTEMPLATE設定はconf/local.confに、Layer設定はconf/bblayers.confに追記します。
Wind River Linuxに含まれているコンポーネントの一覧を取得する
まず、Wind River Linuxが収集できるMACHINE/DISTRO/WRTEMPLATE/Layer/Recipeの一覧を表示してみましょう。はじめに、Wind River Linux開発環境を開発用PC上にgit clone(ダウンロード)します。次に、git cloneしたスクリプトを./wrlinux-x/setup.sh
と引数なしで実行することにより、下記のUsageメッセージ(スクリプトの使い方)が表示されます。これらのオプションを使いsetup.shを実行することによりコンポーネントの一覧を参照することができます。
$ cd ~ $ git clone --recursive https://github.com/WindRiver-Labs/wrlinux-x.git $ ls wrlinux-x $ ./wrlinux-x/setup.sh (引数を付けずに実行する) ... Layer Listings: --list-distros [all] List available distro values --list-machines [all] List available machine values --list-layers List available layers --list-recipes List available recipes --list-templates [all] List available templates ... $ ./wrlinux-x/setup.sh --list-distros all ... $ ./wrlinux-x/setup.sh --list-machines all ... $ ./wrlinux-x/setup.sh --list-layers ... $ ./wrlinux-x/setup.sh --list-recipes ... $ ./wrlinux-x/setup.sh --list-templates all ...
図7は、setup.shスクリプトを使ってDISTROの一覧を表示した結果です。
統合したいコンポーネントに対応したDISTRO/WRTEMPLATE/Layer/Recipeの設定値を調べる
ウインドリバー社の提供するコンポーネント(DISTRO/WRTEMPLATE/Layer/Recipe)の対応表は「Wind River Linux LTS 19 PRODUCT DOCUMENTATIONのGetting Started」よりExcelドキュメントとしてダウンロードできます。まず、組み込みボードに対応するハードウェアプラットフォーム名のついたExcelシートをダウンロードします。今回はRaspberry Pi 4 Model Bを動作環境として利用するため「Wind River Linux LTS 19 Recipe List for bcm-2xxx-rpi4」を入手します。
ダウンロード後、以下の手順でDISTRO/WRTEMPLATE/Layer/Recipeの設定値を調べることができます(図8)。
- 組み込みLinuxのベースとするDISTROを決定し、シートを選択する。
- 構築するサービスに必要なアプリケーションやライブラリ(コンポーネント)をRecipe列から探す。
- Recipeが含まれているLayer名をLayer列を参照し決定する。
- Recipeを行方向にスライドし[X](有効)がついている列を探す。
- [X]有効セルを含む列名からWRTEMPLATE名を決定する。
なお、Excelではnginx 1.17.0 がサポートと記載されていますが、バージョンアップ後の feature/openssl-no-weak-ciphersnginx では nginxのバージョンを変更し 1.16.1 がサポート対象となります。
結果として、nginxによるWEBサービスを組み込みLinuxへ統合するには、下記の設定が必要であることがわかります。
- MACHINE
bcm-2xxx-rpi4 - DISTRO
wrlinux - WRTEMPLATE
openssl-no-weak-ciphers - Layer
meta-webserver - Recipe
nginx
組み込みLinuxに追加したいアプリケーションのコンポーネント名を調べる
ここまでの操作を動画にて紹介します。
カスタマイズした組み込みLinuxをボード上で実行する
ここまでの手順により、カスタマイズに必要な設定値を確認できました。ここからは、実際にWind River Linuxがビルド時に参照する設定ファイルconf/local.conf
を更新し、Linuxディストリビューションを生成。実機上でアプリケーションを実行する手順を紹介します。なお、本手順を実行する前に第2回で紹介した「Raspberry Pi 4起動用のmicro SDカードを作成する」を実施し、実行環境をセットアップしてください。
Raspberry Pi 4用のWind River Linux開発環境を準備する
まず、Wind River Linux開発環境を入手し、Raspberry Pi 4用に初期化、スクリプトにより設定ファイルを自動生成します。
# ホームディレクトリへ移動します $ cd ~ # 開発用ディレクトリを作成します $ mkdir my-project $ cd my-project # 開発用ディレクトリ内にWind River Linux開発環境をダウンロードする $ git clone --recursive https://github.com/WindRiver-Labs/wrlinux-x.git $ ls wrlinux-x # Raspberry Pi 4用に初期化する $ ./wrlinux-x/setup.sh --machines bcm-2xxx-rpi4 # 開発環境の初期設定スクリプトを実行する $ . ./environment-setup-x86_64-wrlinuxsdk-linux # ビルド用ディレクトリ「small-web-server」を作成する $ . ./oe-init-build-env small-web-server $ pwd /home/aps/my-project/small-web-server # ディレクトリには設定ファイルが含まれている $ ls conf bblayers.conf local.conf templateconf.cfg
追加したいアプリケーション「nginx」の設定値を設定ファイルに追記する
次に、アプリケーション「nginx」を組み込むために必要な下記内容を設定ファイルへ追記します。
- MACHINE = bcm-2xxx-rpi4
… setup.shで指定済 - DISTRO = wrlinux
… conf/local.confで設定 - WRTEMPLATE = feature/openssl-no-weak-ciphers
… conf/local.confで設定 - Layer = meta-webserver
… conf/bblayers.confで設定 - Recipe = nginx
… conf/local.confで設定
$ vi conf/local.conf ### DISTRO、WRTEMPLATE、Recipeを設定する ###(以下の3行を更新する) # (1) 必要なパッケージをネットワークを使ってダウンロードする BB_NO_NETWORK ?= '1' → BB_NO_NETWORK ?= '0' # (2) HTTPサーバ機能の機能を追加する WRTEMPLATE ?= "" → WRTEMPLATE ?= "feature/openssl-no-weak-ciphers" # (3) nginxを追加することを明記する(注意:先頭に半角スペースを入れること) IMAGE_INSTALL_append = " nginx" # (4) ベースとなるディストリビューションを選択する<初期値として入力済み> DISTRO ??= "wrlinux" $ vi conf/bblayers.conf ### Layerを設定する ###(meta-webserverが含まれていることを確認する)<初期値として入力済み>
Linuxディストリビューションをビルドする
設定後、Linuxディストリビューションをbitbakeコマンドを使ってビルドします。
$ pwd /home/aps/my-project/small-web-server # Linuxディストリビューションのビルドを開始する $ bitbake wrlinux-image-glibc-std -c populate_sdk_ext ... # ビルド結果を確認する $ ls ./tmp-glibc/deploy/image/ bcm-2xxx-rpi4 $ ls ./tmp-glibc/deploy/image/bcm-2xxx-rpi4 ... (ビルドした結果のファイルが格納されている)
ビルド結果をRaspberry Pi 4起動用micro-SDカードへ書き込む
最後にビルドの生成物(tmp-glibc/deploy/image/bcm-2xxx-rpi4
)を、Raspberry Pi 4起動用のmicro-SDカードへ書き込みます。書き込み方法は第2回「Yoctoベースの組み込みLinux「Wind River Linux」を使って、Raspberry Pi上で動作するLinuxディストリビューションをゼロから作る」の「ビルド結果をmicroSDへ書き込み、起動する」をご参照ください。
Raspberry Pi 4を起動し、nginxが動作していることを確認する
Raspberry Pi 4を起動すると自動的にnginxが起動し、WEBサービス(HTMLコンテンツ)が配信されます。Raspberry Pi 4のIPアドレスをip addr
コマンドで、ポートの状態をlsof
コマンドにより確認。WEBブラウザからRaspberry Pi 4のIPアドレスへ接続するとnginxのデフォルト設定画面が表示されます(図9)。
### Raspberry Pi 4にrootでログインする # nginxの設定ファイルが格納されていることを確認する $ ls /etc/nginx/ # nginxの実行ファイルの位置を調べ、nginx実行ファイルがArm 64bit向けにコンパイルされていることを確認する $ which nginx $ file /usr/sbin/nginx # HTTPポート(ポート80)をnginxが利用していることを確認する $ lsof -i:80 # Raspberry Pi 4に割り当てられたIPアドレスを確認する # IPアドレス確認後、WEBブラウザで当該IPアドレスに接続する $ ip addr
組み込みLinux入門に最適な1冊
「市場投入までの期間の短縮」「サポートとメンテナンスコストの削減」「コンプライアンス問題への対応」「クラウドネイティブアーキテクチャとコンテナ技術」など、気になるTopicsを網羅したeBookが無料でダウンロードできます。是非ご覧ください。 無料のeBookをダウンロード
まとめ
今回はWind River Linuxにより生成するLinuxディストリビューションをカスタマイズする方法について解説しました。次回は、Docker/コンテナー技術を組み込みシステムへ統合する方法を紹介します。DockerはLinuxと連携し、仮想的な実行環境を構築。様々なソフトウェア資産を1台のデバイス上に集約することのできる機能です。現在の組み込みシステムは様々な機能を集約、システムとして実現していることから、エッジ開発において注目を集めています。ご期待ください。
Wind River Linuxについて
Wind River Linux®は、商用組み込みLinuxマーケットシェアNo.1!※の業界最先端の組み込みLinux開発プラットフォームです。最大15年の長期サポートや継続的デリバリーにも対応し、信頼性の高いエッジデバイスの開発を支援します。
※出典:VDC Reserch The Global Market IoT & Embedded Operating Systems (2018)
Wind River Linux 製品ウエブサイト Wind River Linux 製品カタログ Wind River Linux ダウンロード
Wind River Linux インタビュー記事
Wind River Linuxが誕生して15年となる。Wind River Linux誕生の背景やこれまでの取り組み、採用事例などについて話を聞いた。
Wind River Linux インタビュー記事
- Linuxは、Linus Torvaldsの米国およびその他の国における商標または登録商標です。
- Raspberry PiはRaspberry Pi財団の登録商標です。
- Wind RiverおよびVxWorksはWind River Systems, Inc.の登録商標です。
- その他記載の会社名、製品名は、それぞれの会社の商標または登録商標です。