2024 年 10 月 11 日
第 3 話:組込み Linux「EMLinux」をカスタマイズしてみよう
はじめに
前回の記事 組込み Linux「EMLinux」を使ってみよう では、local.conf ファイルを編集し、EMLinux に Web サーバである NGINX をインストールしてみました。
本記事では、meta-nginx というカスタム用のディレクトリ ( 以降、レイヤーと呼びます ) を使用し、レイヤー内で NGINX のインストールおよび既定のページの変更を行います。
EMLinux の入手からビルド環境のセットアップまで
前回の記事 と同様、まずはビルド環境を準備します。以下の記事の「評価環境の用意」から「EMLinux 3.0 のビルド ( ビルド用コンテナの起動前まで )」までの手順を実行し、EMLinux のディレクトリを展開してください。
なお、本記事では QEMU で EMLinux を動かすため、Raspberry Pi の実機をご用意いただく必要はありません。また、本記事では執筆時点の最新バージョンである EMLinux 3.1-202409 を使いました。
EMLinux を展開したディレクトリに移動してください。本記事では、以下のディレクトリに展開しました。
cd /home/emlinux/EMLinux_3.1-202409/source/emlinux-3.1-202409/
カスタムレイヤーの作成
以下のコマンドを実行し、meta-nginx ディレクトリを作成してください。
./repos/meta-emlinux-private/scripts/create-custom-layer -p 30 nginx
meta-nginx ディレクトリを repos ディレクトリ配下に移動してください。
mv templates/meta-nginx/ repos/
リンクファイルを作成してください。
ln -s ../repos/meta-nginx/scripts/add-layer-nginx \ setup-hooks/70-add-layer-custom
repos ディレクトリに移動してください。
cd repos/
meta-nginx ディレクトリが追加されていることを確認してください。
$ ls -lh total 32K drwxr-xr-x 10 emlinux emlinux 4.0K Sep 5 08:02 isar drwxr-xr-x 16 emlinux emlinux 4.0K Sep 5 08:02 isar-cip-core drwxr-xr-x 13 emlinux emlinux 4.0K Sep 5 08:02 meta-emlinux drwxr-xr-x 10 emlinux emlinux 4.0K Sep 5 08:02 meta-emlinux-ext-imx drwxr-xr-x 8 emlinux emlinux 4.0K Sep 5 08:02 meta-emlinux-ext-mpsoc drwxr-xr-x 11 emlinux emlinux 4.0K Sep 5 08:02 meta-emlinux-ext-qoriq drwxr-xr-x 6 emlinux emlinux 4.0K Sep 5 08:02 meta-emlinux-private drwxr-xr-x 6 emlinux emlinux 4.0K Oct 2 07:35 meta-nginx
なお、meta-nginx ディレクトリは以下のような構成になっています。
$ tree meta-nginx/ meta-nginx/ ├── conf │ └── layer.conf ├── COPYING.MIT ├── README ├── recipes-core │ └── images │ └── custom-image.bb ├── recipes-example │ └── sample │ ├── files │ │ └── README │ └── sample_0.1.bb └── scripts └── add-layer-nginx 7 directories, 7 files
vim などで meta-nginx/recipes-core/images/custom-image.bb を開き、以下のように編集してください。
(前略) # # Install recipes or self-build packages # IMAGE_INSTALL:append = " \ sample \ " # # Install Debian packages # IMAGE_PREINSTALL:append = " \ nginx \ "
meta-nginx/recipes-example/sample/files 配下の README を削除後、index.nginx-debian.html を作成し以下のように編集してください。
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx on EMLinux!</title>
</head>
<body>
<h1>Welcome to nginx on EMLinux!</h1>
</body>
</html>
vim などで meta-nginx/recipes-example/sample/sample_0.1.bb を開き、以下のように編集してください。
DESCRIPTION = "Sample application" MAINTAINER = "NAME <EMAIL>" DEBIAN_DEPENDS = "nginx" inherit dpkg-raw SRC_URI = " \ file://index.nginx-debian.html \ " do_install() { install -d ${D}/var/www/html/ install -m 644 ${WORKDIR}/index.nginx-debian.html ${D}/var/www/html/ }
EMLinux のビルド
EMLinux のビルド用コンテナを起動するために、以下のディレクトリに移動してください。
cd /home/emlinux/EMLinux_3.1-202409/source/emlinux-3.1-202409/repos/meta-emlinux/docker
EMLinux のビルド用コンテナを起動してください。
./run.sh
EMLinux のビルド用コンテナにログイン後、work ディレクトリに以下のファイルが保存されています。
build@e0d34b689d39:~/work$ ls -lh total 16K drwxr-xr-x 5 build build 4.0K Oct 2 07:44 build drwxr-xr-x 10 build build 4.0K Oct 2 07:36 repos lrwxrwxrwx 1 build build 40 Sep 5 08:02 setup-emlinux -> repos/meta-emlinux/scripts/setup-emlinux drwxr-xr-x 2 build build 4.0K Sep 5 08:02 setup-hooks drwxrwxr-x 2 build build 4.0K Oct 2 07:35 templates
work ディレクトリにて、以下のコマンドを実行してください。
build@e0d34b689d39:~/work$ source setup-emlinux build
上記実行後、build ディレクトリに自動で移動します。
build@e0d34b689d39:~/work/build$
vim コマンドで、conf/bblayers.conf ファイルを開いてください。
build@e0d34b689d39:~/work/build$ vim conf/bblayers.conf
conf/bblayers.conf ファイルの末尾に以下を追記してください。
BBLAYERS += "${TOPDIR}/../repos/meta-nginx"
bitbake-layers コマンドで、meta-nginx が追加されていることを確認してください。
build@e0d34b689d39:~/work/build$ bitbake-layers show-layers NOTE: Starting bitbake server... layer path priority ======================================================================================================== core /home/build/work/build/../repos/isar/meta 5 emlinux-private /home/build/work/build/../repos/meta-emlinux-private 13 emlinux /home/build/work/build/../repos/meta-emlinux 12 cip-core /home/build/work/build/../repos/isar-cip-core 6 nginx /home/build/work/build/../repos/meta-nginx 30
vim コマンドで、conf/local.conf ファイルを開いてください。
build@e0d34b689d39:~/work/build$ vim conf/local.conf
conf/local.conf ファイルの末尾に以下を追記してください。
(前略) MACHINE = "qemu-arm64"
以下のコマンドを実行し、EMLinux のビルドを実行します。
bitbake custom-image
ビルドが完了しましたら、exit コマンドでコンテナからログアウトしてください。
build@37a3c680506c:~/work/build$ exit
QEMU で EMLinux を起動する
QEMU で EMLinux を起動するために必要なパッケージをインストールしてください。
$ sudo apt install qemu-system-arm seabios
build ディレクトリに移動してください。本記事では、/home/emlinux ディレクトリ配下で作業を行ったため、build ディレクトリは以下になります。
cd /home/emlinux/EMLinux_3.1-202409/source/emlinux-3.1-202409/build
vim などで、run-vm.sh ファイルを作成し、run-vm.sh を以下のように編集してください。
$ vi run-vm.sh
qemu-system-aarch64 \ -device virtio-net-device,netdev=net0,mac=52:54:00:12:35:02 \ -netdev user,id=net0,hostfwd=tcp::2280-:80 \ -drive id=disk0,file=./tmp/deploy/images/qemu-arm64/\ custom-image-emlinux-bookworm-qemu-arm64.ext4,if=none,format=raw \ -device virtio-blk-device,drive=disk0 -show-cursor -device VGA,edid=on \ -device qemu-xhci \ -device usb-tablet \ -device usb-kbd \ -object rng-random,filename=/dev/urandom,id=rng0 \ -device virtio-rng-pci,rng=rng0 \ -nographic \ -machine virt \ -cpu cortex-a57 \ -m 512 \ -serial mon:stdio \ -serial null \ -kernel ./tmp/deploy/images/qemu-arm64/\ custom-image-emlinux-bookworm-qemu-arm64-vmlinux \ -initrd ./tmp/deploy/images/qemu-arm64/\ custom-image-emlinux-bookworm-qemu-arm64-initrd.img \ -append 'root=/dev/vda rw highres=off console=ttyS0 mem=512M ip=dhcp console=ttyAMA0'
上記の実行例では、ポート番号 2280 で受け付けた要求を、仮想マシンである EMLinux のポート番号 80 (NGINX の既定のポート番号 ) に転送します。
run-vm.sh ファイルに実行権限を付与してください。
$ chmod +x run-vm.sh
run-vm.sh を実行し、QEMU で EMLinux を起動してください。
$ ./run-vm.sh
起動完了後、ユーザ名 root、パスワード root でログインしてください。
[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x411fd070] [ 0.000000] Linux version 6.1.102-cip26 (isar-users@googlegroups.com) (aarch64-linux-gnu-gcc (Debian 12.2.0-14) 12.2.0, GNU ld (GNU Binutils for Debian) 2.40) #1 SMP PREEMPT Thu, 01 Jan 1970 01:00:00 +0000 [ 0.000000] Machine model: linux,dummy-virt [ 0.000000] Memory limited to 512MB (中略) EMLinux 3.1 EMLinux3 ttyAMA0 EMLinux3 login: root Password:
systemctl コマンドで、NGINX が起動していることを確認してください。
root@EMLinux3:~# systemctl status nginx ● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled) Active: active (running) since Wed 2024-10-02 08:12:26 UTC; 9s ago (後略)
ホストマシン(本記事では、Ubuntu Server 20.04)にログインしてください。Firefox などのウェブブラウザで http://localhost:2280 にアクセスし、以下のようにカスタマイズした Welcome メッセージが出力されることを確認してください。
さいごに
本記事では、カスタムレイヤーを作成し、NGINX のインストールおよび既定のページの変更を行いました。
ある特定の機能の実装をレイヤーにまとめておけば、別の製品を開発する際に、そのレイヤーをコピーするだけでその機能の実装が可能となります。実際の製品開発時には、ぜひレイヤーをご活用ください。
なお、実際の製品開発では、パッケージのインストールだけではなく、EMLinux を搭載するハードウェアに合わせて Linux Kernel のソースコードやデバイスツリーの編集など、レイヤー内の各種ファイル群を編集する必要があります。EMLinux のカスタマイズについてお困りの場合には、サイバートラストにご相談ください。
関連リンク
連載リンク
- 第 1 話:商用組込み Linux:「EMLinux」のご紹介
- 第 2 話:組込み Linux「EMLinux」を使ってみよう
- 第 3 話:組込み Linux「EMLinux」をカスタマイズしてみよう
- 第 4 話:組込み Linux「EMLinux」の SBOM 出力機能を使ってみよう