接着前边内核移植的文章,记录根文件系统的构建。
这里要用到强大的busybox,我选择的版本是busybox-1.18.5.tar.bz2 ,1.17的也可以;之所以选择这个版本是因为基于现在的交叉编译环境,可以正常静态编译busybox的版本貌似就是1.17之后的了(之前测试的是这样),当然用动态的也可以。
这里我讲述两种构建(静态和动态)形式都记录一下。正好这两种构建模式分别与TQ2440开发板手册和嵌入式Linux开发完全手册是对应的,所以整个流程都是参照这两份材料进行的。
根文件系统的构建到底是做什么的呢?说白了就是制作好一个文件目录,按照OS正常启动的必要需求,在对应的位置放上对应的需要的文件和应用程序(比如经常用到的一些命令[不过命令并不是制作文件系统所必须的,只是为了后边维护时用着方便,这也是busybox的实际存在意义,它集成了很多可用于嵌入式的管理命令和系统命令,还有系统启动所必须的一些东西,如init])。另一方面也说明了根文件系统的某些特性,它对应着内核的接口,按照一定的规范,实现了用户和内核的交互(如shell,和目录树),这也是为什么有句话说“挂载根文件系统”。其实文件系统也并不是所有工程所必须的。一切都由需求而定。
首先进行的是动态编译的简单构建,比较简单。并没有配置很多很多用户和一些预期要用到的文件,只是实现了可以挂载以及busybox集成的命令工具,可以用于arm Linux的驱动开发和测试。
1、 编译busybox 。
这里,在busybox解压后的目录里,运行make menuconfig 会看到和kernel一样的配置菜单,可以对其进行配置,大多配置项都是对一些命令支持的选择。有一点用到了必须说一下,就是是否静态编译的选项:
Busybox Settings --->
Build Options --->
[ ] Build BusyBox as a static binary (no shared libs)
这里我们先用动态编译。动态编译的话,在配置好文件系统后,要把编译时动态连接到的库手动的拷贝到对应的目录中。
这里就用默认的了(其实默认的配置基本上是所有功能都选上了,图个懒么,万一将来用到选项没有配上,还得回来重新配上,重新编译,重新制作镜像,重新烧写。。。)。
编译时改Makefile中
ARCH ?=arm #1.18版的busybox在190行(我也纠结着俩哥们怎么分开了)
CROSS_COMPILE ?=arm-linux- #1.18版本的在164行
然后我们在工程目录中建一个目录fs1,来存放我们的这个文件系统,即/home/jun/arm/fs1.
弄好以后,执行命令:(ps:在busybox目录下)
$ make CONFIG_PREFIX=/home/jun/arm/fs1 install
待到编译完成以后,会在fs1目录下生产bin linuxrc sbin usr,证明我们已经有了强大功能的命令和工具集,接下来就可以构建我们的根文件系统了。
因为编译是动态链接的,所以我们要把动态链接库准备好,我们是用的arm-linux-gcc编译的,当然用的就是glibc的库喽,去交叉编译器的目录下找一下。
在busybox目录下执行:
$ arm-linux-readelf -a ./busybox|grep "Shared"
会列出shared的lib,我的列出来的是:
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libc.so.6]
然后我们就把这两个依赖到的链接库拷贝到fs