交叉編譯器: 3.3.2
# wget -c http://www.busybox.net/downloads/busybox-1.7.0.tar.bz2
# tar jxvf busybox-1.7.0.tar.bz2
修改源碼、配置、編譯-----------------------------------------------
# cd busybox-1.7.0
# vi Makefile +176
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/3.3.2/bin/arm-linux-
# make menuconfig
Busybox Settings --->
Build Options --->
-
Build BusyBox as a static binary (no shared libs) //(1)
Installation Options --->
-
Don't use /usr //(2)
Linux System Utilities --->
- mdev //(3)
- Support /etc/mdev.conf
-
Support command execution at device addition/removal
Shells --->
Choose your default shell (
msh) ---> //(4)
(1) 這個選項是一定要選擇的,這樣才能把busybox編譯成靜态連結的可執行檔案,運作時才獨立于其他函數庫.否則必需要其他庫檔案才能運作,在單一個linux核心不能使他正常工作。
(2) 這個選項也一定要選,否則make install後,busybox将安裝在原系統的/usr下,這将覆寫掉系統原有的指令.選擇這個選項後,make install後會在busybox目錄下生成一個叫_install的目錄,裡面有busybox和指向他的連結.
(3) 如果沒有啟動
udev,造成/dev下沒有裝置檔案。也就是說所有的裝置都沒有挂接進來。最新的busybox已經包含了udev的簡化版本即mdev,且使用非常簡單。 要使用mdev還需要在rootfs中做适當配置。
vi rootfs/etc/init.d/rcS
---------------------------
mount -t tmpfs mdev /dev
mkdir /dev/pts
mount -t devpts devpts /dev/pts
mount -t sysfs sysfs /sys
mount -a
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
配置linux kernel
-----------------------------------------------
mdev需要改寫/dev和/sys兩個目錄。是以必須保證這兩個目錄是可寫的(一般會用到sysfs,tmpfs。是以要重新編譯核心)。然後在你的啟動腳本檔案中加入/sbin/mdev -s
linux-2.6.19 -- make menuconfig
File systems --->
Pseudo filesystems --->
- sysfs file system support
- Virtual memory file system support (former shm fs)
-
Tmpfs POSIX Access Control Lists
(4) 由于ash功能不夠強大,不能支援tab補齊,曆史紀錄等等的進階功能,是以使用busybox裡面的msh代替ash.
因為busybox主要應用于對空間要求非常嚴格的嵌入式系統,是以它推薦使用uclibc而不鼓勵使用glibc,如果你沒有安裝uclibc,而且在 build Options也選擇了Build BusyBox as a static binary(no shared libs),那肯定無法編譯通過的,當然如果你之前build Options選擇的是動态編譯的話就不會有這樣的問題出現了。假設你是第一種情況,我們可以這樣解決:把applets/applets.c開頭的幾行 warning注釋掉
# vi applets/applets.c
# make
# make install
這時會在你的編譯目錄下生成一個_install的目錄,裡面包含了生成的所有檔案和目錄結構。
編譯時遇到的問題(1):
-----------------------------------------------
如果busybox編譯成static linking
Busybox Settings --->
Build Options --->
-
Build BusyBox as a static binary (no shared libs)
# make
将會遇到下面問題:
applets/applets.c:20:2: error: #warning Static linking against glibc produces buggy executables
applets/applets.c:21:2: error: #warning (glibc does not cope well with ld --gc-sections).
applets/applets.c:22:2: error: #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
applets/applets.c:23:2: error: #warning Note that glibc is unsuitable for static linking anyway.
applets/applets.c:24:2: error: #warning If you still want to do it, remove -Wl,--gc-sections
applets/applets.c:25:2: error: #warning from top-level Makefile and remove this warning.
make[1]: *** [applets/applets.o] Error 1
這個警告的定義在applets/applets.c中。将這段警告注釋掉就可以了。這段警告的意思是告訴你最好用uclibc編譯,而不是用glibc因為glibc比較大,busybox在寸土寸金的嵌入式系統中運用比較多,是以會有這樣的要求。
# vi /busybox-1.7.0/applets/applets.c +20
注釋掉20 -- 28行内容即可
miscutils/taskset.c:17: error: parse error before '*' token
-----------------------------------------------
最根本的解決辦法是換一個libc庫,可是現在還不知道哪個庫最合适,唯有暫時将有問題的指令關掉
Miscellaneous Utilities --->
[ ] taskset
[
]各式各樣的
runit/runsv.c: In function `gettimeofday_ns':
-----------------------------------------------
Runit Utilities --->
[ ] runsv
核心啟動時遇到的問題:
-----------------------------------------------
“could not run '/bin/sh': No such file or directory”
解決方法:
要這樣配置:
Shells --->
Choose your default shell (ash) --->
如果是這樣配置的話,雖然可以生成ash,但不能生成sh,将會在核心啟動時出現上面出現的問題:
Shells --->
Choose your default shell (none) --->
- ash 本文來自ChinaUnix部落格,如果檢視原文請點: http://blog.chinaunix.net/u2/78225/showart_1299803.html