主机环境:
Linux version 2.6.32-24, Ubuntu10.04
gcc version 4.1.3, Thread model: posix;
GNU Make 3.81
arm-linux-gcc 3.4.5
所需源文件:
busybox-1.9.2.tar.bz2
用Busybox创建nfs文件系统:
1. 解压busybox-1.9.2.tar.bz2后,修改Makefile中的ARCH和CROSS_COMPILE与本机的路径一致
rookiesean@rookiesean-desktop:~/workspace$ cd busybox-1.9.2/
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2$ vi Makefile
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-
2. 编译busybox, 首先运行make menuconfig
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2$ make menuconfig
大部分的menu config都可以自定义,但是这里有几个是必须要选上的
Busybox Settings —>
Build Options —>
[*] Build BusyBox as a static binary (no shared libs)
//若想直接编译成静态库,勾选此选项,若想使用动态链接,则不选。
Installation Options —>
[*] Don’t use /usr
//不用本机的目录,否则生成的/bin/*会覆盖本机的/bin/*文件,会导致宿主机损坏。
Shells —>
Choose your default shell (ash) —>
//这里选择shell为ash,应该是默认选中的
— ash
//把ash这档的选项全部选上
保存退出,执行以下命令编译生成busybox基本文件:
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2$ make
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2$ make install
在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在寸土寸金的嵌入式系统中运用比较多,所以会有这样的要求。
解决方案是去掉这一段注释:
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2$ vim applets/applets.c
/* vi: set sw=4 ts=4: */
/*
* Stub for linking busybox binary against libbusybox.
*
* Copyright (C) 2007 Denys Vlasenko <vda.linux@googlemail.com>
*
* Licensed under GPLv2, see file License in this tarball for details.
*/
#include <assert.h>
#include “busybox.h”
/* Apparently uclibc defines __GLIBC__ (compat trick?). Oh well. */
#if ENABLE_STATIC && defined(__GLIBC__) && !defined(__UCLIBC__)
//#warning Static linking against glibc produces buggy executables
//#warning (glibc does not cope well with ld –gc-sections).
//#warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
//#warning Note that glibc is unsuitable for static linking anyway.
//#warning If you still want to do it, remove -Wl,–gc-sections
//#warning from scripts/trylink and remove this warning.
//#error Aborting compilation.
#endif
或者按照Warning message的提示,到scripts/trylink里面移掉-Wl跟–gc-sections.
3. 用shell脚本创建根文件系统的目录结构
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2$ vim makedir.sh
#!/bin/sh
echo “makeing rootdir”
mkdir rootfs
cd rootfs
echo “makeing dir: bin dev etc lib proc sbin sys usr”
mkdir bin dev etc lib proc sbin sys usr #8 dirs
mkdir usr/bin usr/lib usr/sbin lib/modules
#Don’t use mknod, unless you run this Script as
#mknod -m 600 dev/console c 5 1
#mknod -m 666 dev/null c 1 3
echo “making dir: mnt tmp var”
mkdir mnt tmp var
chmod 1777 tmp
mkdir mnt/etc mnt/jiffs2 mnt/yaffs mnt/data mnt/temp
mkdir var/lib var/lock var/log var/run var/tmp
chmod 1777 var/tmp
echo “making dir: home root boot”
mkdir home root boot
echo “done”
执行makedir.sh:
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2$ sh makedir.sh
将会在busybox目录下生成文件夹rootfs, 以及rootfs里一批文件夹及文件:
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2$ cd rootfs/
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2/rootfs$ ls
bin boot dev etc home lib mnt proc root sbin sys tmp usr var
4. 将busybox源码目录下etc里的内容拷贝到rootfs下在的etc
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2/rootfs$ cp ../examples/bootfloppy/etc/* ./etc/
5. 修改拷贝过来的profile文件
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2/rootfs$ cd etc/
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2/rootfs/etc$ vim profile
# /etc/profile: system-wide .profile file for the Bourne shells
echo
echo -n “Processing /etc/profile… ”
# no-op
#sean chi 29Aug2010, added, set search library path
echo “Set search library path”
export LD_LIBRARY_PATH=/lib:/usr/lib
#sean chi 29Aug2010, added, set user path
echo “Set user path”
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
#sean chi 29Aug2010, added, set PS1
echo “Set PS1″
HOSTNAME=`/bin/hostname`
export PS1=”\\e[32m[$USER@$HOSTNAME \\w\\a]\\$\\e[00;37m "
echo "Done"
echo
6. 修改inittab与fstab文件
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2/rootfs/etc$ vim inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::restart:/sbin/init
tty2::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2/rootfs/etc$ vim fstab
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
mdev /dev ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
7. 修改初始化脚本文件init.d/rcS
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2/rootfs/etc$ vim init.d/rcS
#! /bin/sh
echo "Processing etc/init.d/rcS"
echo "Mount all"
/bin/mount -a
echo "Start mdev..."
/bin/echo /sbin/mdev > proc/sys/kernel/hotplug
mdev -s
echo "**********************************"
echo " "
echo " rootFS created by Sean chi 29Aug "
echo " "
echo "**********************************"
echo
8. 创建一个空的mdev.conf文件,在挂载根文件系统时会用到的
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2/rootfs/etc$ touch mdev.conf
9. 把busybox默认安装目录中的文件全部复制到这里的rootfs中。会发现多了linuxrc -> bin/busybox文件,这是挂载文件系统需要执行的,基本上和init相同,入口都是init_main,在init/init.c里面。至于init,一般是读/etc/inittab,根据里面的定义运行若干子进程
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2/rootfs$ cp ../_install/* ./ -r
如果编译busybox时选择动态库方式编译,则需要查看生成的busybox使用哪些动态库,然后把它们拷贝到rootfs/lib目录下。
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2/rootfs$cd bin
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2/rootfs/bin$ /usr/local/arm/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-readelf -d busybox
得到如下结果:
Dynamic segment at offset 0xd46c8 contains 22 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libcrypt.so.1]
0×00000001 (NEEDED) Shared library: [libm.so.6]
0×00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000c (INIT) 0xd5d4
0x0000000d (FINI) 0xbdfbc
0×00000004 (HASH) 0×8128
0×00000005 (STRTAB) 0xace8
0×00000006 (SYMTAB) 0x8d38
0x0000000a (STRSZ) 5067 (bytes)
0x0000000b (SYMENT) 16 (bytes)
0×00000015 (DEBUG) 0×0
0×00000003 (PLTGOT) 0xe47b4
0×00000002 (PLTRELSZ) 3080 (bytes)
0×00000014 (PLTREL) REL
0×00000017 (JMPREL) 0xc9cc
0×00000011 (REL) 0xc58c
0×00000012 (RELSZ) 1088 (bytes)
0×00000013 (RELENT) 8 (bytes)
0x6ffffffe (VERNEED) 0xc4ac
0x6fffffff (VERNEEDNUM) 3
0x6ffffff0 (VERSYM) 0xc0b4
0×00000000 (NULL) 0×0
所以我们从交叉编译工具链的库文件目录下面拷取以下的文件(自编译交叉工具链的具体操作见《嵌入式Linux移植 – 使用crosstool创建自己的交叉编译器》一文):
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2/rootfs/bin$ cd ../lib/
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2/rootfs/lib$ cp /usr/local/arm/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/ld* ./
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2/rootfs/lib$ cp /usr/local/arm/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libc-2.3.6.so ./
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2/rootfs/lib$ cp /usr/local/arm/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libc.so.6 ./
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2/rootfs/lib$ cp /usr/local/arm/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libm.so.6 ./
rookiesean@rookiesean-desktop:~/workspace/busybox-1.9.2/rootfs/lib$ cp /usr/local/arm/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libcrypt.so.1 ./
对busybox的配置工作完成。在对宿主机和开发板的bootloader配置,使其能以NFS的形式加载内核后,启动开发板,得到如下显示:
Looking up port of RPC 100005/1 on 10.12.33.30
VFS: Mounted root (nfs filesystem).
Freeing init memory: 132K
init started: BusyBox v1.9.2 (2010-08-29 15:45:16 CST)
starting pid 772, tty ”: ‘/etc/init.d/rcS’
Processing etc/init.d/rcS
Mount all
Start mdev…
**********************************
rootFS created by Sean chi 29Aug
**********************************
starting pid 776, tty ”: ‘/bin/sh’
Processing /etc/profile… Set search library path
Set user path
Set PS1
Done
[root@armsys /]#
根文件系统顺利加载。
参考资料:
用busybox创建基于Linux2.6.24内核的nfs根文件系统
Linux2.6.24.4 根文件系统移植到S3C2410
Comments