rootfs,即root filesystem,中文直译为根文件系统,有时称文件系统(虽然不正确)。我们在板子上运行的命令、程序,都离不开rootfs,当然也离不开内核。本文着重介绍一下rootfs。
rootfs包含了系统环境,如系统命令、动态库/静态库、配置文件。也包含了用户程序(用户程序也可以理解为命令,不过是用户级别的)。现在有很多框架生成rootfs,如buildroot、LFS,不过嵌入式环境中,flash空间比较小(考虑硬件成本),busybox是不二之选,busybox体积非常小,因为将编译得到的所有命令,都链接到一个叫busybox的二进制文件,——这个box非常busy。所以十分适合嵌入式的场合,文中的rootfs就是指busybox。当然,如果财大气粗,flash空间非常大,则另说。
制作rootfs的过程,也称为“构建rootfs”。
一、rootfs编译步骤
busybox官网为https://busybox.net/,版本更新比较频繁。其实,选定一个版本即可,不需要追求最新。
1、配置:make menuconfig
一般地,busybox官方会有默认的配置,在此基础上再按需要选择,或删除或增加。
2、编译:make
注意,配置和编译,都要区分交叉编译,如是,则要编译时添加诸如CROSS_COMPILE=arm-linux- ARCH=arm的选项。
3、安装:make install
默认将编译好的二进制安装到busybox当前目录._install目录。
二、rootfs移植要点
一般地,厂家会自带了rootfs,里面包含厂家已经写好的脚本文件,如启动脚本、配置文件,等。如果自己从头构建的话,除了busybox的二进制,还需要自行添加配置文件,一般在/etc目录,还有一些库文件,在/lib目录,等等。
需要提出的是,有些工具busybox是不带的,如ldd、file等等。这些命令有的厂家会自带,如不自带,则要额外再编译,因此也是移植的一个工作量。
另外,有些配置可能不符合实际需求,也需要修改,比如设置默认IP、网关,点LED灯,禁止某些功能,等。
三、rootfs学习要点
rootfs不算复杂,一般使用厂家自带的编译好的文件即可。只需要在其上进行适应性修改。这些修改包含新加某些命令,修改启动脚本,等等。
笔者认为,可以在适当时候研究一下busybox源码,了解其结构,里面的一些技巧可直接在实际项目中使用。
最后需要提一下交叉编译器的问题。u-boot、kernel、rootfs的编译,最好使用同一版本的编译器。编译器虽然有版本兼容一说,但不同版本的编译编译得到的结果,可能会非常奇怪。额外添加的二进制文件,也需要相同版本的编译器。
2019年6月的PS:笔者建立了一个rootfs的仓库:https://www.cststudio.com.cn/rootfs,仅供参考。
李迟 2017.7.14 周五 晚