BusyBox是很多標準 Linux 工具的一個單個可執行實現,主要應用於嵌入式linux系統,是一個開源的“萬能工具”。接下來我們一起來看看這個工具的魅力。
萬能的BusyBox
BusyBox最爲一個可執行文件,卻集成了「cp」「init」「ping」等基本的shell命令。
基於嵌入式linux的系統上,比如數字電視,MP3,音響,小型服務器,路由器等等機器上都會搭載 BusyBox。可以說嵌入式linux世
界中,BusyBox是一個最基本的工具模塊。
爲什麼在嵌入式系統中使用 BusyBox
在嵌入式linux領域,BusyBox被廣泛使用,其理由可以總結爲以下兩點:
- 減小文件尺寸
在嵌入式系統中,做爲文件系統保存的輔助記憶裝置,考慮到信賴性和成本問題,Flash ROM被經常使用(數Mbytes~數十Mbytes)。這一來就限制了輔助記憶裝置的容量大小。 作爲嵌入式的工程師,你是否也是是追求最小尺寸的系統,和最優化的性能組呢?通常,linux系統中導入了很多的命令。 這些命令中也許有許多你不需要的,或者命令中不需要的參數,又或者雖是不同命令卻擁有相同的處理函數,對於嵌入式系統 來說,這些都是沒用的資源浪費。另外在這之上,每個命令若要執行,系統還需要一個管理信息(2~4kbytes),隨着命令的 增多,這個尺寸也是非常可觀的。 正是由於這些原因,BusyBox將沒用的功能徹底的去處,管理信息也做到只有一個,這樣最大限度的節省了文件的尺寸。
- 減輕編譯工作量
如果是爲PC安裝程序,只要將二進制文件安裝在Linux分區上面即可。但是,在嵌入式系統上,由於硬件,和其用途多種多 樣,是不會有那樣的二進文件的。所以,爲了使用不同的應用程序,必須從不同的源代碼來編譯。並且,根據不同應用程序的 需要,編譯的方法也可能不同,使編譯工作變得更加繁瑣。 另一方面,BusyBox自己就集成了各種應用程序的功能,所以說只要編譯了BusyBox,就解決了很多的編譯問題。
BusyBox的構造
BusyBox的構造如下圖所示:
圖1 BusyBox的構成
Applet是一個命令的集合。比如,“init Applet”提供了init的功能。“ping Applet”提供了ping的功能。另外,libbb是
各個Applet間公用的函數集合。各個Applet儘量使用libbb中定義的函數,使BusyBox的尺寸達到最小。另外,各個Applet的程
序基本上不使用原有相同命令的源代碼,而是爲了減小文件尺寸重新編寫過的。
除此之外,BusyBox除了利用libbb來消減文件尺寸外,還有其他的優化措施。比如,將不常用的命令參數省略,錯誤代碼也減
小到1個字節。甚至還有省掉釋放內存的free函數等等。
BusyBox的功能
- BusyBox就是一柄鋒利的瑞士軍刀
- BusyBox集成了各種linux的標準命令,毫不誇張的說,BusyBox可以簡單地作爲一個linux的發佈環境(distribution)。
比如,shell,editor(vi,sed,awk等), 系統管理(coreutils、tar、bzip等),網絡應用(ping、ifconfig、wget等),用
戶管理(login、su、useraddな等),各種服務(crond、syslogd、httpd等),SELinux管理(load_policy、restorecon等)。 - 不用考慮BusyBox而執行各種命令
- 以下是BusyBox在系統目錄下的構造:
1 2 3 4 |
# ls -l /bin (...) /bin/cat -> /bin/busybox /bin/ls -> /bin/busybox |
從其構造可以看出,/bin/cat或者/bin/ls都是指向/bin/busybox的符號鏈接。/bin/busybox是BusyBox的實體。作爲參
數,/bin/busybox的argv[0]被設置爲各個命令的名字。
比如,當執行/bin/cat的時候,實際執行的是/bin/busybox。這裏busybox的argv[0]爲/bin/cat。/bin/busybox內部,利用
argv[0]將cat Applet啓動,執行cat命令。
安裝BusyBox
將下載的BusyBox源代碼解壓,編譯:
1 2 |
$ tar jxvf busybox-1.9.0.tar.bz2 $ cd busybox-1.9.0 |
編譯之前,可以設置包含applet的項目。
1 |
$ make menuconfig |
這個畫面和編譯Linux內核是的畫面是一樣的。通過它,我們可以指定包含的項目。
比如,選擇「Coreutils」之後,進入下面的畫面。
從圖中可以看到cat和cp等命令已經被選擇。你可以通過[Y]鍵來選擇,[N]鍵來解除選擇。全部選好後選擇[Exit]退出,點擊下圖的[Yes]保存。
接下來執行 make ; make install 來編譯和安裝BusyBox。
缺省情況下BusyBox被安裝在當前目錄下的「_install」目錄。
1 2 3 4 5 6 7 8 9 10 11 |
$ ls -l _install/bin lrwxrwxrwx 1 ynakam ynakam 7 Jan 7 22:36 addgroup -> busybox lrwxrwxrwx 1 ynakam ynakam 7 Jan 7 22:36 adduser -> busybox lrwxrwxrwx 1 ynakam ynakam 7 Jan 7 22:36 ash -> busybox -rwxr-xr-x 1 ynakam ynakam 626080 Jan 7 22:36 busybox lrwxrwxrwx 1 ynakam ynakam 7 Jan 7 22:36 cat -> busybox rwxrwxrwx 1 ynakam ynakam 7 Jan 7 22:36 chgrp -> busybox lrwxrwxrwx 1 ynakam ynakam 7 Jan 7 22:36 chmod -> busybox lrwxrwxrwx 1 ynakam ynakam 7 Jan 7 22:36 chown -> busybox lrwxrwxrwx 1 ynakam ynakam 7 Jan 7 22:36 cp -> busybox (...) |
在實際的嵌入式系統上,必須使用和系統CPU相吻合的編譯器編譯。比如arm上編譯的時候,我們就像以下在host上指定跨平臺編譯器。
1 |
$ make CROSS_COMPILE=arm-linux-
|
之後安裝還是 make install ,同樣在_install目錄下生產編譯好的結果,你只要拷貝到目標機就行了。
其他
BusyBox是以GPL發佈的。所以,如果修改了BusyBox後移植到嵌入式系統機器,並販賣的情況下,必須公開你的BusyBox源碼。
正在開發中BusyBox的subversion目錄是這裏。