新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 使用BusyBox簡化嵌入式Linux系統

        使用BusyBox簡化嵌入式Linux系統

        作者: 時間:2012-04-18 來源:網絡 收藏

        是很多標準®工具的一個單個可執行實現。包含了一些簡單的工具,例如cat和echo,還包含了一些更大、更復雜的工具,例如grep、find、mount以及telnet(不過它的選項比傳統的版本要少);有些人將稱為工具里的瑞士軍刀。本文將探索BusyBox的目標,它是如何工作的,以及為什么它對于內存有限的環境來說是如此重要。

        本文引用地址:http://www.104case.com/article/149220.htm

        POSIX環境

        盡管BusyBox的目標是提供一個相當完整的POSIX(可移植操作接口)環境,這是一個期望,而不是一種需求。這些工具雖然并不完整,但是它們提供了我們期望的主要功能。

        BusyBox源代碼樹

        BusyBox的源代碼樹組織得很好。這些工具都基于它們的用途進行了分類,并存儲在單獨的子目錄中。例如,網絡工具和守護進程(如httpd、ifconfig等)都在。/networking目錄中;標準的模塊工具(包括insmod、rmmod和lsmod)都在。/modutils目錄中;編輯器(例如vi和流編輯器,如awk和sed)都在。/editors目錄中。makefile配置、編譯和安裝所的各個文檔都在這個目錄樹的根目錄中。

        清單5。編譯默認的BusyBox配置

        $cdbusybox-1。1。1

        $makedefconfig

        $make

        $

        結果是一個相當大的BusyBox映像,不過這只是開始它的最簡單的方法。我們可以直接調用這個新映像,這會產生一個簡單的Help頁面,里面包括當前配置的命令。要對這個映像進行測試,我們也可以對一個命令調用BusyBox來執行,如清單6所示。

        清單6。展示BusyBox命令的執行和BusyBox中的ashshell

        $。/busyboxpwd

        /usr/local/src/busybox-1。1。1

        $。/busyboxash

        /usr/local/src/busybox-1。1。1$pwd

        /usr/local/src/busybox-1。1。1

        /usr/local/src/busybox-1。1。1$exit

        $

        在這個例子中,我們調用了pwd(打印工作目錄)命令,BusyBox進入了ashshell,并在ash中調用了pwd。

        手工配置

        如果您正在構建一個具有特殊需求的設備,那就可以手工使用menuconfigmake目標來配置BusyBox的內容。如果您熟悉內核的編譯過程,就會注意到menuconfig與配置Linux內核的內容所使用的目標相同。實際上,它們都采用了相同的基于ncurses的應用程序。

        使用手工配置,我們可以指定在最終的BusyBox映像中包含的命令。我們也可以對BusyBox環境進行配置,例如包括對NSA(美國國家安全代理)的安全增強Linux(SELinux),指定要使用的編譯器(用來在環境中進行交叉編譯)以及BusyBox應該靜態編譯還是動態編譯。圖1給出了menuconfig的主界面。在這里我們應該可以看到可以為BusyBox配置的不同類型的應用程序(applet)。

        圖1。使用menuconfig配置BusyBox

        多體系結構支持

        可以簡單地為BusyBox指定交叉編譯器意味著我們可以為很多體系結構編譯BusyBox。要為您的目標體系結構編譯BusyBox,我們需要一個交叉編譯器和一個已經為特定目標體系結構編譯好的C庫(uClibc或glibc)。

        要手工配置BusyBox,請使用下面的命令:

        清單7。手工配置BusyBox

        $makemenuconfig

        $make

        $

        這為我們提供了可以調用的BusyBox的二進制文件。下一個步驟是圍繞BusyBox構建一個環境,包括將標準Linux命令重定向到BusyBox二進制文件的符號鏈接。我們可以使用下面的命令簡單地完成這個過程:

        清單8。構建BusyBox環境

        $makeinstall

        $

        默認情況下,這會創建一個新的本地子目錄_install,其中包含了基本的Linux環境。在這個根目錄中,您會找到一個鏈接到BusyBox的linuxrc程序。這個linuxrc程序在構建安裝盤或急救盤(允許提前進行模塊化的引導)時非常有用。同樣是在這個根目錄中,還有一個包含操作二進制文件的/sbin子目錄。還有一個包含用戶二進制文件的/bin目錄。在構建軟盤發行版或初始RAM磁盤時,我們可以將這個_install目錄遷移到目標環境中。我們還可以使用make程序的PREFIX選項將安裝目錄重定向到其他位置。例如,下面的代碼就使用/tmp/newtarget根目錄來安裝這些符號鏈接,而不是使用。/_install目錄:

        清單9。將符號鏈接安裝到另外一個目錄中

        $makePREFIX=/tmp/newtargetinstall

        $

        使用installmake目標創建的符號鏈接都來自于busybox。links文件。這個文件是在編譯BusyBox時創建的,它包含了已經配置的命令清單。在執行install時,就會檢查busybox。links文件確定要創建的符號鏈接。

        到BusyBox的命令行鏈接也可以使用BusyBox在運行時動態創建。CONFIG_FEATURE_INSTALLER選項就可以啟用這個特性,在運行時可以這樣執行:

        清單10。在運行時創建命令鏈接

        $。/busybox--install-s

        $

        -s選項強制創建這些符號鏈接(否則就創建硬鏈接)。這個選項要求中存在/proc文件系統。

        BusyBox編譯選項

        BusyBox包括了幾個編譯選項,可以幫助為我們編譯和調試正確的BusyBox。

        表1。為BusyBox提供的幾個make選項

        make目標說明

        help顯示make選項的完整列表

        defconfig啟用默認的(通用)配置

        allnoconfig禁用所有的應用程序(空配置)

        allyesconfig啟用所有的應用程序(完整配置)

        allbareconfig啟用所有的應用程序,但是不包括子特性

        config基于文本的配置工具

        menuconfigN-curses(基于菜單的)配置工具

        all編譯BusyBox二進制文件和文檔(。/docs)

        busybox編譯BusyBox二進制文件

        clean清除源代碼樹

        distclean徹底清除源代碼樹

        sizes顯示所啟用的應用程序的文本/數據大小

        在定義配置時,我們只需要輸入make就可以真正編譯BusyBox二進制文件。例如,要為所有的應用程序編譯BusyBox,我們可以執行下面的命令:

        清單11。編譯BusyBox二進制程序

        $makeallyesconfig

        $make

        $

        壓縮BusyBox

        如果您非常關心對BusyBox映像的壓縮,就需要記住兩件事情:

        永遠不要編譯為靜態二進制文件(這會將所有需要的庫都包含到映像文件中)。相反,如果我們是編譯為一個共享映像,那么它會使用其他應用程序使用的庫(例如/lib/libc。so。X)。

        使用uClibc進行編譯,這是一個對大小進行過優化的C庫,它是為嵌入式系統開發的;而不要使用標準的glibc(GNUC庫)來編譯。

        BusyBox命令中支持的選項

        BusyBox中的命令并不支持所有可用選項,不過這些命令都包含了常用的選項。如果我們需要知道一個命令可以支持哪些選項,可以使用--help選項來調用這個命令,如清單12所示。

        清單12。使用--help選項調用命令

        $。/busyboxwc--help

        BusyBoxv1。1。1(2006。04。09-15:27+0000)multi-callbinary

        Usage:wc[OPTION]。。。[FILE]。。。

        Printline,word,andbytecountsforeachFILE,andatotallineif

        morethanoneFILEisspecified。WithnoFILE,readstandardinput。

        Options:

        -cprintthebytecounts

        -lprintthenewlinecounts

        -Lprintthelengthofthelongestline

        -wprintthewordcounts

        $

        這些特定的數據只有在啟用了CONFIG_FEATURE_VERBOSE_USAGE選項時才可以使用。如果沒有這個選項,我們就無法獲得這些詳細數據,但是這樣可以節省大約13KB的空間。

        向BusyBox中添加新命令

        向BusyBox添加一個新命令非常簡單,這是因為它具有良好定義的體系結構。第一個步驟是為新命令的源代碼選擇一個位置。我們要根據命令的類型(網絡,shell等)來選擇位置,并與其他命令保持一致。這一點非常重要,因為這個新命令最終會在menuconfig的配置菜單中出現(在下面的例子中,是MiscellaneousUtilities菜單)。

        對于這個例子來說,我將這個新命令稱為newcmd,并將它放到了。/miscutils目錄中。這個新命令的源代碼如清單13所示。

        清單13。集成到BusyBox中的新命令的源代碼

        #includebusybox。h

        intnewcmd_main(intargc,char*argv[])

        {

        inti;

        printf(newcmdcalled:n);

        for(i=0;i

        printf(arg[%d]=%sn,i,argv[i]);

        }

        return0;

        }

        接下來,我們要將這個新命令的源代碼添加到所選子目錄中的Makefile。in中。在本例中,我更新了。/miscutils/Makefile。in文件。請按照字母順序來添加新命令,以便維持與現有命令的一致性:

        清單14。將命令添加到Makefile。in中

        MISCUTILS-$(CONFIG_MT)+=mt。o

        MISCUTILS-$(CONFIG_NEWCMD)+=newcmd。o

        MISCUTILS-$(CONFIG_RUNLEVEL)+=runlevel。o

        接下來再次更新。/miscutils目錄中的配置文件,以便讓新命令在配置過程中是可見的。這個文件名為Config。in,新命令是按照字母順序添加的:

        清單15。將命令添加到Config。in中

        configCONFIG_NEWCMD

        boolnewcmd

        defaultn

        help

        newcmdisanewtestcommand。

        這個結構定義了一個新配置項(通過config關鍵字)以及一個配置選項(CONFIG_NEWCMD)。新命令可以啟用,也可以禁用,因此我們對配置的菜單屬性使用了bool(Boolean)值。這個命令默認是禁用的(n表示No),我們可以最后放上一個簡短的Help描述。在源代碼樹的。/scripts/config/Kconfig-language。txt文件中,我們可以看到配置語法的完整文法。

        接下來需要更新。/include/applets。h文件,使其包含這個新命令。將下面這行內容添加到這個文件中,記住要按照字母順序。維護這個次序非常重要,否則我們的命令就會找不到。

        清單16。將命令添加到applets。h中

        USE_NEWCMD(APPLET(newcmd,newcmd_main,_BB_DIR_USER_BIN,_BB_SUID_NEVER))

        這定義了命令名(newcmd),它在Busybox源代碼中的函數名(newcmd_main),應該在哪里會為這個新命令創建鏈接(在這種情況中,它在/usr/bin目錄中),最后這個命令是否有權設置用戶id(在本例中是no)。

        倒數第二個步驟是向。/include/usage。h文件中添加詳細的幫助信息。正如您可以從這個文件的例子中看到的一樣,使用信息可能非常詳細。在本例中,我只添加了一點信息,這樣就可以編譯這個新命令了:

        清單17。向usage。h添加幫助信息

        #definenewcmd_trivial_usageNone

        #definenewcmd_full_usageNone

        最后一個步驟是啟用新命令(通過makemenuconfig,然后在MiscellaneousUtilities菜單中啟用這個選項)然后使用make來編譯BusyBox。

        使用新的BusyBox,我們可以對這個新命令進行測試,如清單18所示。

        清單18。測試新命令

        $。/busyboxnewcmdarg1

        newcmdcalled:

        arg[0]=newcmd

        arg[1]=arg1

        $。/busyboxnewcmd--help

        BusyBoxv1。1。1(2006。04。12-13:47+0000)multi-callbinary

        Usage:newcmdNone

        None

        就是這樣!BusyBox開發人員開發了一個優秀但非常容易擴展的工具。

        結束語

        BusyBox是為構建內存有限的嵌入式系統和基于軟盤系統的一個優秀工具。BusyBox通過將很多必需的工具放入一個可執行程序,并讓它們可以共享代碼中相同的部分,從而對它們的大小進行了很大程度的縮減,BusyBox對于嵌入式系統來說是一個非常有用的工具,因此值得我們花一些時間進行探索。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 鹤壁市| 临沭县| 鲁山县| 淅川县| 红安县| 北川| 清丰县| 托里县| 南丰县| 宁蒗| 陈巴尔虎旗| 读书| 东丰县| 鞍山市| 延吉市| 博白县| 衡阳市| 宜黄县| 上犹县| 新郑市| 绩溪县| 绥滨县| 嵊泗县| 太仆寺旗| 珲春市| 龙胜| 江津市| 安达市| 拜城县| 达孜县| 漳浦县| 太原市| 莱阳市| 合作市| 宁陵县| 增城市| 都兰县| 化德县| 友谊县| 玉环县| 常宁市|