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



 



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