首先,編譯busybox原始碼,在menuconfig中配置如下:Busybox Settings ---> Build Options --->中不要選擇靜態串連,要動態,Installation Options --->中選擇安裝目錄,和選擇[*] Don‘t use /usr,這樣,在make install是就不會安裝在/usr下,而是安裝在自己選擇的目錄下,我這裡選擇代碼目錄下的自己建立的rootfs目錄;接著make ;make install就OK了。
進入rootfs目錄下,建立如下目錄:
mkdir dev;
mkdir etc;
mkdir sys;
mkdir proc
進入dev目錄下,
mknod console c 5 1;
mknod null c1 3;
回到rootfs目錄,cp /usr/local/arm/4.2.2-eabi/lib ./ -rd(d參數表示如果檔案是連結的,就拷貝連結);接著
mkdir etc/init.d;
vim etc/init.d/rcS,
加入內容如下:
vim etc/fstab,加入內容如下:
這樣就建立完最小的檔案系統了,接著要打包成ramdisk,在rootfs目錄命令如下:
find . | cpio -c -o > ../initrd_cpio.img
find . | cpio -H newc -o > ../initrd_cpio.img
cd ../
gzip initrd_cpio.img -f
mkimage -A arm -O linux -T ramdisk -C none -a 0x30800000 -n “ramdisk” -d initrd_cpio.img.gz ramdisk_mmc.img
這樣ramdisk就做好了,替換我們update包中的ramdisk_mmc.img即可,還有fuse檔案和uboot需要修改,因為這裡產生的ramdisk比較大,有6M多,在update和uboot搬運ramdisk時候會檢查ramdisk的大小,如果大於4M,會報錯,所以我們要把這個4M的限制增大到8M,修改framework/external/fuse/include/normal.h中的大小:
修改external/normal.c中:
在uboot movi.h中也一樣:
check.c中:
修改完畢後編譯,替換update包中的fuse和uboot,接著還要修改uboot中的bootargs參數,在policy_interface.c中修改init=/linuxrc,還有加上新的參數rdinit=linuxrc,否則會提示找不到檔案系統,具體原因是什麼呢,看kernel中的init/main.c就知道了:
所以如果不加上rdinit,就會找init作為第一個應用程式來執行,而我們busybox的第一個執行的程式應該是linuxrc才對;這樣修改完後編譯,燒寫進去,可以進入控制到了,可是不斷地列印can‘t open /dev/tty2,can’t open /dev/tty3,can‘t open /dev/tty4,解決辦法是進入busybox的init.rc中,注釋掉如下三行即可:
以上是用ramdisk作為根檔案系統,這裡介紹不用ramdisk的情況,就是直接把busybox檔案系統放到inand分區或者sdcard分區中,比如先說用sdcard來掛載:首先在linux下劃分sdcard分區,我這裡劃分兩個分區,第一個是fat格式(mmcblk1p1),第二個是ext3格式(mmcblk1p2),我們就把busybox複製到ext3分區,然後修改uboot bootargs參數:“setenv bootargs console=ttySAC2,115200 noinitrd
root=/dev/mmcblk1p2 rw rootfstype=ext3 init=/linuxrc “,主要是root的分區和加上noinitrd,最好把bootm.c中傳遞給kernel的ramdisk參數也去掉,這樣編譯燒寫,就可以啟動進入console了,看看我成功的log資訊:
還有是把busybox檔案系統燒寫到inand中,比如我的是替換掉原來android的system分區(mmcblk0p2),也很簡單,與前面的sdcard製作的區別就是在busybox/rootfs下zip –r system_mmc.img system,把它壓縮好,替換掉update中的system_mmc.img就可以了,要注意把busybox檔案系統放到一個system的檔案夾裡面再壓縮哦,我製作的時候就是大意沒有這麼做,而且剛好在rootfs 檔案夾下有一個空的system檔案夾,結果放到update包中燒寫是,寫的是哪個空的system檔案夾裡的內容,結果mmcblk0p2分區自然就為空白,找了好久才發現;好了,接著就該uboot
bootargs參數 root= mmcblk0p2就可以了,看看我製作成功的log:
遇到的問題:過了幾天重新燒寫啟動,發現怎麼都掛載不上分區,提示log資訊如下,原因居然是要在uboot中用一下run命令。比如run prg_kernel_sd,否則kernel中找不到mmc2這個裝置,導致掛載不上的,具體原因還沒有找到,真是坑爹呀!
接著介紹cramfs檔案系統作為根檔案系統的製作和掛載,基本思想就是把cramfs的壓縮檔包燒寫到inand中某一地址,然後在kernel起來時自動掛載到/dev/ram0中,這有點像ramdisk的掛載了,先下載cramfs製作工具,在http://sourceforge.net/projects/cramfs/中可以下,下完後解壓直接make就可產生mkcramfs可執行檔,接著在busybox目錄中執行mkcramfs rootfs/ cramfs.img即可,記住是rootfs/,而不是rootfs/*哦,否則提示錯誤。我們這裡為了燒寫方便,還要和ramdisk一樣,gzip壓縮和加上uboot標頭檔資訊,最後產生的就是ramdisk-uboot.img(為了燒寫方便,名字相同而已,裡面的內容格式和ramdisk完全不一樣了),然後在uboot中運行run
prg_ramdisk_sd即可把它燒寫進去,uboot也有地方需要修改如下:setenv bootargs console=ttySAC2,115200 root=/dev/ram0 rw ramdisk=46080 rootfstype=cramfs init=/linuxrc
由於檔案有8M多,還要在kernel中增大ramdisk大小,否則掛載時候提示“image too big”,make menuconfig -> Device Drivers ---> [*] Block devices ---> Default RAM disk size (kbytes)把這裡的數值改的比ramdisk打就好,然後啟動即可進入console,看看我成功的log: