分类:
2012-05-30 15:11:56
笔者所用环境为mipsel-unknown-linux-gnu-gcc
gcc version
所需源文件: busybox-
[root@vm-dev rootfs]# ls
busybox-
[root@vm-dev rootfs]# tar -vxjf busybox-
[root@vm-dev rootfs]# cd busybox-
[root@vm-dev busybox-
/work/busybox-
[root@vm-dev busybox-
[root@vm-dev busybox-
修改Makefile中的ARCH和CROSS_COMPILE与本机的路径一致,注意,如果在/root/.bash_profile中指定了路径,则不需要再给出路径。
CROSS_COMPILE ?= mipsel-unknown-linux-gnu-
...
ARCH ?= mips
先make menuconfig,修改以下:
[root@vm-dev busybox-
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
//直接编译成静态库,省事点
(mipsel-unknown-linux-gnu-) Cross Compiler prefix
//这里和Makefile里保持一致,应该写一处就行了
Installation Options --->
[ ] Don't use /usr
//使用usr目录
Busybox Library Tuning --->
[*] Fancy shell prompts
//一定要选上,否则很多转意字符无法识别
Shells --->
Choose your default shell (ash) --->
//这里选择shell为ash,应该是默认选中的
--- ash
//把ash这档的选项全部选上
Miscellaneous Utilities --->
[ ] inotifyd
//不选
保存退出,直接make,make install。
可以看到如下目录
[root@vm-dev busybox-
bin linuxrc sbin usr
[root@vm-dev busybox-
用shell脚本创建根文件系统的目录结构,并在想要建立根文件系统的地方运行此脚本。我是用root用户登陆的,直接创建了设备节点。
[root@vm-dev root_stand]# cat build_fs.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"
[root@vm-dev root_stand]#
执行这个sh:
[root@vm-dev root_stand]# sh build_fs.sh
makeing rootdir
makeing dir: bin dev etc lib proc sbin sys usr
making dir: mnt tmp var
making dir: home root boot
done
创建出一个主文件夹rootfs,里面有一批文件:
[root@vm-dev root_stand]# cd rootfs/
[root@vm-dev rootfs]# ls
bin boot dev etc home lib mnt proc root sbin sys tmp usr var
[root@vm-dev rootfs]#
[root@vm-dev rootfs]# cd etc/
[root@vm-dev etc]# ls
[root@vm-dev etc]# cp -a /work/busybox-
[root@vm-dev etc]# ls
fstab init.d inittab profile
[root@vm-dev etc]#
[root@vm-dev etc]# vi profile
# /etc/profile: system-wide .profile file for the Bourne shells
echo "Processing /etc/profile"
# no-op
# Set search library path
echo " Set search library path"
export LD_LIBRARY_PATH=/lib:/usr/lib
# Set user path
echo " Set user path"
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
# Set PS1
echo " Set PS1"
HOSTNAME=`/bin/hostname`
# 此处让shell提示符显示host名称的。是`,不是’,要注意
# 会在进入根系统后显示Jacky
export PS1="\\e[
# 此处\\e[
# \\e[00是关闭效果
# \\e[05是闪烁
#
# 多个命令可以;号隔开
echo "All done!"
echo
Inittab
[root@vm-dev etc]# vi 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
Fstab
[root@vm-dev 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
[root@vm-dev etc]# vi init.d/rcS
#! /bin/sh
echo "Processing etc/init.d/rc.S"
#hostname ${HOSTNAME}
hostname up-tech
echo " Mount all"
/bin/mount -a
echo " Start mdev...."
/bin/echo /sbin/mdev > proc/sys/kernel/hotplug
mdev -s
echo "****************************************************"
echo " rootfs by NFS, s
echo " Created by lyj_uptech @ 2008.11.28"
echo " Good Luck"
echo " "
echo "****************************************************"
echo
[root@vm-dev etc]# touch mdev.conf
9、从本机拷贝passwd、shadow、group文件。
[root@vm-dev etc]# cp /etc/passwd .
[root@vm-dev etc]# cp /etc/shadow .
[root@vm-dev etc]# cp /etc/group .
修改passwd文件,把第一行和最后一行的bash修改成ash。
会发现多了linuxrc -> bin/busybox文件,这是挂载文件系统需要执行的。
[root@vm-dev etc]# cd ..
[root@vm-dev etc]# cp -Rfv /work/busybox-
OK,以上用busybox创建了一个基本的文件系统。
PS:
如果编译busybox时选择动态库方式编译,则需要查看生成的busybox使用哪些动态库,然后把它们拷贝到rootfs/lib目录下。
[root@vm-dev lib]# arm-linux-readelf -d ../bin/busybox
参考文献:http://blog.chinaunix.net/u2/65122/showart.php?id=1671023