在这篇文章里,我将向大家介绍如何构建一个最简单的嵌入式linux文件系统.说它最简单,是指必须的,能进入shell,缺少就无法成功.
采用目前最新的busybox:1.13.1
编译工具: mips-linux-gcc
1.建立基本的系统目录
只需要以下目录即可
mkdir rootfs
cd rootfs
mkdir bin sbin lib dev etc
2.建立最基本的dev节点
mknod -m 600 console c 5 1
3.建立inittab文件
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
#::respawn:/sbin/getty -L console 9600 vt100
::restart:/sbin/init
::shutdown:/bin/umount -a -r
注意:1.无需/etc/init.d/rcS这个文件也可进入shell
2.如果用::respawn:/sbin/getty -L console 9600 vt100
需要在/dev 新建:mknod -m 666 null c 1 3
同时还要在/etc建立group和passwd两个文件.这里不讨论.
4. 进入解压后的Busybox-1.13.1目录,运行make menuconfig 进行配置。
在进行配置时有几项需要注意:
Ø Build Options->
Build BusyBox as a static binary (no shared libs)
Force NOMMU build
Build shared libbusybox
Build with Large File Support (for accessing file>2GB)
可以选择Build BusyBox as a static binary (no shared libs).这种做法比较简单.
如果选择Build shared libbusybox方式进行编译时,要将交叉编译的动态库或符号链接复制到对应的目录中,否则程序不能运行。同时在配置时应去掉Build shared libbusybox目录下的两项:如下
Build shared libbusybox->
Produce binary for each applet,linked against libbusybox
Produce additional busybox binary linked against libbusybox
同时去掉
Build with Large File Support (for accessing file>2GB)
否则编译会报错。
Ø 一定要勾选上如下配置:
Init Utilities—>
(*) init
(*) Supporting reading an inittab file //支技init进程读取/etc/inittab配置文件。
(*) Supporting running commands with controlling-tty //使busybox在真实的串口设备中运行命令行,不使用可能会报类似与:sh:can’t access tty:job control turned off的错误。
其它基本可按默认配置。
编译
make
编译完成后执行
make install
则在Busybox-1.13.1目录下有_install这个目录,复制到rootfs:
cp -a _install/* rootfs
5.拷贝所需要的库到lib
比较简单的方法是直接拷贝你的交叉编译工具里的llb到rootfs/lib.
如果你编译busybox选择了动态编译,还需将busybox里的0_lib的文件拷到rootfs/lib
至此最基本的文件系统就完成了.当然这个文件系统并不实用,只是用来说明学习而矣.
PS:了解linux启动的人,应该知道可以跳过busybox的init而直接进入shell.可以在u-boot里设置
setenv bootargs init=/bin/sh
也可什么都不设,在文件系统里不要有init的存在.
因此只需要要编译一个最简单的sh, 即可进入shell,而无需busybox的帮助.