基於Bootsplash嵌入式Linux啟動畫面定製

來源:互聯網
上載者:User

在基於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下的指令碼。我們在其中加入畫四邊形的代碼,加入的代碼用加黑表示:

<CCID_NOBR>

<CCID_CODE>  # 初始設定變數j   # j 為進度條的寬度  j=20  for i in /etc/rcS.d/S??*  do  [ ! &#8722;f "$i" ] &continue  # 進度條開始  #  # 保證進度條寬度不超出範圍  if ((j <616))  then  # 此時調用progress程式,畫比前一次寬一個單位   #(15個像素)的進度條  # x y dx dy color  /usr/local/bin/progress 204 667 $j 21 FCD123  let j=j+15  fi  # 結束進度條繪製  case "$i" in  *.sh)  (  trap &#8722; INT QUIT TSTP  set start  . $i  )  ;  ;  *)  #遍曆sh 檔案後, 啟動子進程  $i start   ;;  esac  done

上面的代碼畫出了四邊形的第一部分,我們需要接著畫與/etc/init.d/rc相關的第二部分。為了平滑地接著第一部分畫,我們需要知道第一部分四邊形畫到什麼位置結束的。

<CCID_NOBR>

<CCID_CODE>#  danger_var=395  j=danger_var  for i in /etc/rc$runlevel.d/S*  do  [ ! &#8722;f $i ] &continue  if [ $previous != N ] &[ $previous != S ]  then  #  # Find start script in previous runlevel and  # stop script in this runlevel.  #  suffix=${i#/etc/rc$runlevel.d/S[0&#8722;9][0&#8722;9]}  stop=/etc/rc$runlevel.d/K[0&#8722;9][0&#8722;9]$suffix  previous_start=/etc/rc$previous.d/S[0&#8722;9][0&#8722;9]$suffix  #  # If there is a start script in the previous level  # and _no_ stop script in this level, we don"t  # have to re&#8722;start the service.  #  [ &#8722;f $previous_start ] &[ ! &#8722;f $stop ] &continue  fi  #繼續進度條繪製  #保證進度條寬度不超出範圍  if ((j <616))  then  /usr/local/bin/progress 204 666 $j 21 FCD123  let j=j+15  fi  #結束進度條繪製  case "$runlevel" in  0|6)  startup $i stop  ;;  *)  startup $i start  ;;  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
  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/
 

原文連結: http://linux.ccidnet.com/art/302/20070807/1170067_1.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.