Linux内核之基于Bootsplash嵌入式Linux启动画面定制.docx

上传人:b****6 文档编号:7946616 上传时间:2023-01-27 格式:DOCX 页数:8 大小:19.23KB
下载 相关 举报
Linux内核之基于Bootsplash嵌入式Linux启动画面定制.docx_第1页
第1页 / 共8页
Linux内核之基于Bootsplash嵌入式Linux启动画面定制.docx_第2页
第2页 / 共8页
Linux内核之基于Bootsplash嵌入式Linux启动画面定制.docx_第3页
第3页 / 共8页
Linux内核之基于Bootsplash嵌入式Linux启动画面定制.docx_第4页
第4页 / 共8页
Linux内核之基于Bootsplash嵌入式Linux启动画面定制.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

Linux内核之基于Bootsplash嵌入式Linux启动画面定制.docx

《Linux内核之基于Bootsplash嵌入式Linux启动画面定制.docx》由会员分享,可在线阅读,更多相关《Linux内核之基于Bootsplash嵌入式Linux启动画面定制.docx(8页珍藏版)》请在冰豆网上搜索。

Linux内核之基于Bootsplash嵌入式Linux启动画面定制.docx

Linux内核之基于Bootsplash嵌入式Linux启动画面定制

Linux内核之基于Bootsplash嵌入式Linux启动画面定制

Linux内核之基于Bootsplash嵌入式Linux启动画面定制

  在基于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

  makemrproper

  patch-Np1-i../bootsplash-3.0.7-2.4.23.diff

  重新编译内核:

  makemenuconfig

  选上如下的几个参数:

  Codematurityleveloptions--->

  Promptfordevelopmentand/orincompletecode/drivers

  Blockdevices--->RAMdisksupport

  Blockdevices--->InitialRAMdisk(initrd)support

  Consoledrivers--->Videomodeselectionsupport

  Consoledrivers--->Frame-buffersupport--->

  Supportforframebufferdevices

  VESAVGAgraphicsconsole

  Usesplashscreeninsteadofbootlogo

  然后编译内核:

  makedep&&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][0?

9]$suffix

  previous_start=/etc/rc$previous.d/S[0?

9][0?

9]$suffix

  #

  #Ifthereisastartscriptinthepreviouslevel

  #and_no_stopscriptinthislevel,wedon"t

  #havetore?

starttheservice.

  #

  [?

f$previous_start]&[!

?

f$stop]&continue

  fi

  #继续进度条绘制

  #保证进度条宽度不超出范围

  if((j<616))

  then

  /usr/local/bin/progress204666$j21FCD123

  letj=j+15

  fi

  #结束进度条绘制

  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?

?

*

  do

  [!

?

f"$i"]&continue

  #进度条开始

  #

  #保证进度条宽度不超出范围

  if((j<616))

  then

  #此时调用progress程序,画比前一次宽一个单位

  #(15个像素)的进度条

  #xydxdycolor

  /usr/local/bin/progress204667$j21FCD123

  letj=j+15

  fi

  #结束进度条绘制

  case"$i"in

  *.sh)

  (

  trap?

INTQUITTSTP

  setstart

  .$i

  )

  ;

  ;

  *)

  #遍历sh文件后,启动子进程

  $istart

  ;;

  esac

  done

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1