天天看點

基于bootsplash的嵌入式linux啟動畫面定制

來源: ChinaUnix部落格  作者: ChinaUnix部落格   釋出時間:2007-01-01 16:29:00

摘 要:在基于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/

繼續閱讀