You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于实现支持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)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 18:24:51