Plymouth文本模式启动画面修改

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               #plymouthsplash插件目录

  │       ├── 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 < width; i++) {//设置进度条每个显示单位的颜色

        double f;

        f = (double) i / (double) width;

        if (f < white_fraction)

           ply_text_display_set_background_color (progress_bar->display,

                                                  PLY_TERMINAL_COLOR_WHITE);

        elseif (f < blue_fraction)

           ply_text_display_set_background_color (progress_bar->display,

                                             PLY_TERMINAL_COLOR_BLUE);

        elseif (f < brown_fraction)

           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.参考



 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章