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