CentOS版的linux的進度條為什麼是三種顏色的?
為什麼是白色,淺藍,藍色三種,快慢還不一樣
沒用過別的版本
這個問題我也關注了一段時間,一直沒看到好的回答。於是今天稍微花時間看了一下。顯示進度狀態的程序叫做 boot splash ,Fedora 從 10 開始就已經使用 Plymouth 作為 boot splash , CentOS 自然也是用這個。在 CentOS 6.5 中可以看到安裝了如下幾個包:
plymouth 有自己的 theme 方案。在 CentOS 中默認有兩個主題: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-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 系統?我該怎麼做?