天天看點

使用Busybox-1.2.0制作根檔案系統

使用Busybox-1.2.0制作根檔案系統

cross-3.3.2

make-3.8.1

STEP 1:

建立根檔案系統目錄,主要包括以下目錄/bin,/etc,/dev,/mnt,/sbin,/usr,/sbin,/tmp

/proc,/lib. /usr下有bin, sbin, lib, local, etc   /mnt下有etc

建立多級目錄可以使用mkdir –p usr/bin/ …….

STEP 2:

更新make到3.81版本,用RH9自己帶的make 3.79會出錯

進入make-3.81目錄,執行:# ./configure    # make   #make install

會把make安裝到/usr/local/bin目錄下,要使新make立即生效,要設定環境變量

PATH=/usr/local/bin:$PATH。設定完成後,就可以編譯Busybox了。

STEP 3:

進入busybox-1.2.0目錄,執行# make defconfig

執行# make menuconfig

Busybox Setting -----> Build Options ----->

選擇上 Build BusyBox as a static binary (no shared libs)

       Do you want to build BusyBox with a Cross Compiler?

指定交叉編譯器為

(/usr/local/arm/3.3.2/bin/arm-linux-)Cross Compiler prefix

Installation Options ----->

選擇上 Don’t use /usr

設定Busybox installation prefix為 ../rootfs即安裝目錄.

在Shells中,選擇Choose your default shell為ash.

儲存退出

STEP 4:

# make    # make install

安裝完後,就會把busybox拷到自己指定的rootfs 路徑下,同時會生成一個linuxrc檔案,這個是busybox自帶的啟動檔案,也可以自己編寫啟動檔案

Linux核心使用的是2.4.18

用3.3.2交叉編譯器和1.2.0版本的busybox編譯通過

我開始用1.9.2版本的,用2.95.3,3.4.1,3.3.2編譯均不通過

STEP 5:   這個是用來啟動linux時輸入使用者和密碼的

編譯tinylogin-1.4。進入tinylogin-1.4目錄,修改Makefile檔案如下:

DOSTATIC = true

USE_SYSTEM_PWD_GRP = false

USE_SYSTEM_SHADOW = false

CROSS = /usr/local/arm/3.3.2/bin/arm-linux-

STEP 6:

執行# make PREFIX=../rootfs install      安裝到指定路徑

STEP 7:

進入根檔案系統rootfs的etc目錄,執行如下操作:

拷貝Busybox-1.2.0/examples/bootfloopy/etc/* 到目前目錄下。

# cp –r ../../busybox-1.2.0/examples/bootfloopy/etc/* ./

拷貝/etc/passwd, /etc/group, /etc/shadow到目前目錄下。

# cp /etc/passwd ./

# cp /etc/group ./

# cp /etc/shadow ./

修改inittab,把第二項改為::respawn:-/bin/login

修改profile,加入PATH環境變量:export PATH=/bin:/sbin:/usr/bin:/usr/sbin

設定連結庫:export LD_LIBRARY_PATH=/lib:/usr/lib

對以下三個檔案修改,隻儲存與root相關的項,根據具體情況内容會有所不同。

修改passwd為root:x:0:0:root:/root:/bin/sh,即隻儲存與root相關項,而且最後改成/bin/sh。

修改group為root:x:0:root

修改shadow為root:$1$x9yv1WlB$abJ2v9jOlOc9xW/y0QwPs.:14034:0:99999:7:::

STEP 8:

制作cramfs鏡像,下載下傳到實驗箱上就可以引導起來了。

# mkcramfs rootfs rootfs.cramfs

這個是一個基本的移植過程,下面看一下busybox的啟動過程

先進入vivi, 執行param show 會在最後一行看到:

Linux command line: noinitrd root=/dev/mtdblock/1 init=/linuxrc console=ttyS0

這個是vivi傳給linux的指令行參數,root=表示root根檔案系統挂在哪個裝置下,這裡是mtd分區的,如果是bon分區的,就會是root=/dev/bon/2  init=/linuxrc這個最重要,表示初始化啟動腳本為根目錄下的linuxrc,console=ttyS0 初始化控制台為序列槽

BusyBox的intit指令提供了類似傳統init程式的系統啟動和初始化功能,init程式(如/sbin/init)隻是一個指向busybox程式(/bin/busybox)的符号連結,也就是說,busybox是系統第一個執行的應用程式。Busybox由檔案名識别出要執行的指令是init, 然後跳轉到init例程去運作

Busybox init 依次執行如下任務:

設定init的信号處理函數

初始化控制台

分析/etc/inittab配置檔案

執行系統初始化腳本,如/etc/init.d/rcS

完成初始化控制台後,busybox檢查/etc/inittab檔案是否存在,如果不存在,将使用一個預設的inittab,我可可以自己寫一個inittab檔案,格式如下:

id:runlevel:action:process

id指定要啟動的程序   runlevel是運作級别,busybox不支援運作級别,是以為空

action是要執行的動作,process指定要運作的程式和啟動的指令行參數

Action:

sysinit   指定初始化腳本路徑

respawn  當某程序結束時重新開機該程式

askfirst  在啟動程式前提示使用者按Enter鍵

wait  等待所啟動的程序結束

once  隻運作程序一次,不等待程序結束

crtlaltdel 按組合鍵時執行的程序

shotdown 系統關閉時運作的程序

restart 重新開機時運作的程序,通常是init本身

自己寫的inittab

::sysinit:/etc/init.d/rcs

::respawn:-/bin/sh

tty2:askfirst:-/bin/sh

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

第一句指定執行初始化腳本為 /etc/init.d/rcS

第二句就是當程序退出,如執行exit後,又重新出現指令提示符

      如果要用帳号密碼登陸,則改成-/bin/login

第三句是在啟動linux後,提示要按回車才能進入

第四句是在按組合鍵後,執行umount,把所有檔案系統umount

再看/etc/init.d/rcS

#!/bin/sh          //指定shell

/bin/mount –a        //mount –a 為挂載全部檔案系統,詳見/etc/fstab

exec /usr/etc/.rc.local   //執行rc.local

rcS隻完成挂載全部檔案系統,然後執行rc.local,進入/usr/etc,看rc.local

#!/bin/sh

ifconfig eth0 192.168.220.10   //設定闆子IP

echo “Set IP = 192.168.220.10”

mount –t nfs –o nolock ……………..  //挂載NFS

echo “mount nfs ok”

也可以寫一些其他的挂載指令

到這裡就完成了啟動過程,有時也可以在/etc下寫一個profile,這個是由shell執行的,啟動後,按完回車才執行,這裡也可以寫一些初化腳本,如初始化環境變量

總結:linuxrc -> /sbin/init -> /etc/inittab -> /etc/init.d/rcS -> /usr/etc/rc.local   /etc/profile

也可以編寫自己的linuxrc

/bin/mount –n –t ramfs ramfs /etc

/bin/cp –a /mnt/etc/* /etc

/bin/mount –f –ramfs ramfs /tmp

exec /sbin/init

主要就是最後一句,執行init

把/etc中的檔案放到/mnt/etc/下,挂載/etc/為ramfs,然後把/mnt/etc/下的所有檔案拷到/etc下,這時/etc下就為可寫的了,這樣可以友善修改腳本

最好也将/tmp挂為ramfs,因為執行QT程式時,需要tmp目錄為可寫

繼續閱讀