1 busybox簡介
熟悉嵌入式linux的人對busybox一定不會陌生。它被非常形象地稱為嵌入式linux系統中的「瑞士軍刀」,因為它將許多常用的unix命令和工具結合到了乙個單獨的可執行程式中。雖然與相應的gnu工具比較起來,busybox所提供的功能和引數略少,但在比較小的系統(例如啟動盤)或者嵌入式系統中,已經足夠了。
busybox在設計上就充分考慮了硬體資源受限的特殊工作環境。它採用一種很巧妙的辦法減少自己的體積:所有的命令都通過「外掛程式」的方式集中到乙個可執行檔案中,在實際應用過程中通過不同的符號鏈結來確定到底要執行哪個操作。例如最終生成的可執行檔案為busybox,當為它建立乙個符號鏈結ls的時候,就可以通過執行這個新命令實現列目錄的功能。採用單一執行檔案的方式最大限度地共享了程式**,甚至連檔案頭、記憶體中的程式控制塊等其他作業系統資源都共享了,對於資源比較緊張的系統來說,真是最合適不過了。
在busybox的編譯過程中,可以非常方便地加減它的「外掛程式」,最後的符號鏈結也可以由編譯系統自動生成。下面就來一步步地用busybox從無到有地建立乙個全新的linux檔案系統。
2 編譯busyboxbuild options --->
installation options --->
login/password management utilities --->
在build options裡面有是否使用交叉編譯的選項(do you want to build busybox with a cross compiler)。如果要對其他平台進行編譯就要選擇它並設定相應的編譯程式字首。
在installation options裡面可以設定安裝的路徑,即設定為新檔案系統的根目錄。當然也可以用預設的 _install目錄,安裝之後再複製到新檔案系統中去。
在設定login/password management utilities的時候,為了免去配置glibc的麻煩,最好設定使用busybox自己的password和shadow檔案的功能(use internal password and group functions rather than system functions)。
busybox提供的命令無疑比較全面,但它的預設配置還不能構成乙個功能比較完備的檔案系統。必須要新增的命令有login/password management utilities裡面的getty、login和passwd,這些命令從前是由另外乙個軟體包tinylogin所提供的。當然,如果不需要乙個互動的登入介面,這些命令也可以去掉。通過設定核心引數init=/bin/sh可以在系統啟圖1busybox的編譯配置介面動後直接得到乙個shell。
tlenetd命令是乙個遠端登入服務程式,把它編譯進busybox中會為將來的除錯提供很多的方便。當然也可以通過串列埠終端的方式管理嵌入式裝置,但網路登入的方式卻更為方便。
設定完畢後儲存、退出,執行make; make install命令,busybox將在未來的根檔案系統中建立/usr、/bin、/sbin等目錄。從中可以看到,編譯好的busybox可執行檔案和其他應用命令的符號鏈結。典型的busybox檔案大小在動態鏈結的情況下是300 kb左右,靜態鏈結為800 kb左右,用它實現的檔案系統完全可以控制在1 mb以下。但就目前為止,得到的還不是乙個完整可用的檔案系統,必須要在這個基礎上新增一些必要的檔案,讓它可以工作。
3 完善檔案系統
3.1 需要增加的檔案
參考乙個正常的linux系統就會發現,busybox建立的檔案系統還缺少很多檔案。下面三行命令建立了常見unix系統中包含的一些目錄,雖然它們不全是必需的,但建立它們更符合標準一些。這些命令都是在新檔案系統的根目錄中執行的,第三條命令的執行還必須要有root許可權。
mkdir mnt root var tmp proc boot etc lib
mkdir /var/
chown 0:0r *
如果busybox採用了動態鏈結的方式編譯,還需要把busybox所需要的動態庫:libcrypt.so.1、libc.so.6、ldlinux.so.2放到lib目錄中。最好按照標準的方式建立相應的檔案和鏈結,可以參考下面的列表:
-rwxrwxrwx 192519ld-2.3.2.so
lrwxrwxrwx 111ld-linux.so.2 -> ld-2.3.2.so
-rwxrwxrwx 1 1190032libc-2.3.2.so
lrwxrwxrwx 113libc.so.6 -> libc-2.3.2.so
-rwxr-xr-x 118348libcrypt-2.3.2.so
lrwxrwxrwx 117libcrypt.so.1 -> libcrypt-2.3.2.so
3.2 編寫 etc資料夾下的檔案
etc資料夾是許多系統配置檔案儲存的地方。這些檔案非常重要,如果配置錯誤,就可能影響系統的啟動。busybox源** example/bootfloopy/etc目錄中的檔案算是乙個簡單的例子,可以把其中的檔案拷貝過來作為基礎。(在 example/bootfloopy目錄中的一些指令碼和文件也很值得閱讀)
首先inittab檔案是系統啟動後所訪問的第乙個指令碼檔案,後續啟動的檔案都由它指定。這個檔案的格式和普通微機linux上的inittab是有區別的,其具體含義可以參考busybox的文件。下面是乙個比較簡單的例子:
::sysinit:/etc/init.d/rcs
tty0::respawn:/sbin/getty 38400 tty0
tty2::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount ar
::shutdown:/bin/mount / o remount,ro
其中第一行指定了系統的啟動指令碼為/etc/init.d/rcs;第二行指定在第乙個虛擬終端開啟乙個登入會話;第三行指定在第三個虛擬終端開啟乙個無須登入驗證的shell;第四行指定了當按下ctrl+alt+del組合鍵時的執行命令;最後兩行指定了關機時執行的操作。
fstab檔案定義了檔案系統的各個「掛接點」,需要與實際的系統相配合。乙個簡單的fstab檔案如下:proc/procprocdefaults00
/dev/hda1/ext2rw,noauto01
devpts/dev/ptsdevptsdefaults00
其中第三行是為unix ptys準備的,telnetd要用到。
profile 檔案是終端登入之後首先執行的指令碼,這裡可以不去管它。我們比較關心的是系統在無人登入的情況下有哪些程式要執行。從inittab檔案可以看出系統啟動之後要執行/etc/init.d/rcs指令碼,需要啟動的程式和需要進行的設定都可以寫在這裡面。乙個可能的rcs檔案如下:
#! /bin/sh
echo e 'starting system'
ifconfig lo 127.0.0.1
ifconfig eth0 192.168.0.100
hostname f /etc/hostname
/bin/mount / o remount,rw
/bin/mount /proc
/bin/mount /dev/pts
/usr/sbin/telnetd
dmesg > /var/log/dmesg
為了滿足終端登入使用者驗證的要求,etc目錄下還需要有passwd、group和shadow (在編譯busybox時如果不選擇shadow功能將不需要這個檔案)。這些檔案至少要包含 root使用者的定義,如下所示:
passwd:
root:x:0:0:root:/root:/bin/sh
group:
root:x:0:
shadow:
root::12179:0:99999:7:::
其中,如果shadow (對於不支援shadow的系統則是passwd )檔案的第乙個冒號和第二個冒號之間沒有內容,表示這個使用者登入不需要密碼。如果需要設定密碼或者增加新的登入使用者,就可以參考開發主機上的相應檔案,或者在目標系統啟動之後用passwd命令和adduser命令完成。
最後還可以給目標機起乙個名字,在/etc目錄下建立檔案hostname,將起好的名字寫到裡面。前面介紹的啟動指令碼rcs,通過hostname命令把檔案的內容設定為機器名。
4 測試新的檔案系統
檔案系統的安裝隨著應用環境的不同差別比較大。在嵌入式環境中,一般只要通過特殊的打包工具將檔案系統打包,並燒錄到非易失性儲存器中就可以了。例如,對於jffs2型別的檔案系統就可以用mkfs.jffs2命令生成檔案系統的映像。
檔案系統安裝之後重新啟動目標裝置,應該就可以使用新建立的檔案系統了。如果系統啟動失敗,則可以通過核心訊息查詢錯誤的原因。如果錯誤資訊提示不能正確掛載檔案系統,問題可能出在啟動引導裝載程式(bootloader)上。檔案系統比較容易出問題的是使用者的驗證和動態鏈結庫的載入。最簡單的檢測辦法是把busybox編譯為靜態鏈結並設定核心引數init=/bin/sh來躲開對使用者登入的驗證。
5 總結
一般構建檔案系統的方式是從原有的檔案系統進行剪裁和修補。其實使用最新的busybox製作全新的檔案系統並不複雜,甚至更加簡便,對啟動指令碼的配置也更加靈活和自由。
BusyBox 簡化嵌入式 Linux 系統
include int main int argc,char argv return 0 argv 1 arg1 argv 2 arg2 argv 1 arg1 argv 1 arg usr local src busybox 1.1.1 usage wc option file print lin...
嵌入式核心製作
一.核心簡介 1.系統架構 1 linux是由使用者空間和核心空間構成的 2 使用者空間主要是使用者應用程式以及一些c庫檔案,配置檔案。一般是看得見的。3 核心空間主要是系統呼叫介面,狹義上的核心,處理器架構相關的 4 劃分兩個空間的理由 處理器有不同的工作模式,不同的模式許可權不一樣,可以執行的指...
嵌入式Linux核心製作
一.linux核心簡介 linux系統架構分為核心空間和使用者空間。它們之間切換條件 1.系統呼叫 2.硬體中斷。核心架構 1.系統呼叫介面 2.程序管理塊 3.記憶體管理 4.體系結構相關 4.虛擬檔案系統 5.網路棧 6.裝置驅動 二.製作linux核心 1.修改配置檔案 make config...