使用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目錄為可寫