標籤:

CentOS版的linux的進度條為什麼是三種顏色的?

為什麼是白色,淺藍,藍色三種,快慢還不一樣

沒用過別的版本


這個問題我也關注了一段時間,一直沒看到好的回答。於是今天稍微花時間看了一下。

顯示進度狀態的程序叫做 boot splash ,Fedora 從 10 開始就已經使用 Plymouth 作為 boot splash , CentOS 自然也是用這個。

在 CentOS 6.5 中可以看到安裝了如下幾個包:

plymouth-scripts-0.8.3-27.el6.centos.x86_64

plymouth-0.8.3-27.el6.centos.x86_64

plymouth-core-libs-0.8.3-27.el6.centos.x86_64

plymouth 有自己的 theme 方案。在 CentOS 中默認有兩個主題:

plymouth-set-default-theme --list

details

text

題主問的三色進度條,就是 text。那這三個顏色是什麼意思呢?找來找去沒看到文檔,只好從 code 裡面找答案了。

text 這個 theme 的配置文件如下:、

/usr/share/plymouth/themes/text

[Plymouth Theme]

Name=Text

Description=Text mode theme with tricolor progress bar

ModuleName=text

得,得去找 text 的 module 了,系統裡面翻了一下,這個 module 是個 so 文件啊。

/usr/lib64/plymouth/text.so

行吧,我們只能把源碼拖下來看了。

找到 plymouth/src/plugins/splash/text/http://Makefile.in 就可以看到一些變數的設置:

text_la_CFLAGS = $(PLYMOUTH_CFLAGS)

-DPLYMOUTH_BACKGROUND_COLOR=$(background_color)

-DPLYMOUTH_BACKGROUND_END_COLOR=$(background_end_color)

-DPLYMOUTH_BACKGROUND_START_COLOR=$(background_start_color)

從字面就可以初步看出分為三種顏色:背景、啟動、完成。

代碼裡面我沒有看的特別細,節選一段函數出來。

view_start_animation (view_t *view)
{
ply_boot_splash_plugin_t *plugin;
ply_terminal_t *terminal;
assert (view != NULL);
plugin = view-&>plugin;
terminal = ply_text_display_get_terminal (view-&>display);
ply_terminal_set_color_hex_value (terminal,
PLY_TERMINAL_COLOR_BLACK,
0x000000);
ply_terminal_set_color_hex_value (terminal,
PLY_TERMINAL_COLOR_WHITE,
0xffffff);
ply_terminal_set_color_hex_value (terminal,
PLY_TERMINAL_COLOR_BLUE,
0x3465a4);
ply_terminal_set_color_hex_value (terminal,
PLY_TERMINAL_COLOR_BROWN,
0x979a9b);

ply_text_display_set_background_color (view-&>display,
PLY_TERMINAL_COLOR_BLACK);
ply_text_display_clear_screen (view-&>display);
ply_text_display_hide_cursor (view-&>display);

if (plugin-&>mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN) {
ply_text_step_bar_hide (view-&>step_bar);
return;
}

ply_text_step_bar_show (view-&>step_bar,
view-&>display);

}

所以在 text 模塊中設置了四種顏色,黑(背景),白、藍、棕(唉?啟動的時候沒看到啊)

那這幾個顏色到底是什麼意思呢?

再回到 plymouth 的代碼裡面,ply-text-progress-bar.c ply_text_progress_bar_draw 函數:

void
ply_text_progress_bar_draw (ply_text_progress_bar_t *progress_bar)
{
int i, width;
double brown_fraction, blue_fraction, white_fraction;

if (progress_bar-&>is_hidden)
return;

width = progress_bar-&>number_of_columns - 2 - strlen (os_string);

ply_text_display_set_cursor_position (progress_bar-&>display,
progress_bar-&>column,
progress_bar-&>row);

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);
else if (f &< blue_fraction) ply_text_display_set_background_color (progress_bar-&>display,
PLY_TERMINAL_COLOR_BLUE);
else if (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", );
}

ply_text_display_set_background_color (progress_bar-&>display,
PLY_TERMINAL_COLOR_BLACK);

if (brown_fraction &> 0.5) {
if (white_fraction &> 0.875)
ply_text_display_set_foreground_color (progress_bar-&>display,
PLY_TERMINAL_COLOR_WHITE);
else if (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);

ply_text_display_set_foreground_color (progress_bar-&>display,
PLY_TERMINAL_COLOR_DEFAULT);
}
}

和問題相關的部分應該是 :

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;

額。。。這算啥意思?藍色就是 done 了多少。白色是 done 的二次方??棕色是 2* done - (done 二次方)?

完全不理解含義啊!

假設整體進度完成了 0.7 , 那麼白色就在 0.49 , 棕色則在 0.91。所以在這個演算法下,白色無限接近藍色,到1就重合。藍色無限接近棕色,最後重合。

又去看了一眼截圖,好像就是這麼一回事兒啊……

這四位作者:

* Written by: Adam Jackson &

* Bill Nottingham &

* Ray Strode &

* Soeren Sandmann &

為了圖形界面的美化進行了不懈的努力。我們要報以崇高的敬意。

我不熟悉代碼,如果理解錯誤希望指正。


CentOS是RHEL的那啥版本,一切都是照著紅帽來的,紅帽是紅色的,CentOS改成了藍色而已。

PIA!那啥究竟是那啥?

好吧,這叫進度條,系統啟動到哪個階段進度條就走到哪裡,題主可以對著進度條掐著表,然後重啟,這次記得按F1.如果還是不夠詳細的話把grub里kernel那一行末尾的quiet去掉

摺疊了吧,具體的我也不知道


推薦閱讀:

【技術人快報】Linux補丁是「完全無用的垃圾」+上海銀行探索智能運維
Linux為什麼要衍生出那麼多的版本,統一一下產品線不好么?
Linux下的timerfd在OS X下可以用什麼替代?
為什麼計算機專業的學生要學習使用 Linux 系統?
為什麼要切換到 Linux 系統?我該怎麼做?

TAG:Linux | CentOS |