跳至正文
SuiCool

为 Raspberry Pi 5 设置自定义启动画面

Suicool10分

引言#

当你把运行在 Raspberry Pi 上的软件作为一款“产品”交付给别人时,从开机到应用启动这段流程的视觉体验,其实比想象中更加重要。

常见的启动过程往往是先显示彩虹测试图案,然后在黑色背景上滚动白色内核日志,接着出现 Raspberry Pi OS 桌面,最后才启动自己的应用。就个人感受而言,这很像让用户看着一台 DIY 电脑被组装起来,容易破坏最终用户的沉浸感。

本文以 Raspberry Pi 5 和 64 位 Raspberry Pi OS(Bookworm)为对象,介绍如何将启动画面(splash screen)替换为自定义内容。我们会依次讲解如何隐藏引导加载程序阶段的画面、使用 Plymouth 制作自定义启动画面,以及配置 kiosk 模式。

测试环境#

项目配置
设备Raspberry Pi 5(8 GB)
操作系统Raspberry Pi OS(64 位 6.12.75+rpt-rpi-v8,Bookworm)
桌面labwc(Wayland,Bookworm 之后的默认方案)
Plymouth通过 apt 安装的标准 plymouth / plymouth-themes 软件包

注意:Bookworm 最初发布时默认使用 Wayfire,但从 2024 年 10 月起的更新开始,Pi 4 和 Pi 5 已改为默认使用 labwc(Wayland) 合成器。受硬件性能限制,Pi 3 及更早的型号仍可能使用 X11(LXDE)或 Wayfire。本文以 Wayland 为前提,不过在 X11 环境中,核心步骤也基本相同。

1. 确定要替换启动流程的哪些部分#

Raspberry Pi 5 的启动过程大致可以分为以下几个阶段:

[开机]
   │
   ▼
(1) 引导加载程序(EEPROM)      ← Raspberry Pi 标志 / 彩虹测试图案
   │
   ▼
(2) 加载内核                    ← Pi 5 由引导加载程序直接加载内核
                                   (Pi 4 及更早型号通过 start*.elf)
   │
   ▼
(3) Linux 内核启动              ← 白色内核日志 / 左上角的 4 个 Raspberry Pi 标志
   │
   ▼
(4) systemd(init)             ← Plymouth 启动画面
   │
   ▼
(5) 登录处理                    ← Bookworm 默认使用 getty@tty1 自动登录
                                   (默认不安装 lightdm/greetd)
   │
   ▼
(6) 桌面(labwc)               ← 壁纸和面板
   │
   ▼
(7) 用户应用

要打造“品牌启动画面”,难度很大程度上取决于你准备替换哪些阶段。

在 (1) 到 (2) 的固件阶段,可自定义的空间很小,因此实际操作中最好只隐藏彩虹画面。(3) 阶段的内核日志几乎都可以通过 cmdline.txt 隐藏,而 (4) 阶段的 Plymouth 才是本文自定义启动画面的核心。如果在 (5) 到 (6) 阶段也不想显示桌面,就不要启动 tty1 自动登录或桌面环境,而是只在 Wayland 合成器上运行自己的应用。

简单来说,只要处理好 (1)、(3) 和 (4),就能让从开机到应用启动之间的画面几乎完全由自己控制。这正是本文的目标。

2. 隐藏和替换引导加载程序阶段的画面#

隐藏彩虹测试图案#

固件最先显示的彩虹画面是用于确认显示器连接的测试图案,可以通过 config.txt 轻松隐藏。

sudo nano /boot/firmware/config.txt

在文件末尾添加以下内容:

disable_splash=1

这样就不会再显示彩虹画面。

隐藏固件标志(左上角的 4 个 Raspberry Pi 图标)#

Linux 内核刚启动时显示在屏幕左上角的 4 个 Raspberry Pi 图标,可以通过下一节将要介绍的 cmdline.txt 参数 logo.nologo 隐藏。通过内核参数控制是比较实际的做法。

关于显示静态启动图片#

网上有一些资料称,只要把 splash.png 放到 /boot/firmware/ 下,就能在引导加载程序阶段将其显示为标志。然而,Raspberry Pi OS 的标准固件并不支持这种行为,在运行 Bookworm 的 Pi 5 环境中通常也不会生效。要完全自定义引导加载程序阶段的画面,就需要自行构建 EEPROM,实用性不高。因此,我们让这一阶段保持黑屏,改由 Plymouth 显示标志。

3. 隐藏内核消息#

编辑 /boot/firmware/cmdline.txt,让屏幕不再显示内核日志。

sudo nano /boot/firmware/cmdline.txt

请注意,这个文件必须保持为一行,不能换行。在现有参数的末尾添加以下选项:

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

每个选项的含义如下:

选项含义
quiet不向控制台输出内核日志
splash启用 Plymouth 启动画面
logo.nologo隐藏左上角的帧缓冲区标志
loglevel=0将控制台日志级别阈值降至最低,实际只保留紧急消息
vt.global_cursor_default=0隐藏虚拟终端中闪烁的光标(_)
console=tty3将系统控制台移到 tty3,让 Plymouth 可以占用 tty1

修改完成后运行 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 的文件名放到此目录中。图片会显示在屏幕中央;对于 1920 × 1080 的屏幕,尺寸在 512 像素见方左右会比较容易使用。此外,还需要放置下文介绍的 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 并写入以下内容。这个最小配置只会在屏幕中央显示一张标志图片。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。不过在最初版本中,一张静态图片已经足够。

注册并切换主题#

使用 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

-R 选项会重新生成 initramfs。如果忘记添加,修改就不会生效——我自己也在这里踩过几次坑。

重新启动系统。如果从关机结束到桌面出现之前,标志能够显示在屏幕中央,就说明配置成功了。

Plymouth 启动画面示例

5. 测试技巧#

每次调整后都重新启动确实很麻烦。Plymouth 提供了一个调试命令,可以直接在当前会话中显示启动画面。

# 启动测试用 Plymouth,显示启动画面 5 秒后退出
sudo plymouthd ; sudo plymouth --show-splash ; sleep 5 ; sudo plymouth quit

运行此命令期间,屏幕会被当前的启动主题覆盖。这样就能在不重新启动的情况下反复执行“修改 .script → 运行命令 → 检查效果”的流程。这个命令还可以通过 SSH 执行,只切换 HDMI 端的画面,非常方便。

首次运行时有时无法正常显示。如果遇到这种情况,可以为 plymouthd 添加 --debug --debug-file=/tmp/plymouth.log 参数来输出日志,便于定位原因。

在 Wayland 会话中运行时,Plymouth 可能会与合成器争用显示资源,从而导致画面异常。这只是测试时的现象;在实际的 systemd 启动流程中,Plymouth 会独立绘制,因此不会有问题。

6. 不显示桌面,只启动应用#

到这里,启动过程已经由启动画面覆盖。但如果 Plymouth 结束后立即显示桌面,沉浸感还是会在这里中断。

用于产品时,最直接的方法通常是不启动桌面,只以全屏方式运行自己的应用。根据我在 Bookworm(Wayland)环境中的测试,主要有以下三种选择:

  • cage:专门用于运行单个应用的 Wayland 合成器,可以通过 apt install cage 安装。它是 kiosk 场景中最直接的选择,不过不同版本的选项有所差异,安装后最好运行 cage --help 确认可用参数。
  • 直接启动 labwc:从 tty 直接启动 labwc,再通过 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 后,cage 会等到 Plymouth 完全关闭再启动,从而尽量减少屏幕闪烁。在 Raspberry Pi OS 的标准配置中,登录通常通过 getty@tty1 自动完成。可以在 raspi-config 中选择 Boot Options → Desktop / CLI → Console,关闭自动登录和 labwc 的自动启动,避免桌面短暂出现。

[待补充截图:开机后从 Plymouth 启动画面直接切换到应用界面]

7. 总结#

Raspberry Pi 5 的启动画面涉及多个阶段,刚开始不太容易理清。核心思路其实很简单:隐藏引导加载程序的彩虹画面和标志,通过 cmdline.txt 关闭内核日志,用 Plymouth 负责视觉呈现,最后通过 kiosk 配置避免显示桌面。

更换 Plymouth 主题几乎不会改变实际启动时间,因为它只是切换了显示层。如果目标是加快启动速度,还需要使用 systemd 的 systemd-analyze blame 找出耗时较长的单元并逐一优化。希望之后能在另一篇文章中介绍这部分内容。

精心设计的启动流程能让同样的硬件更像一款完整产品,因此对于将 Raspberry Pi 用在嵌入式场景中的用户来说,这一步非常值得完成。

参考资料#

対象

OS
Raspberry Pi OS Bookworm

タグ

管理者

Suicool

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

Next reading

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