1. gzyueqian
      18078865874
      首頁 > 新聞中心 > > 正文

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

      更新時間: 2007-07-30 13:13:07來源: 粵嵌教育瀏覽量:1252

        摘 要:在基于linux的嵌入式仿真平臺開發(fā)中,利用開源工具bootsplash可以定制啟動logo、設(shè)定控制臺背景和顯隱啟動時的字符信息,甚至可以支持開機進度條的動畫顯示。本文介紹利用bootsplash打造啟動畫面的解決方案,涉及內(nèi)核補丁、用戶空間設(shè)置等方面的具體工作。

        關(guān)鍵字:嵌入式; 啟動;仿真環(huán)境
         
        在基于linux的嵌入式仿真平臺開發(fā)中,終端的美觀和可定制是一個重要的問題。開機時滾動在屏幕上的字符串和單調(diào)的penguin圖標(biāo),使嵌入式設(shè)備仍然脫離不了pc的痕跡,linux控制臺上單調(diào)的“白紙黑字”型表現(xiàn)方式可謂大煞風(fēng)景。改造linux控制臺使之美觀可定制地展示開機信息和logo成為基于嵌入式linux應(yīng)用的一項重要工作。
         
        開源項目bootsplash(http://www.bootsplash.org/)為解決這個問題提供了一個完美的解決方案。Boot-
      splash通過對內(nèi)核打補丁來改變linux framebuffer控制臺對圖形顯示的支持。通過用戶空間程序來定制啟動logo、設(shè)定控制臺背景和顯隱啟動時的字符信息,甚至可以支持開機畫面的動畫顯示。本文介紹利用splashboot打造啟動畫面的解決方案,涉及內(nèi)核補丁、用戶空間設(shè)置等方面的具體工作。

        1 內(nèi)核補丁和控制工具

        1.1 支持bootsplash的內(nèi)核補丁
        
        針對不同的內(nèi)核版本,bootsplash站點上給出了相應(yīng)的內(nèi)核補丁。我們所使用的內(nèi)核版本為2.4.23,下載并給內(nèi)核打上補丁:

        cd /usr/src/linux
        make mrproper
        patch -Np1 -i ../bootsplash-3.0.7-2.4.23.diff
        重新編譯內(nèi)核:
        make menuconfig
        選上如下的幾個參數(shù):
        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
        然后編譯內(nèi)核:
        make dep && make bzImage
        再把生成的內(nèi)核拷貝到/boot下:
        cp arch/i386/boot/bzImage /boot/linux-bootsplash
        這樣我們得到的新內(nèi)核bzImage就是支持bootsplash的內(nèi)核了,剩下的工作就是對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檢查分辨率。后面提到的腳本,只是以不同參數(shù)來讀取配置文件,調(diào)用上面的這幾個程序。

        2 開機LOGO的定制

        2.1 設(shè)置splash屏幕的主題
         
        前面安裝好的splash用戶空間程序中有一個程序splash,它需要一個配置文件來指明使用哪個圖片、要不要隱藏文本信息的輸出等。可以看出“theme”就是splash工具需要的配置文件、圖片和其他所需要的文件的集合。有很多已經(jīng)準(zhǔn)備好的theme可供挑選,我們也可以定制theme。為了方便起見,我們下載theme-Linux.tar.bz2并以它為theme。
         
        建立目錄/etc/bootsplash/themes,解壓Theme- Linux.tar.bz2到這個目錄下,現(xiàn)在的目錄結(jié)構(gòu)應(yīng)該是:
      /etc/bootsplash/themes/Linux
         
        讀者朋友可以看看該目錄下的bootsplash-1024x768.cfg來觀察配置文件的格式。這個簡單的文件包含的選項不多,事實上它只是清楚地表明應(yīng)該顯示哪幅圖片、控制臺顯示文本的顏色和背景色以及文本信息輸出的位置區(qū)域。另外,不要忘了它還可以分別指定verbose和silent模式下顯示文件的位置。Silent模式禁止顯示啟動信息,代之以一個可選的進度條(這需要關(guān)于A外包腳本的更多設(shè)置)。基于這個配置文件,你可以自己修改以顯示自己喜歡的圖片和采用自己喜歡的模式。

        2.2 利用splash小工具安裝splash主題到initrd
         
        在系統(tǒng)啟動的早期階段,內(nèi)核還不能讀寫硬盤。這個階段要顯示圖片,那么圖片放在什么地方那?答案是把圖片寫到ramdisk里,這樣在啟動的時候才能讀到,因為這時候還沒有加載分區(qū)呢。當(dāng)然不用擔(dān)心initrd的制作,splash小工具能輕松搞定。Splash小工具能根據(jù)基于你選擇的配置文件(theme)來自動產(chǎn)生一個initrd。所要做的就是執(zhí)行如下命令:
         
        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的設(shè)定要根據(jù)我們所使用的theme的分辨率和顏色深度來選擇。
        splash=silent: 在silent模式下顯示boot splash. 如果你希望用vebose模式,只需刪除此行即可。Verbose模式是缺省模式。
        initrd=/boot/initrd.splash: 這行將initrd.splash調(diào)入啟動ram盤(圖片存于其中)。
        更新LILO或GRUB后,就可以看到精美的啟動畫面。

        3 啟動進度條的顯示

        首先我們要弄清楚小工具程序progress(它是和splash程序一起拷到/sbin目錄下的)。progress能夠在framebuffer 設(shè)備(默認(rèn)情況下是/dev/fb0)上畫四邊形。不帶任何參數(shù)運行progress,我們可以看到該程序的可選參數(shù)列表,我們感興趣的幾個參數(shù)是:

        x: 四邊形起始點的x坐標(biāo)
        y: 四邊形起始點的y坐標(biāo)
        dx: 四邊形的寬度
        dy: 四邊形的高度
        color: 四邊形的顏色。這是一個16進制數(shù),于web頁上表示顏色的一致。
        舉例說明之:
        progress 0 0 512 384 FFFFFF
        將會在屏幕左上角畫一個白色的四邊形,這個四邊形占據(jù)四分之一屏幕。
        progress 256 192 521 384 FCD192
        將會在屏幕正中間位置畫一個黃色的四邊形。
        看這些例子的效果應(yīng)該在tty終端上運行,不要在Konsole 或xterm window上看效果。
        搞清楚progress的用法后,我們來看怎么把它與系統(tǒng)啟動聯(lián)系起來。通過分析Debian的啟動代碼,我們可以看出:它的啟動腳本在每次啟動完一個服務(wù)程序(xfs, cron, samba 或其他服務(wù)程序)后使用progress程序來在指定位置畫指定大小的四邊形。在Debian中啟動腳本有兩個:先執(zhí)行/etc/init.d/rcS然后執(zhí)行 /etc/init.d/rc。下面研究一下/etc/init.d/rcS代碼,注意這個腳本一次調(diào)用各個rulevel下的腳本。我們在其中加入畫四邊形的代碼,加入的代碼用加黑表示:

        # 初始化變量j
        # j 為進度條的寬度
        j=20
        for i in /etc/rcS.d/S??*
        do
        [ ! −f "$i" ] &continue
        # 進度條開始
        #
        # 保證進度條寬度不超出范圍
        if ((j <616))
        then
        # 此時調(diào)用progress程序,畫比前一次寬一個單位
         #(15個像素)的進度條
        # x y dx dy color
        /usr/local/bin/progress 204 667 $j 21 FCD123
        let j=j+15
        fi
        # 結(jié)束進度條繪制
        case "$i" in
        *.sh)

        (
        trap − INT QUIT TSTP
        set start
        . $i
        )
        ;

        ;
        *)
        #遍歷sh 文件后, 啟動子進程
        $i start
         ;;
        esac
        done

        上面的代碼畫出了四邊形的部分,我們需要接著畫與/etc/init.d/rc相關(guān)的第二部分。為了平滑地接著部分畫,我們需要知道部分四邊形畫到什么位置結(jié)束的。
         
        #
        danger_var=395
        j=danger_var
        for i in /etc/rc$runlevel.d/S*
        do
        [ ! −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−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
        #
        # If there is a start script in the previous level
        # and _no_ stop script in this level, we don"t
        # have to re−start the service.
        #
        [ −f $previous_start ] &[ ! −f $stop ] &continue
        fi
        #繼續(xù)進度條繪制
        #保證進度條寬度不超出范圍
        if ((j <616))
        then
        /usr/local/bin/progress 204 666 $j 21 FCD123
        let j=j+15
        fi
        #結(jié)束進度條繪制
        case "$runlevel" in
        0|6)
        startup $i stop
        ;;
        *)
        startup $i start
        ;;
        esac
        done

        這段代碼以同樣的方式接著畫四邊形進度條。但是danger_var是什么呢?前面說過為了平滑地接著部分畫,我們需要知道部分四邊形畫到什么位置結(jié)束的。這個位置就用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=結(jié)束時的j值”,把修改后的文件另存為/tmp/boots,然后重命名為/etc/init.d/rc并改變執(zhí)行權(quán)限。
         
        如果選用danger_var作為變量名來傳遞位置值,那么注意在其他啟動腳本中不能出現(xiàn)名字沖突。
         
        現(xiàn)在,重啟計算機,可以享受美麗的開機進度條了。

        4 結(jié)論
        
        通過開源項目bootsplash提供的內(nèi)核補丁和各種用戶空間工具,可以實現(xiàn)對FrameBuffer下的控制臺美化和定制。這對于嵌入式仿真環(huán)境平臺的開發(fā)有著重要的意義,使得嵌入式仿真環(huán)境平臺從一定程度上減少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/

      免費預(yù)約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 在线播放十八禁视频无遮挡 | 最新精品视频精久久综合 | 日本精品高清一二区一本到 | 五月天婷婷综合社区 | 综合久久九色91色综合网 | 亚洲精品精品国产一线久久 |