1.Plymouth源代码目录介绍
源码包里最重要的就是src这个目录,这是程序的源代码目录。下面将介绍src目录的内容,src目录的主要内容如下所示。这里只列举出了与文本模式启动显示相关的主要文件,并非全部。
./src
├── client
│ ├──plymouth.c # plymouth客户程序
├── libply
│ ├──ply-event-loop.c #plymouth启动过程中的事件处理流程
├──libply-splash-core
│ ├──ply-text-progress-bar.c #文本模式下使用到的画面刷新函数
├──libply-splash-graphics
├── plugins
│ ├── controls
│ ├── renderers
│ └── splash #plymouth的splash插件目录
│ ├── details
│ ├── script #该模块负责解析scripting脚本语言编写的启动代码
│ └── text #文本模式下的启动splash插件
├──upstart-bridge
├── viewer
├──main.c #plymouthd启动的主函数
└──ply-boot-server.c #plymouthd中负责与client通信的代码
Plymouth的主题(theme)使用splash插件(plugins)来完成实际的启动界面显示工作。不同的主题使用到不同的splash插件。例如,红帽6的Ring主题使用的是two-step插件来显示启动画面的,许多主题使用的是script插件,这个插件支持scripting语言,可以更方便地实现我们想要的启动效果。文本模式下的启动界面,则是由text插件负责的。
2. Plymouth启动过程介绍
Plymouth在系统启动的过程中由initramfs中的init启动。Init分别启动Plymouthd守护进程和plymouth客户程序。由plymouth客户程序,通过Socket向Plymouthd守护进程发送show-splash,开始显示启动画面。同时,ply_boot_splash_update_progress被注册为Timeout事件,而定期地调用on_boot_progress,刷新启动界面。on_boot_progress是插件(plugin)提供的方法。Text插件的on_boot_progress方法会调用ply-text-progress-bar.c的ply_text_progress_bar_draw()方法显示启动画面。
3. 如何修改文本模式的启动界面 如何修改文本模式的启动界面
由上文可以知道文本模式下的启动画面主要是由ply-text-progress-bar.c的ply_text_progress_bar_draw()方法完成的,所以接下来看看这个方法是如何显示启动画面的。
代码如下所示,并不复杂。首先,使用progress_bar->percent_done进度值,计算三种颜色的显示位置和比例,绘制进度条。然后,显示OS名称字符串。
void
ply_text_progress_bar_draw (ply_text_progress_bar_t *progress_bar)
{
width = progress_bar->number_of_columns - 2 - strlen (os_string);//获取进度条的宽度width
ply_text_display_set_cursor_position(progress_bar->display, //设置输出光标在屏幕上的位置
progress_bar->column,
progress_bar->row);
//根据启动进度percent_done获取三种颜色的显示比例
brown_fraction = - (progress_bar->percent_done * progress_bar->percent_done) + 2 * progress_bar->percent_done;
blue_fraction = progress_bar->percent_done;
white_fraction = progress_bar->percent_done * progress_bar->percent_done;
for (i = 0; i 设置进度条每个显示单位的颜色
double f;
f = (double) i / (double) width;
if (f
ply_text_display_set_background_color (progress_bar->display,
PLY_TERMINAL_COLOR_WHITE);
elseif (f
ply_text_display_set_background_color (progress_bar->display,
PLY_TERMINAL_COLOR_BLUE);
elseif (f
ply_text_display_set_background_color (progress_bar->display,
PLY_TERMINAL_COLOR_BROWN);
else
break;
ply_text_display_write(progress_bar->display, "%c", ' ');
}
if(brown_fraction > 0.5) {//当启动进度达到一定值后,显示OS名称字符串
//设置OS名称字符串的颜色
if (white_fraction > 0.875)
ply_text_display_set_foreground_color(progress_bar->display,
PLY_TERMINAL_COLOR_WHITE);
elseif (blue_fraction > 0.66)
ply_text_display_set_foreground_color (progress_bar->display,
PLY_TERMINAL_COLOR_BLUE);
else
ply_text_display_set_foreground_color (progress_bar->display,
PLY_TERMINAL_COLOR_BROWN);
ply_text_display_set_cursor_position(progress_bar->display,
progress_bar->column + width,
progress_bar->row);
ply_text_display_write(progress_bar->display, "%s",os_string); //显示OS名称字符串
ply_text_display_set_foreground_color (progress_bar->display,
PLY_TERMINAL_COLOR_DEFAULT);
}
}
在屏幕上显示字符时,首先确定光标的位置,使用set_cursor_position设置,然后使用set_foreground_color设置字符颜色,最后使用write输出字符。其中进度条使用的是空格做为显示字符。
OS名称字符串是通过全局变量os_string获得的,由get_os_string()得到。get_os_string方法读取initramfs中的/etc/system-release文件,这个文件里就存放一个字符串。字符串的格式要求很严格,必须是“os名称+空格+release+空格+os版本+(代号)”,否则得到的os_string将是空字符串。
4. 编译及制作rpm
这里介绍的方法是基于SRPM源码包的。以plymouth-0.8.3-24.el6.1.src.rpm为例。
首先,安装SRPM源码包。
rpm –i plymouth-0.8.3-24.el6.1.src.rpm
在rpmbuild/SOURCE目录下产生Plymouth的原文件的压缩档案plymouth-0.8.3.tar.bz2,将其解压缩。产生plymouth-0.8.3原码目录。
tar xvf plymouth-0.8.3.tar.bz2
接着,在plymouth-0.8.3原文件目录下,修改相关文件。完成后,Plymouth的原码目录重新压缩为plymouth-0.8.3.tar.bz2
最后,在rpmbuild/SPEC目录下,运行‘rpmbuild –ba plymouth.spec’,开始重新编译及RPM包的生成。
Plymouth的编译过程,需要依赖于很多安装包,如果在这个过程中出错,通常都是缺少相应的安装包。
5.参考
-
http://www.freedesktop.org/wiki/Software/Plymouth
-
http://blog.fpmurphy.com/2009/09/project-plymouth.html
-
Plymouth源码包含的Doc文档:development.txt