BusyBox 是很多標(biāo)準(zhǔn) Linux® 工具的一個單個可執(zhí)行實現(xiàn)。BusyBox 包含了一些簡單的工具,例如 cat 和 echo,還包含了一些更大、更復(fù)雜的工具,例如 grep、find、mount 以及 telnet(不過它的選項比傳統(tǒng)的版本要少);有些人將 BusyBox 稱為 Linux 工具里的瑞士軍刀。本文將探索 BusyBox 的目標(biāo),它是怎么樣工作的,以及為什么它對于內(nèi)存有限的環(huán)境來說是如此重要。 BusyBox 的誕生 BusyBox 最初是由 Bruce Perens 在 1996 年為 Debian GNU/Linux 安裝盤編寫的。其目標(biāo)是在一張軟盤上創(chuàng)建一個可引導(dǎo)的 GNU/Linux 系統(tǒng),這可以用作安裝盤和急救盤。一張軟盤可以保存大約 1.4-1.7MB 的內(nèi)容,因此這里沒有多少空間留給 Linux 內(nèi)核以及相關(guān)的用戶應(yīng)用程序使用。 | | BusyBox 許可證 BusyBox 是按照 GNU General Public License(GPL)許可證發(fā)行的。這意味著如果我們在一個項目中使用 BusyBox,就必須遵守這個許可證。我們可以在 BusyBox Web 站點(請參看本文后面 參考資料 一節(jié)的內(nèi)容)上看到這個許可證的內(nèi)容。BusyBox 團(tuán)隊似乎正忙于監(jiān)視違反這個許可證的情況。實際上,他們維護(hù)了一個 “Hall of Shame” 頁面來說明違反者的情況。 | |
BusyBox 揭露了這樣一個事實:很多標(biāo)準(zhǔn) Linux 工具都可以共享很多共同的元素。例如,很多基于文件的工具(比如 grep
和 find
)都需要在目錄中搜索文件的代碼。當(dāng)這些工具被合并到一個可執(zhí)行程序中時,它們就可以共享這些相同的元素,這樣可以產(chǎn)生更小的可執(zhí)行程序。實際上, BusyBox 可以將大約 3.5MB 的工具包裝成大約 200KB 大小。這就為可引導(dǎo)的磁盤和使用 Linux 的嵌入式設(shè)備提供了更多功能。我們可以對 2.4 和 2.6 版本的 Linux 內(nèi)核使用 BusyBox。
BusyBox 是怎么樣工作的?
為了讓一個可執(zhí)行程序看起來就像是很多可執(zhí)行程序一樣,BusyBox 為傳遞給 C 的 main 函數(shù)的參數(shù)開發(fā)了一個很少使用的特性。回想一下 C 語言的 main 函數(shù)的定義如下:
| |
POSIX 環(huán)境 盡管 BusyBox 的目標(biāo) 是提供一個相當(dāng)完整的 POSIX(可移植操作系統(tǒng)接口)環(huán)境,這是一個期望,而不是一種需求。這些工具雖然并不完整,但是它們提供了我們期望的主要功能。 |
清單 1. C 的 main 函數(shù)
int main( int argc, char *argv[] ) |
在這個定義中,argc
是傳遞進(jìn)來的參數(shù)的個數(shù)(參數(shù)數(shù)量),而 argv
是一個字符串?dāng)?shù)組,代表從命令行傳遞進(jìn)來的參數(shù)(參數(shù)向量)。argv
的索引 0 是從命令行調(diào)用的程序名。
清單 2 給出的這個簡單 C 程序展示了 BusyBox 的調(diào)用。它只簡單地打印 argv
向量的內(nèi)容。
清單 2. BusyBox 使用 argv[0] 來確定調(diào)用哪個應(yīng)用程序
// test.c#include <stdio.h>int main( int argc, char *argv[] ){ int i; for (i = 0 ; i < argc ; i++) { printf("argv[%d] = %s\n", i, argv[i]); } return 0;} |
調(diào)用這個程序會顯示所調(diào)用的第一個參數(shù)是該程序的名字。我們可以對這個可執(zhí)行程序重新進(jìn)行命名,此時再調(diào)用就會得到該程序的新名字。另外,我們可以創(chuàng)建一個到可執(zhí)行程序的符號鏈接,在執(zhí)行這個符號鏈接時,就可以看到這個符號鏈接的名字。
清單 3. 在使用新命令更新 BusyBox 之后的命令測試
$ gcc -Wall -o test test.c$ ./test arg1 arg2argv[0] = ./testargv[1] = arg1argv[2] = arg2$ mv test newtest$ ./newtest arg1argv[0] = ./newtestargv[1] = arg1$ ln -s newtest linktest$ ./linktest argargv[0] = ./linktestargv[1] = arg |
BusyBox 使用了符號鏈接以便使一個可執(zhí)行程序看起來像很多程序一樣。對于 BusyBox 中包含的每個工具來說,都會這樣創(chuàng)建一個符號鏈接,這樣就可以使用這些符號鏈接來調(diào)用 BusyBox 了。BusyBox 然后可以通過 argv[0]
來調(diào)用內(nèi)部工具。
配置并編譯 BusyBox
我們可以從 BusyBox 的 Web 站點上下載最新版本的 BusyBox(請參看 參考資料
如果您對本文有任何疑問或者建議,請到討論區(qū)發(fā)表您的意見: >> 論壇入口 <<