吃盡苦頭編譯busybox

出處:http://linux2fork.blogspot.tw/2012/02/busybox1.html
http://linux2fork.blogspot.tw/2012/02/busybox2.html

小小的設定錯誤跟失誤讓人吃進苦頭orz

首先下載去下載busybox,真著把tarball解開後,進入目錄
make ARCH=arm CROSS_COMPILE=arm-linux- defconfig

這指令會載入default config,跟著自行定義需要的config

make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig

我在menuconfig內只有多選了一個選項就是,把busybox打包成static library,這樣以後就不用考被一堆library了
[插曲]

因為兩個失誤害我編譯了好幾個小時跟做了好多測試
1. 把CROSS_COMPILE打成CROSS_COMPILER,make完全沒有抱怨,只是把它當成額外的巨集定義orz,測試了好久,qemu都跟我說init不能執行,因為x86的指令不能跑在arm上面阿~囧,隔了幾個小時才注意到
2. 在建立toolchain的時候沒有編譯large file support,這個會造成錯誤,我只好從新編譯toolchain,又花了好久的時間:P
跟著下
make ARCH=arm CROSS_COMPILE=arm-linux- install
這樣開始編譯,並且編譯完畢的檔案會被放到一個名為_install的目錄底下,可以注意到,指令只有差了後面參數的defconfig=>menuconfig=>install。另外一個有意思的觀察可以進入_install,然後下ls -la,可以發現所有的指令都是link到busybox這個檔案
接下進入_install目錄來打包一下root file system,用qemu測試能不能用,免得犯了跟我一樣的錯誤

find . | cpio -o –format=newc > ../rootfs.img

然後回到上一層目錄,把上次拷貝的zImage那個kernel拷貝過來,執行

qemu-system-arm -kernel zImage -initrd rootfs.img -append “root=/dev/ram rdinit=/bin/sh”

最後參數的意思是把init用/bin/sh取代,所以開機就會去執行/bin/sh,這時候應該會看到類似下面的畫面
參考資料
http://balau82.wordpress.com/2010/03/27/busybox-for-arm-on-qemu/
瞭解了一些開機流程之後,大概知道要補足那些東西了,進入_install目錄,開始建立缺乏的目錄跟檔案
mkdir etc dev tmp proc sys
跟著在etc底下在建立init.d,新增檔案etc/init.d/rcS,內容是
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s
/bin/sh
把rcS加上可執行權限
chmod +x rcS
接著把busybox連結到_installinit,你可以看到_install底下有linuxrc,這是2.4的名稱,在2.6之後使用init
ln -s bin/busybox init
接下來進入/dev底下建立裝置,必須用root權限
mknod console c 5 1

mknod null c 1 3
還有補上etc/inittab,內容是
::sysinit:/etc/init.d/rcS
這樣就都完成了,重新打包image吧
find . | cpio -o –format=newc > ../rootfs.img
回到busybox目錄,使用qemu測試
qemu-system-arm -kernel zImage -initrd rootfs.img
後話:這裡我都沒有把image做壓縮的動作,因為測試方便,如果要放上去,壓縮一下可以節省空間,另外裡面還有個小小的錯誤,我想以後再說吧:P
未經允許不得轉載:GoMCU » 吃盡苦頭編譯busybox