本文へスキップ
SuiCool

Raspberry Pi 5にカスタムスプラッシュ画面を設定する

Suicool10分

はじめに#

Raspberry Pi上で動作するソフトウェアを「製品」として誰かに渡すとき、電源を入れてからアプリが立ち上がるまでの起動シーケンスの見た目は意外と侮れないですね。

虹色のテストパターン、黒背景に流れる白文字のカーネルログ、Raspberry Pi OSのデスクトップ、その後にようやく自分のアプリ、という流れは個人的にはかなり「自作PCを組み立てている最中」感が強く、エンドユーザーへの没入感を削いでしまいます。

そこで今回は、Raspberry Pi 5 + Raspberry Pi OS (Bookworm, 64bit) を対象に、起動画面(splash screen)を自前のものに差し替える手順をまとめてみます。bootloader段階の抑止と、Plymouthでのカスタムスプラッシュ、kiosk化あたりを順に見ていきます。

検証時の構成#

項目内容
PCRaspberry Pi 5( 8 GB)
OSRaspberry Pi OS(64bit 6.12.75+rpt-rpi-v8, Bookworm)
デスクトップlabwc (Wayland, Bookworm 以降のデフォルト)
Plymouthapt の plymouth / plymouth-themes 標準パッケージ

※Bookworm の初期リリース時点では Wayfire がデフォルトでしたが、2024年10月以降のアップデートにより Pi 4 / Pi 5 では labwc (Wayland) がデフォルトのコンポジタになりました。Pi 3 以前ではハード性能の都合で引き続き X11 (LXDE) や Wayfire の構成も残っています。本記事では Wayland 前提で記述しますが、X11 構成でも本質的な手順はほぼ同じです。

1.起動シーケンスのどこを置き換えるか#

Raspberry Pi 5 の起動は、おおまかに下のステージに分かれています。

[電源ON]
   │
   ▼
(1) bootloader (EEPROM)         ← Raspberry Piロゴ / 虹色テストパターン
   │
   ▼
(2) kernel ロード                ← Pi 5 では bootloader が直接 kernel をロード
                                   (Pi 4 以前は start*.elf 経由)
   │
   ▼
(3) Linux カーネル起動           ← 白文字のカーネルログ / 左上のRaspberry Piロゴ4つ
   │
   ▼
(4) systemd (init)              ← Plymouth スプラッシュ
   │
   ▼
(5) ログイン処理                 ← Bookworm 標準は getty@tty1 の autologin
                                   (lightdm/greetd は標準では入りません)
   │
   ▼
(6) デスクトップ (labwc)         ← 壁紙とパネル
   │
   ▼
(7) ユーザーアプリ

「ロゴ画面」をどう作るかは、どのステージを置き換えるかで難易度がかなり変わります。

(1)〜(2) のファームウェア段階は触れる余地が狭いので、虹色画面の抑止くらいに留めるのが現実的ですね。(3) のカーネルログは cmdline.txt でほぼ消せますし、(4) の Plymouth が今回のカスタムスプラッシュの本命です。(5)〜(6) は、デスクトップ自体を見せたくないなら tty1 の autologin やデスクトップを起こさず、自分のアプリだけを Wayland コンポジタ上で動かす方向に倒します。

ざっくり (1) + (3) + (4) を抑えれば、電源ONからアプリ起動までほぼ自前の画で繋げられる、というのが今回のゴールです。

2.bootloader段階のロゴ抑止と差し替え#

虹色テストパターンを消す#

ファームウェアが最初に出す虹色の画面(ディスプレイ接続確認用のテストパターン)は、config.txt で簡単に抑止できます。

sudo nano /boot/firmware/config.txt

末尾に下記を追記してください。

disable_splash=1

これで虹色画面は出なくなります。

ファームウェアロゴ(左上のRaspberry Pi 4つ)を消す#

Linuxカーネル起動直後に画面左上に出る、Raspberry Piロゴ4つのアイコンは、後述の cmdline.txtlogo.nologo で消せます(カーネルパラメータ側で制御するのが現実的です)。

静止画スプラッシュを置く方法について#

/boot/firmware/ 配下に splash.png を置くだけで bootloader 段階のロゴになる、という記述がネット上にいくつかありますが、これは Raspberry Pi OS 標準ファームウェアではサポートされていない挙動で、Pi 5 (Bookworm) 環境では基本的に効きません。bootloader 段階で完全に画作りをしたい場合は EEPROM カスタムビルドの話になり、ちょっと現実的ではないので、ここは黒画面にしておいて、Plymouth 側でロゴを出す方向にしますね。

3.カーネルメッセージの抑止#

/boot/firmware/cmdline.txt を編集して、カーネルログを画面に出さないようにします。

sudo nano /boot/firmware/cmdline.txt

このファイルは改行を入れず1行で書く点に注意です。既存のパラメータ列の末尾に、下記のオプションを追記してください。

quiet splash logo.nologo loglevel=0 vt.global_cursor_default=0 console=tty3

各オプションの意味は下記の通りです。

オプション意味
quietカーネルログをコンソールに出さない
splashPlymouth のスプラッシュを有効化
logo.nologo左上のフレームバッファロゴを非表示
loglevel=0コンソールに出すログレベルのしきい値を最小化(実質 emergency 以外を出さない)
vt.global_cursor_default=0仮想端末のカーソル(点滅する _)を非表示
console=tty3システムコンソールを tty3 に逃がし、tty1 を Plymouth が占有できるようにする

書き換え後は sudo reboot で再起動して、白文字のログが流れなくなっていることを確認してください。

[要スクリーンショット: cmdline.txt 変更前後の起動画面比較]

4.Plymouth でカスタムスプラッシュを作る#

ここがメインですね。

Plymouth の導入#

sudo apt update
sudo apt install -y plymouth plymouth-themes

Bookworm では Plymouth 自体は依存関係でほぼ入っている状態ですが、plymouth-themes を入れておくとサンプルテーマがいくつか入ってきて、テーマ作成の参考になります。

自前テーマの作成#

テーマは /usr/share/plymouth/themes/<name>/ に配置します。今回は mybrand という名前で作ってみます。

sudo mkdir -p /usr/share/plymouth/themes/mybrand
cd /usr/share/plymouth/themes/mybrand

ここにロゴ画像 logo.png(中央配置するもの。1920x1080なら 512px 四方くらいが扱いやすいです)と、後述の mybrand.plymouth / mybrand.script を配置します。

sudo cp /path/to/your/logo.png ./logo.png

.plymouth ファイル#

mybrand.plymouth を下記の内容で作成します。

[Plymouth Theme]
Name=mybrand
Description=Brand splash for Raspberry Pi 5
ModuleName=script

[script]
ImageDir=/usr/share/plymouth/themes/mybrand
ScriptFile=/usr/share/plymouth/themes/mybrand/mybrand.script

.script ファイル(最小例)#

mybrand.script を下記の内容で作成します。中央にロゴ画像を1枚出すだけのミニマム構成です。なお、Plymouth script は C風の独自スクリプト言語なので、シンタックスハイライトは参考程度です。

# 背景を黒で塗る
Window.SetBackgroundTopColor(0.0, 0.0, 0.0);
Window.SetBackgroundBottomColor(0.0, 0.0, 0.0);

# 中央にロゴを配置
logo.image = Image("logo.png");
logo.sprite = Sprite(logo.image);
logo.sprite.SetX(Window.GetWidth() / 2 - logo.image.GetWidth() / 2);
logo.sprite.SetY(Window.GetHeight() / 2 - logo.image.GetHeight() / 2);

進捗バーやスピナーを付けたい場合は Plymouth.SetBootProgressFunction などのコールバックを使って sprite を動かす形になりますが、最初は静止画1枚で十分ですね。

テーマの登録と切り替え#

update-alternatives で Plymouth のデフォルトテーマ一覧に追加し、切り替えます。

sudo update-alternatives --install \
  /usr/share/plymouth/themes/default.plymouth default.plymouth \
  /usr/share/plymouth/themes/mybrand/mybrand.plymouth 200

sudo plymouth-set-default-theme -R mybrand

-Rinitramfs を再生成する オプションです。これを忘れると変更が反映されないので注意してください(個人的に何度か踏みました)。

再起動して、シャットダウン直後〜デスクトップ表示前にロゴが中央に出れば成功です。

Plymouth スプラッシュ表示例

5.動作確認のコツ#

毎回 reboot しながら確認するのはさすがに辛いので、Plymouth には現在のセッション上でスプラッシュを呼び出すデバッグ用コマンドが用意されています。

# テスト用に Plymouth を立ち上げ、スプラッシュを5秒表示して終了する
sudo plymouthd ; sudo plymouth --show-splash ; sleep 5 ; sudo plymouth quit

このコマンドを実行している間は画面が現在のスプラッシュテーマで上書きされるので、.script の調整 → 実行 → 確認、のループを reboot なしで回せます。SSH 接続上から実行できるので、HDMI 側の画面だけが切り替わって便利ですね。

初回はうまく描画されないことがありますが、その場合は plymouthd--debug --debug-file=/tmp/plymouth.log を付けて起動するとログが出力されるので、原因を追いやすくなります。

なお、Wayland セッション中に実行するとコンポジタとの描画競合で表示が崩れることがありますが、これはあくまでテスト時の挙動で、実際の起動シーケンス中(systemd の中)では Plymouth 単独で描画するので問題ありません。

6.デスクトップを見せずにアプリだけ起動する#

ここまでで起動中のロゴ画面はカバーできましたが、Plymouth が終わった直後にデスクトップが見えてしまうと、結局そこで没入感が切れますね。

製品用途だと、デスクトップを起こさず自分のアプリだけをフルスクリーン表示する構成にしてしまうのが手っ取り早いです。Bookworm (Wayland) で個人的に試した範囲だと、選択肢は概ね次の3つくらいでしょうか。

  • cage:単一アプリ専用の Wayland コンポジタで、apt install cage で入ります。kiosk 用途には一番素直な選択肢ですが、オプション体系はバージョン差があるので導入後に cage --help でフラグを見ておくと安全です。
  • labwc 直起動:labwc を tty から直接起動し、autostart で自分のアプリだけを立ち上げる構成です。Raspberry Pi OS と同じコンポジタを使うので相性が良いですね。
  • X11 + matchbox-window-manager:昔ながらのオーソドックスな組み合わせで、X11 のままで構わない案件ならまだ現役です。

cage を使う場合の最小構成例(systemd サービス)は下記のような形になります。

# /etc/systemd/system/kiosk.service
[Unit]
Description=Kiosk app
After=systemd-user-sessions.service plymouth-quit-wait.service
[email protected]

[Service]
Type=simple
User=pi
PAMName=login
TTYPath=/dev/tty1
StandardInput=tty
StandardOutput=journal
StandardError=journal
ExecStart=/usr/bin/cage -- /usr/local/bin/your-app

[Install]
WantedBy=graphical.target

After=plymouth-quit-wait.service を指定しておくと、Plymouth が完全に閉じるのを待ってから cage を起動できるので、画面のチラつきを最小化できます。Raspberry Pi OS の標準セットアップではログインに getty@tty1 の autologin が使われていることが多いので、raspi-configBoot Options → Desktop / CLI から Console を選んで autologin と labwc の自動起動を切っておくと、デスクトップが顔を出さなくなります。

[要スクリーンショット: 起動直後に Plymouth スプラッシュからアプリ画面に直接遷移する様子]

7.さいごに#

Raspberry Pi 5 の起動画面まわりは、関わるステージがいくつもあって最初は把握しづらいですが、ポイントとしては bootloader の虹色とロゴを抑止して、カーネルログは cmdline.txt で黙らせて、見た目を Plymouth で作って、最後にデスクトップを見せないで kiosk 化する、というくらいでしょうか。

ちなみに、Plymouth テーマを差し替えても起動時間そのものはほぼ変わりません(描画レイヤが切り替わるだけなので)。起動高速化が目的の場合は別途 systemd の systemd-analyze blame で重いユニットを潰していく作業が必要で、これはまた別の記事で扱えればと思います。

製品っぽい起動シーケンスにできると、同じハードでも一段「完成品」感が出るので、Raspberry Pi を組み込み用途で使う方にはおすすめの工程ですね。

参考文献#

対象

OS
Raspberry Pi OS Bookworm

タグ

管理者

Suicool

本業では画像検査ソフトウェアを開発しているソフトウェアエンジニア。
プライベートで実施した検証の内容をブログにまとめています。

Next reading

関連するベンチや運用ログ、深掘り記事を続けて読めます。