採用情報

お問い合わせ

BLOG

EMLinux

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 メッセージが出力されることを確認してください。

 カスタマイズした Welcome メッセージが出力されている画面

さいごに

本記事では、カスタムレイヤーを作成し、NGINX のインストールおよび既定のページの変更を行いました。

ある特定の機能の実装をレイヤーにまとめておけば、別の製品を開発する際に、そのレイヤーをコピーするだけでその機能の実装が可能となります。実際の製品開発時には、ぜひレイヤーをご活用ください。

なお、実際の製品開発では、パッケージのインストールだけではなく、EMLinux を搭載するハードウェアに合わせて Linux Kernel のソースコードやデバイスツリーの編集など、レイヤー内の各種ファイル群を編集する必要があります。EMLinux のカスタマイズについてお困りの場合には、サイバートラストにご相談ください。

EMLinux についてのご質問はこちら

関連リンク
連載リンク
CentOS 7 延長サポートサービス
デジタルトランスフォーメーションのための電子認証基盤 iTrust
SSL/TLS サーバー証明書 SureServer Prime