关于实现支持BGRT与日志显示的Plymouth主题的技术求助
实现支持BGRT、自定义日志与开关机差异化的Plymouth主题
已经有不少开发者通过结合two-step主题框架和自定义脚本片段实现了这类需求,核心思路是利用two-step对BGRT的原生支持,再通过嵌入自定义脚本补全日志渲染和状态差异化逻辑,具体步骤如下:
1. 基于two-step搭建主题基础结构
- 复制系统默认的two-step主题到自定义目录(以Debian/Ubuntu为例):
sudo cp -r /usr/share/plymouth/themes/two-step /usr/share/plymouth/themes/my-bgrt-theme - 修改主题配置文件
/usr/share/plymouth/themes/my-bgrt-theme/theme.plymouth:- 启用BGRT显示:将
ShowBGRT设为true - 可选:叠加厂商Logo(如果BGRT自带的Logo不符合需求),添加
Logo=./path/to/your-logo.png - 配置基础样式:比如背景色、进度条位置等,可分别为开机/关机指定不同的背景色(如
BootBackgroundStartColor和ShutdownBackgroundStartColor)
- 启用BGRT显示:将
2. 自定义日志渲染与字体
two-step允许嵌入自定义脚本扩展功能,我们可以编写脚本实现自定义字体的日志显示:
- 在主题目录下创建
scripts/log-renderer.script,写入以下核心逻辑:# 加载自定义字体(需提前将字体文件放在主题的fonts目录下) custom_log_font = LoadFont("./fonts/your-custom-font.ttf", 14); # 日志显示区域的位置参数 log_start_x = 20; log_start_y = ScreenHeight() - 40; max_log_lines = 12; log_buffer = []; # 重写渲染函数:先渲染two-step默认元素(BGRT、进度条),再绘制日志 Plymouth.SetRenderFunction(function () { Plymouth.DefaultRenderFunction(); # 倒序绘制最近的日志行 for (let i = 0; i < log_buffer.length; i++) { DrawText(log_buffer[i], log_start_x, log_start_y - i*16, custom_log_font, 0xffffffff); } }); # 监听日志消息事件,更新缓冲区 Plymouth.AddMessageHandler("message", function (msg) { log_buffer.unshift(msg); if (log_buffer.length > max_log_lines) { log_buffer.pop(); } }); - 在
theme.plymouth的Scripts字段中添加这个自定义脚本,放在默认脚本之后:Scripts=two-step.script;scripts/log-renderer.script
3. 实现开机/关机的差异化表现
通过脚本判断当前模式,调整显示逻辑:
- 在
log-renderer.script中添加模式判断代码:current_mode = Plymouth.GetMode(); if (current_mode == "shutdown" || current_mode == "reboot") { # 关机/重启时的自定义逻辑:比如隐藏进度条、显示提示文字 Plymouth.SetProgressBarVisible(false); DrawText("正在关机...", ScreenWidth()/2, ScreenHeight()/2 + 60, custom_log_font, 0xffffffff); } else { # 开机时的逻辑:显示进度条 Plymouth.SetProgressBarVisible(true); } - 也可以根据模式加载不同的Logo或调整BGRT的透明度,比如关机时降低Logo透明度:
if (current_mode == "shutdown") { Plymouth.SetLogoOpacity(0.7); }
4. 测试与部署
- 将主题设为默认:
sudo update-alternatives --install /usr/share/plymouth/themes/default.plymouth default.plymouth /usr/share/plymouth/themes/my-bgrt-theme/theme.plymouth 100 sudo update-alternatives --set default.plymouth /usr/share/plymouth/themes/my-bgrt-theme/theme.plymouth - 更新initramfs使配置生效:
sudo update-initramfs -u - 预览效果(无需重启):
sudo plymouthd; sudo plymouth --show-splash; sleep 8; sudo plymouth --quit
注意事项
- 确保自定义字体为TrueType格式,文件权限设置为
644,避免加载失败 - 如果系统没有BGRT表(可通过
dmesg | grep BGRT检查),直接用Logo字段指定厂商Logo即可 - 脚本中必须调用
Plymouth.DefaultRenderFunction(),否则two-step的BGRT、进度条等默认元素不会渲染 - 部分发行版需要调整SELinux上下文(如
restorecon -R /usr/share/plymouth/themes/my-bgrt-theme/)确保文件可访问
内容的提问来源于stack exchange,提问作者Sk7Str1p3
相关产品推荐
相关产品推荐

