基于bootsplash的嵌入式linux启动画面定制
摘 要:在基于linux的嵌入式仿真平台研发中,利用开源工具bootsplash能够定制启动logo、设定控制台背景和显隐启动时的字符信息,甚至能够支持开机进度条的动画显示。本文介绍利用bootsplash打造启动画面的解决方案,涉及内核补丁、用户空间配置等方面的具体工作。
关键字:嵌入式; 启动;仿真环境
在基于linux的嵌入式仿真平台研发中,终端的美观和可定制是个重要的问题。开机时滚动在屏幕上的字符串和单调的penguin图标,使嵌入式设备仍然脱离不了pc的痕迹,linux控制台上单调的“白纸黑字”型表现方式可谓大煞风景。改造linux控制台使之美观可定制地展示开机信息和logo成为基于嵌入式linux应用的一项重要工作。
开源项目bootsplash(
http://www.bootsplash.org/
)为解决这个问题提供了一个完美的解决方案。Boot-
splash通过对内核打补丁来改变linux framebuffer控制台对图像显示的支持。通过用户空间程式来定制启动logo、设定控制台背景和显隐启动时的字符信息,甚至能够支持开机画面的动画显示。本文介绍利用splashboot打造启动画面的解决方案,涉及内核补丁、用户空间配置等方面的具体工作。
1 内核补丁和控制工具
1.1 支持bootsplash的内核补丁
针对不同的内核版本,bootsplash站点上给出了相应的内核补丁。我们所使用的内核版本为2.4.23,下载并给内核打上补丁:
cd /usr/src/linux
make mrproper
patch -Np1 -i ../bootsplash-3.0.7-2.4.23.diff
重新编译内核:
make menuconfig
选上如下的几个参数:
Code maturity level options --->
Prompt for development and/or incomplete code/drivers
Block devices ---> RAM disk support
Block devices ---> Initial RAM disk (initrd) support
Console drivers ---> Video mode selection support
Console drivers ---> Frame-buffer support --->
Support for frame buffer devices
VESA VGA graphics console
Use splash screen instead of boot logo
然后编译内核:
make dep && make bzImage
再把生成的内核拷贝到/boot下:
cp arch/i386/boot/bzImage /boot/linux-bootsplash
这样我们得到的新内核bzImage就是支持bootsplash的内核了,剩下的工作就是对bootsplash的定制了。
1.2 安装用户空间程式
下载bootsplash工具,解压安装:
tar ?zxf bootsplash-3.0.7.tar.gz
cd bootsplash-3.0.7/Utilities
make
cp fbresolution fbmngplay fbtruetype splash /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−melenas root=/dev/hda4 vga=791 splash=silent
initrd (hd0,3)/boot/initrd.splash
在LILO中加入或修改下面的行:
vga=791
initrd=/boot/initrd.splash
append="splash=silent"
来看看这几行的意义:
vga=791: boot splash 将在1024x768 分辨率和65000 色 (16 位色)下显示。Framebuffer的设定要根据我们所使用的theme的分辨率和颜色深度来选择。
splash=silent: 在silent模式下显示boot splash. 假如您希望用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页上表示颜色的一致。
举例说明之:
progress 0 0 512 384 FFFFFF
将会在屏幕左上角画一个白色的四边形,这个四边形占据四分之一屏幕。
progress 256 192 521 384 FCD192
将会在屏幕正中间位置画一个黄色的四边形。
看这些例子的效果应该在tty终端上运行,不要在Konsole 或xterm window上看效果。
搞清楚progress的用法后,我们来看怎么把他和系统启动联系起来。通过分析Debian的启动代码,我们能够看出:他的启动脚本在每次启动完一个服务程式(xfs, cron, samba 或其他服务程式)后使用progress程式来在指定位置画指定大小的四边形。在Debian中启动脚本有两个:先执行/etc/init.d/rcS然后执行 /etc/init.d/rc。下面研究一下/etc/init.d/rcS代码,注意这个脚本一次调用各个rulevel下的脚本。我们在其中加入画四边形的代码,加入的代码用加黑表示:
# 初始化变量j
# j 为进度条的宽度
j=20
for i in /etc/rcS.d/S??*
do
[ ! −f "$i" ] &continue
# 进度条开始
#
# 确保进度条宽度不超出范围
if ((j /tmp/boots
mv /tmp/boots /etc/init.d/rc
chmod 755 /etc/init.d/rc
上面的代码很清楚,获得j的值,在第二个脚本文档rc中寻找字符串“danger_var=…”并把他修改为 “danger_var=结束时的j值”,把修改后的文档另存为/tmp/boots,然后重命名为/etc/init.d/rc并改变执行权限。
假如选用danger_var作为变量名来传递位置值,那么注意在其他启动脚本中不能出现名字冲突。
现在,重启电脑,能够享受美丽的开机进度条了。
4 结论
通过开源项目bootsplash提供的内核补丁和各种用户空间工具,能够实现对FrameBuffer下的控制台美化和定制。这对于嵌入式仿真环境平台的研发有着重要的意义,使得嵌入式仿真环境平台从一定程度上减少PC的痕迹,成为个性化和高度可定制的平台。
参考文献:
[1] Dennis Herbrich,Arch Linux BootSplash-HowTo. http://www.archlinux.org
[2] Pedro Jurado Maqueda, BULMA: Graphic boot with bootsplash and progress bar in Debian. http://bulma.net/
[3] 轻松拿下Bootsplash. http://www.linuxsir.org/bbs/
基于bootsplash的嵌入式linux启动画面定制的更多相关文章
- 嵌入式linux启动信息完全注释
嵌入式linux启动信息完全注释 from:http://www.embedlinux.cn/ShowPost.asp?ThreadID=377 摘要 我们在这里讨论的是对嵌入式linux系统的启动过 ...
- 【转】嵌入式Linux启动配置文件及脚本
原文网址:http://blog.csdn.net/shuaishuai80/article/details/6202497 使用Busybox制作根文件系统时,/etc目录非常重要,它包含了嵌入式L ...
- 嵌入式Linux启动配置文件及脚本分…
使用Busybox制作根文件系统时,/etc目录非常重要,它包含了嵌入式Linux启动所需的配置文件及脚本.由于init进程,或者说linuxrc程序会解析inittab文件,因此就从/etc/ini ...
- CH02基于ZYNQ的嵌入式LINUX移植
CH02基于ZYNQ的嵌入式LINUX移植 1.1概述 实验环境: Windows 10 专业版 Vmware workstation 14.1.1 Ubuntu 16.04.3 Xilinx SDx ...
- 嵌入式Linux启动过程中的问题积累
嵌入式Linux启动过程中的问题积累 Dongas 07-12-19 1.Bad Magic Number ## Booting image at 33000000 ... Bad Magic Num ...
- 嵌入式Linux启动优化手记2 U…
参考一下 原文地址:U-boot优化">嵌入式Linux启动优化手记2 U-boot优化作者:ZhaoJunling 既然不能使用新的U-boot,那就优化一点是一点,慢慢干吧. 1. ...
- 转:嵌入式linux启动时运行的inittab文件
嵌入式系统下的linux启动配置文件,不同与普通的PC linux启动配置,启动相关文件与文件的内容也要少得多.嵌入式系统下的linux启动过程一般是: 1 在bootloader中制定各种要 ...
- 基于ARM9和嵌入式Linux系统的多功能综合通信控制系统的框架
基于ARM9硬件平台和嵌入式Linux系统的多功能综合通信控制系统的框架设计及各模块的功能.系统采用符合POSIX.1标准的C语言编写,实现了对下位机传送数据帧的采集.分析和存储,并能根据上位机的配置 ...
- [转载]嵌入式linux启动时运行的inittab文件
源地址:https://www.cnblogs.com/yfz0/p/5853826.html 嵌入式系统下的linux启动配置文件,不同与普通的PC linux启动配置,启动相关文件与文件的内容也要 ...
随机推荐
- hdu1316
链接:pid=1316" target="_blank">点击打开链接 题意:问区间[a,b]中有多少斐波那契数 代码: #include <iostream ...
- JavaWeb学习笔记:Servlet
Servlet JavaWeb 概念 Java Web应用由一组Servlet.HTML页面.类.以及其他能够被绑定的资源构成. 他能够在各种供应商提供的实现Servlet规范的Servlet容器中执 ...
- 非spring托管的类使用spring脱管的类。
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationConte ...
- WARN util.NativeCodeLoader: Unable to load native-hadoop l... using builtin-java classes where applicable(附编译脚本)
WARN util.NativeCodeLoader: Unable to load native-hadoop l... using builtin-java classes where appli ...
- JS常见事件以及函数
1.js enter键激发事件 document.onkeydown = function (e) { if (!e) e = window.event; ...
- erlang中的图片下载
问题如题,这是在一个群里问的一个的问题.其实就是http的Server的上传下载的功能. ibrowse:start().ibrowse:send_req("http://img1.gti ...
- HTTP POST请求数据提交格式(转)
FROM: http://bbs.125.la/thread-13743350-1-1.html HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT ...
- [Python]xlrd 读取excel 日期类型2种方式
有个excle表格须要做一些过滤然后写入数据库中,可是日期类型的cell取出来是个数字,于是查询了下解决的办法. 主要的代码结构 data = xlrd.open_workbook(EXCEL_PAT ...
- 手动删除引用nuget如何还原
1.不小心从项目的引用中删除了nuget安装的程序集; 2.从其他地方复制的packages.config到当前项目; 这两种情况 在解决方案中是无法通过还原nuget来还原程序集的,可以通过以下的方 ...
- Unity3D自定义编辑器简单实例
MenuItem:在标题栏自定义菜单.需要在Editor文件夹内创建脚本,无需挂载.但是注意其下的函数必须为静态函数. using UnityEngine; using UnityEditor; pu ...