NotePublic/Software/System/Linux/Modules/Plymouth/Plymouth_说明.md

3.4 KiB
Raw Blame History

modified title
2023-06-26T02:40:51.512Z Plymouth 说明

Linux 系统采用开机动画去覆盖 Linux 启动打印日志,观察 Linux 启动的过程,会先加载内核,会进入一次屏幕分辨率切换(闪烁),这时到了 Splash 屏幕显示加载进度,当加载完成后,到了 KDM/GDM 登录界面时,又会进行一次(甚至两次连续)的屏幕刷新,然后才进入桌面,但是 Plymouth 通过内核中“内核模式设置”Kernel Mode-Setting和显示的支持将带给你一个更加干净、容易定制和无闪烁的图形启动模式绚丽的动画显示提供给用户更加友好的界面。

1. Plymouth 的工作流程

Plymouth 主要分为 2 个端和 2 个阶段

  • 2 个端分别为客户端和服务端,客户端是 Plymouth服务端是 Plymouthd。
  • 2 个阶段分别是 ramdisk 和 root。

首先是 ramdiskramdisk 在 /boot/initrd-$VERSION.imgVERSION=uname -r //系统内核版本)。把 initrd 解开之后可以看见在根目录下有一个 init 文件,打开查看可以看见对于 Plymouth 来说有 4 个命令:

  1. daemonize -ignoe-missing /bin/plymouthd这里开启了 Plymouth 的服务端
  2. plymouth -show-splash这里调用了客户端,并给出开始显示动画的指令
  3. plymouth message --text="xxx":动画中显示文字
  4. plymouth -newroot=/sysroot这里提示 Plymouth 从 initrd 进入到 root中

ramdisk 结束之后到 root 中。root 的初始化脚本在 /etc/rc.d/rc.sysinit 中。里面最主要是 2 条指令:

  1. plymouth-hide-splash用于隐藏动画 显示自检信息 , 一般在遇到错误的时候会调用这条指令
  2. plymouth-show-splash用于恢复动画的显示 , 一般用于从错误信息中恢复动画。

最后当要进入 GDM 也就是 GNOME 的账户管理界面的时候会调用 plymouth -quit 来切换到 GDM。

再来看看 2 个端:

  1. 客户端和服务端之间的通信通过 Socket 进行;
  2. 客户端向服务端发送 Message服务端收到指令之后回复一个 Ack 答复信息,客户端收到答复信息之后便结束进程;
  3. 服务端根据收到的指令调用主题包中的对应函数进行操作;

现在到程序的循环模式中:

  1. 服务端和客户端都使用了同一种的循环模式;
  2. 使用一个 while(1) 来对 events 和 timeout 两个结构进行循环;
    1. events 用于发送和接收指令信息;
    2. timeout 用于进行超时处理,进度条和界面的重绘都挂载在 timeout 下on_timeout 用于界面的重绘,这个函数可以由主题或者 LIB 提供,在我看来这两个端和 X 的客户端和 Server 端相似;

2. 工作路径

系统开机主题存储在:/usr/share/plymouth/themes 路径下。

配置选择在:/etc/alternatives 下,主要有:

  1. /etc/alternatives/default.plymouth.grub
  2. /etc/alternatives/default.plymouth
  3. /etc/alternatives/text.plymouth

3. 安装 Plymouth 主题

# Ubuntu
sudo apt-get install plymouth-theme-* 
# 选择开机主题
sudo update-alternatives --config default.plymouth
# 初始 initramfs, 应用开机主题变更.
sudo update-initramfs -u