🌐

YoctoでChrominumをビルドしてみる

2024/05/03に公開

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