Linux内核之基于Bootsplash嵌入式Linux启动画面定制文档格式.docx
《Linux内核之基于Bootsplash嵌入式Linux启动画面定制文档格式.docx》由会员分享,可在线阅读,更多相关《Linux内核之基于Bootsplash嵌入式Linux启动画面定制文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
gt;
Promptfordevelopmentand/orincompletecode/drivers
Blockdevices---&
RAMdisksupport
InitialRAMdisk(initrd)support
Consoledrivers---&
Videomodeselectionsupport
Frame-buffersupport---&
Supportforframebufferdevices
VESAVGAgraphicsconsole
Usesplashscreeninsteadofbootlogo
然后编译内核:
makedep&
amp;
&
makebzImage
再把生成的内核拷贝到/boot下:
cparch/i386/boot/bzImage/boot/linux-bootsplash
这样我们得到的新内核bzImage就是支持bootsplash的内核了,剩下的工作就是对bootsplash的定制了。
1.2安装用户空间程序
下载bootsplash工具,解压安装:
tar–zxfbootsplash-3.0.7.tar.gz
cdbootsplash-3.0.7/Utilities
make
cpfbresolutionfbmngplayfbtruetypesplash/sbin/ 这样完成了对用户空间工具的安装,其实bootsplash分别利用如下的四个程序:
splash程序是将需要在framebuffer下显示的图片
资源制作成启动ram盘的工具;
fbmngplay读mng文件,播放动画;
fbtruetype显示truetype字体;
fbresolution检
查分辨率。
后面提到的脚本,只是以不同参数来读取配置文件,调用上面的这几个程序。
2开机LOGO的定制 2.1设置splash屏幕的主题
前面安装好的splash用户空间程序中有一个程序splash,它需要一个配置文件来指明使用哪个图片、要不要隐藏文本信息的输出等。
可以看出
“theme”就是splash工具需要的配置文件、图片和其他所需要的文件的集合。
有很多已经准备好的theme可供挑选,我们也可以定制theme。
为了方便起见,我们下载theme-Linux.tar.bz2并以它为theme。
建立目录/etc/bootsplash/themes,解压Theme-Linux.tar.bz2到这个目录下,现在的目录结构应该是:
/etc/bootsplash/themes/Linux
读者朋友可以看看该目录下的bootsplash-1024x768.cfg来观察配置文件的格式。
这个简单的文件包含的选项不多,事实上它只是清楚
地表明应该显示哪幅图片、控制台显示文本的颜色和背景色以及文本信息输出的位置区域。
另外,不要忘了它还可以分别指定verbose和silent模式下
显示文件的位置。
Silent模式禁止显示启动信息,代之以一个可选的进度条(这需要关于A外包脚本的更多设置)。
基于这个配置文件,你可以自己修改以显
示自己喜欢的图片和采用自己喜欢的模式。
2.2利用splash小工具安装splash主题到initrd
在系统启动的早期阶段,内核还不能读写硬盘。
这个阶段要显示图片,那么图片放在什么地方那?
答案是把图片写到ramdisk里,这样在启动的时候才能
读到,因为这时候还没有加载分区呢。
当然不用担心initrd的制作,splash小工具能轻松搞定。
Splash小工具能根据基于你选择的配置文件
(theme)来自动产生一个initrd。
所要做的就是执行如下命令:
splash-s-f/etc/bootsplash/themes/arch/config/arch-1024-boot.cfg/boot/initrd.splash
生成的initrd.splash就是一个新的initrd。
在GRUB或LILO中加入它就可以了。
按如下的方法修改GRUB或LILO:
在GRUB中加入或修改下面的行:
kernel(hd0,3)/boot/vmlinuz?
2.4.21?
melenasroot=/dev/hda4vga=791splash=silent
initrd(hd0,3)/boot/initrd.splash
在LILO中加入或修改下面的行:
vga=791
initrd=/boot/initrd.splash
append="
splash=silent"
来看看这几行的意义:
vga=791:
bootsplash将在1024x768分辨率和65000色(16位色)下显示。
Framebuffer的设定要根据我们所使用的theme的分辨率和颜色深度来选择。
splash=silent:
在silent模式下显示bootsplash.如果你希望用vebose模式,只需删除此行即可。
Verbose模式是缺省模式。
initrd=/boot/initrd.splash:
这行将initrd.splash调入启动ram盘(图片存于其中)。
更新LILO或GRUB后,就可以看到精美的启动画面。
3启动进度条的显示 首先我们要弄清楚小工具程序progress(它是和splash程序一起拷到/sbin目录下的)。
progress能够在framebuffer
设备(默认情况下是/dev/fb0)上画四边形。
不带任何参数运行progress,我们可以看到该程序的可选参数列表,我们感兴趣的几个参数是:
x:
四边形起始点的x坐标
y:
四边形起始点的y坐标
dx:
四边形的宽度
dy:
四边形的高度
color:
四边形的颜色。
这是一个16进制数,于web页上表示颜色的一致。
举例说明之:
progress00512384FFFFFF
将会在屏幕左上角画一个白色的四边形,这个四边形占据四分之一屏幕。
progress256192521384FCD192
将会在屏幕正中间位置画一个黄色的四边形。
看这些例子的效果应该在tty终端上运行,不要在Konsole或xtermwindow上看效果。
搞清楚progress的用法后,我们来看怎么把它与系统启动联系起来。
通过分析Debian的启动代码,我们可以看出:
它的启动脚本在每次启动完一
个服务程序(xfs,cron,samba
或其他服务程序)后使用progress程序来在指定位置画指定大小的四边形。
在Debian中启动脚本有两个:
先执行/etc/init.d/rcS然
后执行
/etc/init.d/rc。
下面研究一下/etc/init.d/rcS代码,注意这个脚本一次调用各个rulevel下的脚本。
我们在其中加入画四
边形的代码,加入的代码用加黑表示:
#
danger_var=395
j=danger_var
foriin/etc/rc$runlevel.d/S*
do
[!
?
f$i]&
continue
if[$previous!
=N]&
[$previous!
=S]
then
#
#Findstartscriptinpreviousrunleveland
#stopscriptinthisrunlevel.
suffix=${i#/etc/rc$runlevel.d/S[0?
9][0?
9]}
stop=/etc/rc$runlevel.d/K[0?
9]$suffix
previous_start=/etc/rc$previous.d/S[0?
#Ifthereisastartscriptinthepreviouslevel
#and_no_stopscriptinthislevel,wedon"
t
#havetore?
starttheservice.
[?
f$previous_start]&
[!
f$stop]&
fi
#继续进度条绘制
#保证进度条宽度不超出范围
if((j&
lt;
616))
/usr/local/bin/progress204666$j21FCD123
letj=j+15
#结束进度条绘制
case"
$runlevel"
in
0|6)
startup$istop
;
;
*)
startup$istart
esac
done
这段代码以同样的方式接着画四边形进度条。
但是danger_var是什么呢?
前面说过为
了平滑地接着第一部分画,我们需要知道第一部分四边形画到什么位置结束的。
这个位置就用danger_var来记录。
问题又来了,怎么将第一个脚本里的变
量传到第二个脚本?
可以在第一个脚本/etc/init.d/rcS的末尾加上如下的代码:
sed"
s/danger_var=[0?
9]*/danger_var="
$j"
/g"
/etc/init.d/rc&
/tmp/boots
mv/tmp/boots/etc/init.d/rc
chmod755/etc/init.d/rc
上面的代码很清楚,获得j的值,在第二个脚本文件rc中寻找字符串“danger_var=…”并把它修改为“danger_var=结束时的j值”,把修改后的文件另存为/tmp/boots,然后重命名为/etc/init.d/rc并改变执行权限。
如果选用danger_var作为变量名来传递位置值,那么注意在其他启动脚本中不能出现名字冲突。
现在,重启计算机,可以享受美丽的开机进度条了。
4结论
通过开源项目bootsplash提供的内核补丁和各种用户空间工具,可以实现对FrameBuffer下的控制台美化和定制。
这对于嵌入式仿真环境平台的开发有着重要的意义,使得嵌入式仿真环境平台从一定程度上减少PC的痕迹,成为个性化和高度可定制的平台。
#初始化变量j
#j为进度条的宽度
j=20
foriin/etc/rcS.d/S?
?
*
f"
$i"
]&
#进度条开始
#保证进度条宽度不超出范围
#此时调用progress程序,画比前一次宽一个单位
#(15个像素)的进度条
#xydxdycolor
/usr/local/bin/progress204667$j21FCD123
#结束进度条绘制
*.sh)
(
trap?
INTQUITTSTP
setstart
.$i
)
#遍历sh文件后,启动子进程
$istart
;