使用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  在啓動程序前提示用戶按回車鍵

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/sh

/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目錄爲可寫

發佈了137 篇原創文章 · 獲贊 31 · 訪問量 116萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章