嵌入式Linux中BusyBox的使用

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目錄是這裏


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章