YoctoでChrominumをビルドしてみる
Webベースのキオスク端末を作りたくなったので、まずはChrominumをYoctoでビルドする方法をまとめました。こちらの記事(https://thomasw.dev/post/yocto-kiosk/)を参考に進めます。
下準備
Ubuntu 22.04以降の環境ではlibstdc++-12-devをインストールしておかないとビルド時にエラーが起きます。以下のコマンドを実行し、追加します。
sudo apt install libstd++-12-dev
recipiesを追加する
githubにあるmeta-browserを追加します。ソースはこちら(https://github.com/OSSystems/meta-browser )元のドキュメントを読むと他に依存しているレイヤーがあるため、そちらも合わせて取得します。(meta-lts-mixinsは4.0系列(Kirkstone)を使用する場合のみ必要になります。
cd (work dir)/poky/
git clone -b kirkstone https://github.com/OSSystems/meta-browser.git
git clone -b kirkstone https://github.com/kraj/meta-clang.git
git clone -b kirkstone/rust-1.70 https://git.yoctoproject.org/meta-lts-mixins
ソースを取得したら、bitbake-add-layerでレイヤーを追加します。(ディレクトリの指定は自身の環境に読みかえて行ってください)
bitbake-layers add-layer ../meta-clang
bitbake-layers add-layer ../meta-lts-mixins
bitbake-layers add-layer ../meta-browser/meta-chromium
次にlocal.confを修正します。今回はRaspberry Pi 4Bをターゲットにしたのでデフォルトから以下のものを追加しました。
CONF_VERSION = "2"
MACHINE = "raspberrypi4-64"
DL_DIR ?= "${TOPDIR}/../../downloads"
BB_NUMBER_THREADS = '24'
PARALLEL_MAKE = '-j 24'
# RPi4 Device Settings
ENABLE_UART = "1"
ENABLE_I2C = "1"
# Machine feature
MACHINE_FEATURES:append = " wifi bluetooth alsa serial usbhost keyboard"
# Set Distribution Features
DISTRO_FEATURES:append = " alsa pulseaudio"
DISTRO_FEATURES:append = " ipsec"
DISTRO_FEATURES:append = " ldconfig"
DISTRO_FEATURES:append = " ubhost"
DISTRO_FEATURES:append = " vfat nfs"
DISTRO_FEATURES:append = " bluez5 bluetooth wifi 3g"
# Add firmwares
IMAGE_INSTALL:append = " linux-firmware"
IMAGE_INSTALL:append = " linux-firmware-rpidistro-bcm43455"
IMAGE_INSTALL:append = " bluez-firmware-rpidistro-bcm4345c0-hcd"
IMAGE_INSTALL:append = " linux-firmware-rpidistro-bcm43456"
IMAGE_INSTALL:append = " bluez-firmware-rpidistro-bcm4345c5-hcd"
IMAGE_INSTALL:append = " kernel-modules"
# Wireless Tools
IMAGE_INSTALL:append = " iw net-tools wpa-supplicant"
IMAGE_INSTALL:append = " connman"
IMAGE_INSTALL:append = " pi-bluetooth"
LICENSE_FLAGS_ACCEPTED = "synaptics-killswitch"
DISTRO_FEATURES:append = " opengl x11 systemd"
# Set systemd as init system
VIRTUAL-RUNTIME_init_manager = "systemd"
VIRTUAL-RUNTIME_initscripts = "systemd-compat-units"
DISTRO_FEATURES:append = " systemd"
VIRTUAL-RUNTIME_init_manager = "systemd"
DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"
VIRTUAL-RUNTIME_initscripts = ""
# add openSSH Server
IMAGE_FEATURES:append = " ssh-server-openssh"
# module auto load
KERNEL_MODULE_AUTOLOAD:rpi += "i2c-dev i2c-bcm2708"
# Include and build the Chromium package and X
IMAGE_INSTALL:append = " chromium-x11"
IMAGE_FEATURES:append = " x11-base hwcodecs"
ここまで修正したところで、一度ビルドができるか確認します。
bitbake core-image-sato
ビルドが正常に完了したらイメージをSDカードに書き込み、動作を確認します。正常に起動するとSatoの画面が表示されます。
ここでterminalを実行し、以下のコマンドを実行します。
chrominum --no-sandbox
chromiumが正常に起動することを確認します。
自動起動を設定する
次に起動時に自動でChromiumが起動するようにしてみます。
今回はcore-image-satoに含まれるmatchboxをそのまま使って組み込んでみます。
userの追加
chromiumはroot権限で起動するといろいろあるので、実行用のユーザーを作成します。
local.confに以下を追加します。今回はkioskというユーザー名を追加します。
INHERIT += "extrausers"
EXTRA_USERS_PARAMS = "useradd -m kiosk;"
起動スクリプトの追加
起動スクリプトを組み込むためのrecipiesを作成します。今回はkiosk-autostartという名前でrecipiesを用意しました。以下のように作成します。レイヤーはお好きなところに追加してください。
recipes-kiosk-autostart
└── kiosk-autostart
├── files
│ └── kiosk.sh
└── kiosk-autostart_0.1.bb
以下、各ファイルの内容です。まずは実行スクリプト(kiosk.sh)の内容です。初期ページは引数にURLで渡しているのでここを修正すると任意のページを表示することができます。
#!/bin/sh
su -l -c "export DISPLAY=:0 ; chromium -kiosk kernel.org" kiosk &
次にレシピファイルを以下の内容で保存します。
DESCRIPTION = "Excec chromium kiosk mode"
SECTION = "examples"
LICENSE = "CLOSED"
SRC_URI = "file://kiosk.sh \
"
S = "${WORKDIR}"
do_install() {
install -d ${D}${bindir}
install -m 0755 ${S}/kiosk.sh ${D}${bindir}
install -d ${D}${sysconfdir}/X11/Xsession.d
install -m 0755 ${S}/kiosk.sh ${D}${sysconfdir}/X11/Xsession.d/89zzzkiosk.sh
}
FILES_${PN} += "${bindir}/kiosk.sh"
RDEPENDS_${PN} += "xserver-xorg"
今回はXsessionを使ってChromiumを起動させています。Chromiumの起動に時間がかかるので、その間にWMであるmatchboxが起動していい感じにフルスクリーンで表示されます。WMを使わない場合はFramebufferの情報を取得して、起動時のオプションで適切にサイズ指定する必要がありそうです。
これらのファイルを用意したら、local.confに以下の記載を追加します。
IMAGE_INSTALL:append = " kiosk-autostart"
修正が終わったら、以下のコマンドでイメージをビルドします。
bitbake core-image-sato
できたイメージをSDカードに書き込み、起動します。正常に動作すると以下のように指定したページが表示されます。(今回の場合はkernel.orgが表示されます)
以上でWebブラウザを自動起動することができました。
Discussion