在對是最近才開始玩bootsplash的,之前一直覺得很麻煩懶得去動。最近也不知道哪根筋不對突然想玩看看,花了兩天才裝好(家裡實驗機只有p3 6xx,編kernel要編快一小時)又花了兩三天做自已的theme,最後就是今天的成果。
這幾天為了改theme不知道重開機幾次,每次看splash畫面,就一個進度條在跑,也不知道到底他在幹嘛,這樣是很像windows沒錯,總還是覺得差了點什麼。今天突然愰然大悟:原來看不到訊息的Linux,對我來說就不像Linux了,我開始試著讓字跑出來。研究 /sbin/splash.sh 之後發現,文字訊息是在 /etc/defaults/bootsplash 裡,是固定的。顯示是交由 fbtruetype 來處理。再來發現了一個很可疑的 if 敘述
- 代碼: 選擇全部
#if [ "$1" == "mountkernfs.sh start" -o "$1" == "bootsplash stop" ]; then
if [ x$_shutdown == xyes ]; then
_msg=$MSG_SHUTDOWN; # may be defined in /etc/default/bootsplash
[ -z "$_msg" ] && _msg="Shutting down the system... Press F2 for
verbose mode"
else
_msg=$MSG_BOOT; # may be defined in /etc/default/bootsplash
[ -z "$_msg" ] && _msg="Booting the system... Press F2 for verbose mode"
fi
if [ "$2" != "" ];
then
_msg="$2"
fi
if [ "$text_x" != "" -a "$text_y" != "" \
-a "$text_color" != "" -a "$text_size" != "" -a "$_silent" == "yes" ];
then
case "$USE_STATIC_FBT" in
[Yy]*)
fbtruetype="fbtruetype.static"
;;
*)
fbtruetype="fbtruetype"
;;
esac
$fbtruetype -x $text_x -y $text_y -t $text_color -s $text_size "$_msg"
fi
#fi
以上程式碼已經被我改動過,想看原廠貨請自行 less
要有變動的訊息,很簡單、很直觀,一定會有個什麼東西要去把上次的訊息擦掉,再顯示新的訊息。
直接設定:殘念,有開overpaintok的狀況下他根本不會擦掉
關掉overpaintok:訊息只是閃一下就不見了
經過重覆修改測試,我發現
echo "show [some number]" > /proc/splash
的時候會重繪螢幕(有設overpaintok的話則只會重繪box)(其實這句還滿廢話的XD)
而在原始的 /sbin/splash.sh 中,重繪螢幕是"整個script的最後"才做的事
所以把那行移上去就ok了
HOWTO:
目標:讓silent splash畫面上,能顯示目前到底在run哪個init script
步驟:
1. 修改 /etc/init.d/rc 為rc_splash函數追加一個參數,作為顯示在splash上的文字 (第三行)
- 代碼: 選擇全部
rc_splash() {
#test "$SPLASH" != "no" && test "$_rc_splash" -eq 1 && /sbin/splash "$1"
test "$SPLASH" != "no" && /sbin/splash.sh "$1" "$2"
# make sure we don't add unless we really made progress
if [ "$1" != "master" -a "$1" != "splash start" -a "$1" != "shutdown" ]
then
progress=$(( $progress + 1 ))
fi
}
2. 修改 /etc/init.d/rc 中所有有呼叫 rc_splash的地方
把 rc_splash "$script start" 改成
rc_splash "$script start" "Processing $script"
(請善用sed)
3. 修改 /sbin/splash.sh,把最下方的重繪螢幕移上來,並把第二個參數當成要顯示的訊息
- 代碼: 選擇全部
echo "show $(( 65534 * ( $progress ) / 100 ))" > /proc/splash
#
# Print text string. (Booting/Shutting down the system. Press
# F2 for verbose mode)
#
#if [ "$1" == "mountkernfs.sh start" -o "$1" == "bootsplash stop" ]; then
if [ x$_shutdown == xyes ]; then
_msg=$MSG_SHUTDOWN; # may be defined in /etc/default/bootsplash
[ -z "$_msg" ] && _msg="Shutting down the system... Press F2 for verbose mode"
else
_msg=$MSG_BOOT; # may be defined in /etc/default/bootsplash
[ -z "$_msg" ] && _msg="Booting the system... Press F2 for verbose mode"
fi
if [ "$2" != "" ];
then
_msg="$2"
fi
if [ "$text_x" != "" -a "$text_y" != "" \
-a "$text_color" != "" -a "$text_size" != "" -a "$_silent" == "yes" ];
then
case "$USE_STATIC_FBT" in
[Yy]*)
fbtruetype="fbtruetype.static"
;;
*)
fbtruetype="fbtruetype"
;;
esac
$fbtruetype -x $text_x -y $text_y -t $text_color -s $text_size "$_msg"
fi
#fi
4. 在 theme的config裡加上一個用來清除訊息的box
- 代碼: 選擇全部
text_x=533
text_y=672
text_size=14
text_color=0x000000
box silent 533 665 1020 690 #ffffff #ffffff #ffffff #ffffff
我的設定是白底黑字(雖說很傷螢幕的感覺,可是沒辦法,女友堅持她的照片要用白底,她說看起來皮膚會比較白= =)
5. 更新你的initrd,enjoy it
rm /boot/initrd.`uname -r`
update-initramfs -ck `uname -r`
reboot