用busybox製作根檔案系統

2021-05-31 21:42:56 字數 3320 閱讀 5600

1        獲取原始碼解壓

#tar–jvxf busybox-1.13.3.tar.bz2

進入解壓後的busybox原始碼目錄

#cdbusybox-1.13.3

2        配置busybox

步驟跟編譯linux核心時很像

#makemenuconfig

出現乙個圖形介面,選擇busybox settings,這裡可以對編譯、安裝以及除錯等模式進行配置。

然後選擇build options,對交叉編譯器以及編譯方式進行配置。

其中的第一項是build busybox as a static binary(no shared libs),如果選擇上,則busybox將以靜態形式進行編譯,否則將以動態方式編譯。此外,還需要對交叉編譯環境進行配置,選擇其中的cross compiler perfix,輸入交叉編譯器的字首,我們的嵌入式平台上使用的是arm-uclinux-linux的交叉編譯工具。

這裡我們先選擇靜態編譯,動態方式的稍後再講,注意build with large file support (for accessing files > 2gb)不要選(預設是選上的),否則編譯後會出現如下錯誤:

miscutils/lib.a(readahead.):infunction 『readahead_main』

readahead.(.text.readahead_main+0x70):undefinedreference to 『readahead』

collect2:ldreturned 1 exit status

make:***[busybox_unstripped ]error 1

3        編譯busybox

#make

4        安裝busybox

#makeinstall

可以採用perfix引數安裝到指定目錄下,格式為:make install prefix=***目錄,如果不特別指定,將預設在busybox原始碼目錄下生成乙個_install目錄。到此,busybox基本上可以功成身退了。我們需要的就是busybox編譯出來的這個_install目錄。

進入_install目錄,可以看到一共有3個目錄和乙個檔案,分別是:bin、sbin和usr目錄以及linuxrc檔案。

在對這幾個目錄進行說明之前,先簡單介紹一下編譯生成的busybox可執行檔案,它存在於bin目錄下。busybox使用了帶參的main函式:intmain(int argc,char*argv),在這個定義中,argc是傳遞進來的引數的個數(引數數量),而argv是乙個字串陣列,代表從命令列傳遞進來的引數。argv的索引0是命令列呼叫的程式名。可以在bin目錄下進行如下操作:

#busyboxpwd(注意,busybox這個可執行檔案不需要加./)

當為乙個可執行程式建立符號鏈結後,在執行這個符號鏈結時,就可以獲取到這個符號鏈結的名字。而busybox正是使用符號鏈結的方式使乙個可執行程式看起來像很多程式一樣。對於busybox中包含的每個工具來講,都會建立乙個符號鏈結,這樣就可以使用這些符號鏈結來呼叫busybox了。然後busybox接著根據argv[0]的值來呼叫內部工具。

下面分別對install目錄下的幾個檔案進行一些說明。

ø       bin包含使用者工具,其中,busybox可執行檔案就在這個目錄下,該目錄下其他所有檔案都是指向busybox的符號鏈結

ø       sbin目錄包含作業系統工具,同樣也指向busybox。

ø       linuxrc是乙個鏈結檔案,指向busybox。

5        新增etc目錄及基本配置檔案

參考乙個正常的linux系統將會發現,此時busybox建立的檔案系統還缺少很多檔案。如果用這個作為檔案系統,將是無法執行的。生成這些配置可以選擇的方法有2種,一種是直接從乙個正常執行的系統中拷貝,另一種是借助於busybox的examples。顯然,選擇第二種會容易的多,我們直接拷貝examples/bootfloopy/etc到install目錄下。

#cp–a ../examples/bootfloppy/etc/ .

然後可以看看etc目錄下的檔案,一共有3個目錄和檔案,下面逐一對以上幾個檔案進行分析和說明。

::sysint:/etc/init.d/rcs

::respawn:-/bin/sh

tty2::askfirst:-/bin/sh

::ctrlaltdel:/bin/umount–a -r

其中第一行指定系統的啟動指令碼為/etc/init.d/rcs

第二行指定開啟乙個登入會話

第三行指定在第三個虛擬終端開啟乙個無須登入驗證的shell

第四行指定了當按下ctrl+alt+del組合鍵時的執行命令

ø       fstab檔案:定義了檔案系統的各個「掛載點」,需要與實際的系統相配合。預設的fstab檔案內容為:

proc   /proc proc defaults 0 0

其他的根據需要再進行新增,比如devpts  /dev/ptsdevpts defaults 0 0就是為unixptys準備的,後面講telnetd時要用到。

ø       profile檔案:終端登陸之後首先執行的指令碼。

6        新增dev目錄及基本裝置檔案

除錯時要通過串列埠傳送訊息到終端顯示。因此串列埠控制台和終端2個裝置檔案是必不可少的。

#mkdirdev

#mknoddev/console c 5 1

#mknoddev/ttyama0 c 204 64

在啟動引數中,設定console=ttyama0

7        新增其他常用目錄

可以選擇home、root、proc、mnt、lib、var、opt、tmp。

此時,乙個基本的檔案系統的功能就已經完成了。可以採用nfs進行除錯。但是,此時你可能會遇到如下問題,系統登入後終端上會不斷列印:

cannotopen /dev/ttys2:no such file or directory.

原因出在/etc目錄下的inittab檔案,我們看一下其內容:

::sysint:/etc/init.d/rcs

::respawn:-/bin/sh

tty2::askfirst:-/bin/sh

::ctrlaltdel:/bin/umount–a -r

這條語句表示在第3個虛擬終端開啟乙個無須登入驗證的shell。而我們之前沒有建立這個tty2裝置,因此會出錯。解決的辦法有2個:一是遮蔽該語句,二是建立該裝置節點。我們選擇將其遮蔽。

busybox製作根檔案系統

以前的檔案系統都是同事做好的,今天心血來潮決決定探索一下,沒想到出了問題。makefile 405 mixed implicit and normal rules deprecated syntax makefile 1242 mixed implicit and normal rules depr...

BusyBox製作根檔案系統

make install 將編譯好的根檔案放在 install目錄中5 建立一些其他的目錄 把一些庫檔案,拿過來 mkdir dev etc mnt proc var tmp sys root cp toolchain gcc 4.6.4 arm arm1176jzfssf linux gnueab...

根檔案系統製作 Busybox 1 7 0

根檔案系統製作 busybox 1.7.0 交叉編譯器為 gcc 版本 4.6.3 ubuntu linaro 4.6.3 1ubuntu5 1.編譯busybox.修改busybox根目錄的makefile檔案 1 arch arm 2 cross compile arm linux 然後執行ma...