導讀
命令是linux操作系統獨特的藝術,雖然Windows操作系統也有命令,但相比之下,linux的命令更加強大且具有魅力。大多數桌面和嵌入式linux發行版都包含了很多功能完備的命令行工具,然而busybox短小精悍,可以替代這些工具,在資源有限的嵌入式linux系統中更具有優勢。
busybox的使用
站在使用的角度,busybox的使用非常簡單,如果配置和編譯過linux內核,將會發現使用思路是一樣的:
(1)獲取busybox源碼。
(2)在終端執行一個配置工具(可以使用make menuconfig編譯出宿主機上的配置圖形界面進行配置),如下圖:
在工具中可以指定交叉編譯器路徑、想要的命令、busybox的支持特性、安裝路徑等配置。
對于busybox的配置有以下幾種:1、defconfig,缺省配置,也是默認配置選項。2、allyesconfig,全選配置,也就是選中busybox的所有功能。3、allnoconfig,最小配置。在實際使用中,圖形化配置方式是一種較常使用的方法。
(3)在終端運行make命令來構建busybox源碼。
(4)將編譯出的二進制工具和一系列的符號鏈接安裝到我們的目標系統中。(還需要將相關的動態鏈接庫安裝到對應的路徑下,確保busybox下的程序能正常啟動運行)。
通過以上步驟,就可以使用busybox了。
busybox的啟動方式
在linux內核啟動后期,會嘗試執行/sbin/、/etc、/bin三個目錄中的init。在busybox下的init運行后,首先則會提示busybox找到不/etc/init.d/rcS文件(編譯構建出的busybox本身是沒有這個路徑下的rcS文件的),這是busybox搜索的默認初始化腳本文件,我們則可以創建該文件,至于文件中寫些什么內容,后文會描述到。
在busybox完成初始化后,會顯示一條提示信息,要求我們按下回車鍵,以激活一個控制臺。當busybox檢測到回車鍵被按下后,則會執行一個ash(busybox的內置shell)會話,然后我們就可以在其中輸入命令了,busybox會根據我們輸入的命令執行對應的命令操作。
一般情況下,一個基于busybox構建的根文件系統,我們能夠使用大約100多個工具,包括:核心工具、文件處理工具、網絡工具和一個shell程序,基于這些工具,我們則可以構建自己的系統應用程序了。
rcS初始化腳本
在初始化一個基于busybox的嵌入式系統時,rcS初始化腳本是首選的方式。由于不同應用場景和需求,rcS啟動腳本中的內容都會不一樣:有的會創建目錄、循環執行子目錄中腳本文件(這種方式可以劃分多個腳本文件,清晰明了,便于管理)、掛載文件系統、啟動linux服務,啟動相應的應用程序等,這里描述一個最簡單的rcS腳本文件:
?
#!/bin/sh mount?-t?proc?/proc/proc syslogd klogd ifconfig?lo?127.0.0.1 xinetd busybox?sh /bin/my_app
?
上述腳本中依次執行的操作是:
(1)掛載/proc文件系統,掛載點是/proc目錄。
(2)開啟系統的日志程序,便于捕捉系統啟動中出現的問題。
(3)開啟系統日志守護程序。
(4)配置系統的本地回環接口。
(5)啟動英特網超級服務器xinetd。
(6)啟動shell。
(7)啟動運行我們自己設計的應用程序my_app。
busybox重要文件
在busybox安裝目錄/etc下,存在幾個必須的基本文件和目錄:
(1)inittab文件
/etc/inittab文件中不同action類型有著先后順序:
SYSINIT > WAIT > ONCE > RESPAWN | ASKFIRST
在busybox源碼中,定義如下:
?
#define SYSINIT ????0x01 ?//最先開始啟動,并且執行完畢后才會進入WAIT。 #define WAIT ???????0x02 ?//在SYSINIT之后啟動,并且執行完畢后才會啟動ONCE。 #define ONCE ???????0x04 ?//在WAIT之后啟動,但是后面的并不需要等待執行完畢。 #define RESPAWN ????0x08 ?//在ONCE之后啟動,退出后會重新啟動。 #define ASKFIRST ???0x10??//類似RESPAWN,但是需要確認。 #define CTRLALTDEL ?0x20??//收到SIGINIT后執行,并且執行完畢后開始執行RESPAWN和ASKFIRST。 #define SHUTDOWN ???0x40??//在kill所有進程之后啟動SHUTDOWN。這是為RESTART或者底層halt/reboot/poweroff做準備。 #define RESTART ????0x80??//收到SIGQUIT后執行RESTART。
?
在busybox的init程序中,會讀取/etc/inittab文件,該文件中的內容由若干條指令組成,每條指令的結構都是一樣的,以“:”分隔的4個字段組成,格式如下:
id:每個指令的標識符,不能重復。但是對于 busybox 的 init 來說,
runlevels:對 busybox 來說此項完全沒用,所以空著。
action:表示動作,用于指定可能用到的動作。busybox 支持的動作如下圖所示:
process:表示具體的動作操作,比如程序、腳本或命令等。
例如下圖所示的配置選擇:
(2)fstab文件
fstab文件用于指定在linux啟動以后自動配置哪些需要自動掛載的分區,文件中內容格式如下:
file system:要掛載的特殊的設備,也可以是塊設備,比如/dev/sda 等等。
mount point:掛載點。
type:文件系統類型,例如ext2、ext3、proc、romfs、tmpfs等等。
options:掛載選項,在ubuntu中輸入man mount命令可以查看具體的選項。一般使用defaults,也就是默認選項,defaults 包含了 rw、suid、 dev、 exec、 auto、 nouser 和 async。
dump:該參數值設置為1,表示允許備份,設置為0表示不備份,在實際應用中我們一般不備份,因此該參數值設置為0。
pass:磁盤檢查設置,參數值設置為0表示不檢查。根目錄‘/’設置為 1,其他的都不能設置為1,其他的分區從2開始。一般不在fstab中掛載根目錄,因此這里一般設置為0。
例如下列的配置選擇:
(3)profile文件
該文件不是必須的,該文件是shell讀取的配置文件。profile腳本文件是傳遞給ash程序的,在ash程序中會讀取profile文件中的內容,作為環境變量的參數配置。例如下列配置選擇:
上述配置腳本中,首先設置PATH、PS1環境變量,PS1變量表示:我們在使用命令行時的命令提示符的格式,每一次按下回車后系統都會調用PS1變量,產生新的命令提示符等待輸入。然后設置了PAGER、EDITOR環境變量。接著,循環執行/etc/profile.d/目錄下的所有的shell腳本。
(4)passwd文件
passwd文件由多條記錄組成,例如如下的內容:
?
root0root:/root:/bin/sh daemon1daemon:/usr/sbin:/bin/false bin2bin:/bin:/bin/false sys3sys:/dev:/bin/false sync4sync:/bin:/bin/sync mail8mail:/var/spool/mail:/bin/false www-data33www-data:/var/www:/bin/false operator37Operator:/var:/bin/false nobody65534nobody:/home:/bin/false dbus1000DBus?messagebus?user:/var/run/dbus:/bin/false systemd-bus-proxy1001Proxy?D-Bus?messages?to/from?a?bus:/:/bin/false systemd-journal-gateway1002Journal?Gateway:/var/log/journal:/bin/false systemd-journal-remote1003Journal?Remote:/var/log/journal/remote:/bin/false systemd-journal-upload1004Journal?Upload:/:/bin/false systemd-network1005Network?Manager:/:/bin/false systemd-resolve1006Network?Name?Resolution?Manager:/:/bin/false systemd-timesync1007Network?Time?Synchronization:/:/bin/false
?
(注:不同linux系統環境,在文件中的內容可能會不一樣。)
每條記錄占一行,記錄了一個賬號的所有相關信息,單條記錄由7個字段組成,每個字段之間用“:”隔開,其格式如下:
usernameUIDconnection:home dictionary:shell
『字段含義』
username:用戶名
它唯一地標識了一個用戶帳號,用戶在登錄時使用的就是它。
password:該賬戶的口令
passwd文件中存放的密碼是經過加密處理的。Linux的加密算法很嚴密,其中的口令幾乎是不可能被破解的。
User ID用戶識別碼,簡稱UID
Linux系統內部使用UID來標識用戶,而不是用戶名。UID是一個整數,用戶的UID互不相同。0是系統管理員賬號,1-499是系統保留賬號,500+即一般賬號。
Group ID用戶組識別碼,簡稱GID
不同的用戶可以屬于同一個用戶組,享有該用戶組共有的權限。與UID類似,GID唯一地標識了一個用戶組。用usermod -g 設置。
comment 這是給用戶帳號做的注解
它一般是用戶真實姓名、電話號碼、住址等,當然也可以是空的。
home directory 主目錄
這個目錄屬于該帳號,當用戶登錄后,它就會被置于此目錄中,就像回到家一樣。一般來說,root帳號的主目錄是/root,其他帳號的家目錄都在/home目錄下,并且和用戶名同名。用usermod -d設置。
login command 用戶登錄后執行的命令
一般來說,這個命令將啟動一個shell程序。例如,用bbs帳號登錄后,會直接進入bbs系統,這是因為bbs帳號的login command指向的是bbs程序,等系統登錄到bbs時就自動運行這些命令。
總結
本文是小生分析busybox源碼的最后一篇,描述了經busybox構建完成后的最小根文件系統中需要添加哪些文件以及文件的解析過程。
從使用者的角度來看,能夠編譯構建busybox,能夠填充最小的根文件系統滿足實際的應用需求,就已經差不多了。
從設計的角度來看,busybox的源碼和linux內核、u-boot源碼一樣,具有出色的設計思維和優秀的構建思想在里面,小生的文章僅僅是冰山一角啦!
評論
查看更多