Linux开机画面浅析之 Plymouth 组件
Plymouth 主题知识
主题结构
Plymouth 的主题主要有两种提供方式,一种是在 Plymouth 自带的,安装 Plymouth 包之后就存在的,还有一种是在单独的软件包提供,软件包名称一般为 plymouth-theme-*
。
两种方式提供的主题文件都会保存在 usr/share/plymouth/themes/THEME_NAME
下,且每个主题一般都会带有一个主题引导配置文件
,一般命名为 THEME_NAME.plymouth
。
主题配置文件结构通常如下:
# 以 charge 为例
Name=Charge #主题名称
Description=A theme that features the shadowy... #主题描述
ModuleName=two-step #主题所对应的依赖包
# 依赖包配置段
[two-step]
ImageDir=/usr/share/plymouth/themes/charge #图片目录
HorizontalAlignment=.5 #横向坐标设置
VerticalAlignment=.5 #纵向坐标设置
Transition=none #过场时间是否有
TransitionDuration=0.0 #过场时间
BackgroundStartColor=0x202020 #开始颜色
BackgroundEndColor=0x202020 #结束颜色
Plymouth 主题设置方法
plymouth-set-default-theme theme-name #设置开机主题
plymouth-set-default-theme -R theme-name #重新编译 initramfs,加载开机主题引导程序
plymouth-set-default-theme 是一个用于设置 Plymouth 主题的程序,它可以用于列出可用的主题、重置到默认主题、设置新的主题以及重新构建 initrd。可以使用 plymouth-set-default-theme --help
命令来查看所有可用选项和用法。
还可以通过修改主题的相关文件来定制主题。主题文件通常位于 /usr/share/plymouth/themes
目录下。也可以复制一个现有的主题,并对其进行修改来创建自己的主题。更改了主题需要重新构建 initrd,可以使用 plymouth-set-default-theme -R
命令来重新构建 initrd。
其中plymouth-set-default-theme -R
的作用便是重新构建 initrd, 是在修改Plymouth主题后必须执行该命令。
分析该命令后,可知该命令实际上执行的是 /usr/libexec/plymouth/plymouth-update-initrd 脚本,该脚本实际内容为:
#!/bin/bash
dracut -f
也就是说修改主题后必须重新生成 initarmfs 镜像才能完成修改.
设置主题时,会先检测 ModuleName 指定的共享库是否存在。
如果不存在对应的 so ,在执行 plymouth-set-default-theme -R theme-name
会提示 /usr/lib64/plymouth/.so not exit
。
并且不会加载对应的开机动画,用默认的主题“省略号”开机动画顶替。
相关库缺失案例:
[root@localhost ~]# plymouth-set-default-theme -R text
dracut-install: ERROR: installing '/usr/lib64/plymouth/script.so' to '/usr/lib64/plymouth/script.so'
dracut: FAILED: /usr/lib/dracut/dracut-install -D /var/tmp/dracut.NI5aJL/initramfs /usr/lib64/plymouth/script.so /usr/lib64/plymouth/script.so
为什么修改 Plymouth 主题需要重新构建 initrd?
因为 Plymouth 是 Linux 系统启动时显示的图形界面,Plymouth-Theme 通常包含了启动时显示的背景图像、进度条和动画等元素。而 initrd 是在系统引导过程中加载的临时文件系统,因此需要将 Plymouth 所需的相关文件和配置信息写入到该临时文件系统中 。
重新构建initrd的过程会将修改后的Plymouth主题文件和配置信息打包到initrd中,以确保在系统引导时能够正确加载和显示新的Plymouth主题。这样可以确保在系统启动时,能够看到所期望的Plymouth主题效果。
修改主题并重新构建 initrd 的通常包括以下四个步骤:
- 修改 Plymouth 主题文件:这包括更改背景图像、进度条样式、动画效果等。
- 更新 Plymouth 配置文件:这些配置文件定义了Plymouth主题的行为和外观,例如进度条的颜色、动画的速度等。
- 重新打包 initrd:将修改后的 Plymouth 主题文件和配置信息打包到 initrd 中。
- 更新引导配置:在引导过程中,系统会加载initrd并使用其中的文件和配置信息来显示 Plymouth 主题。
/usr/lib*/plymouth/script.so 文件
script.so
在部分 Linux 社区中也由 plymouth-plugin-script
这个包提供,其主要作用是为 Plymouth 提供脚本插件,支持主题中的脚本语言,用于简化设计自定义开机主题。
当某个主题需要使用脚本时,则会在该主题的主题引导配置文件中 ModuleName 中加入 script, 表示需要依赖 script.so
, 其典范就是 Plymouth 中的 script
主题。若缺失该库文件,则会导致对应的主题加载失败,会显示默认主题。
目前所使用的开机动画(kiran)并未引用到依赖到 script.so
, 因此若缺失该库文件,不会导致开机动画异常。
其他
initrd
Initrd (Initial RAM Disk): Initrd 是一个包含在内核映像之前加载的文件系统映像,也就是一个临时的根文件系统。用于在Linux系统启动过程中提供所需的模块、必要的驱动程序和文件,以便进行硬件检测、模块加载和设备发现等操作,从而使真正的根文件系统能够被挂载。。通常用于在系统引导过程中加载必要的硬件驱动程序,以便能够正确地访问和使用硬件设备。
initrd(Initial RAM Disk)是Linux系统中的其中一种方案,用于在Linux启动过程的早期将临时根文件系统加载到内存中。它和 initramfs(INITial RAM File System)是实现这一目的的两种不同方法。这两种方法通常用于在真正的根文件系统可以挂载之前进行准备工作。
initrd的目的是在Linux系统启动过程中加载一个临时的根文件系统。
initrd 和 initramfs 的实现方式不同:
在initrd方案中,根文件系统的镜像可以是一个文件系统镜像(可选压缩),它被作为一个特殊的块设备(/dev/ram)提供,并被挂载为初始的根文件系统。这种方案需要将文件系统的驱动程序静态编译到内核中。
在initramfs方案中,根文件系统的镜像可以是一个cpio归档文件(可选压缩)。内核将这个归档文件解压缩到一个特殊的tmpfs实例中,成为初始的根文件系统。这种方案不需要将中间文件系统或块驱动程序编译到内核中。
在使用initrd或initramfs时,需要将内核和初始根文件系统的镜像存储在可被Linux引导加载程序或计算机的引导固件访问的位置,如根文件系统本身、光盘上的引导镜像、本地磁盘上的小分区(通常使用ext2或FAT文件系统)或TFTP服务器(对于可以通过以太网引导的系统)。
在加载内核和初始根文件系统镜像到内存后,引导加载程序会启动内核,并将镜像的内存地址传递给内核。在引导过程的最后,内核会根据镜像的前几个数据块来确定镜像的格式,从而确定是使用initrd还是initramfs方案。
initrd和initramfs的实现方式使得Linux系统能够在启动过程中进行硬件检测、模块加载和设备发现等操作,从而能够挂载真正的根文件系统。这对于处理特殊情况(如软件RAID卷、LVM、NFS或加密分区)以及支持休眠功能等都非常有用。