简介
rootfs(root file system根文件系统),是一个文件系统,内核启动过后第一个挂载它,kernel会引导程序加载一些文件系统中的脚本和服务进行初始化。
Linux支持多种文件系统:ext3(extended file system)、nfs(network file system)、jffs、romfs(只读文件系统,可通过ramdisk访问)。
VFS(虚拟文件系统):对不同的文件系统做一个抽象,提供统一的API访问接口。
嵌入式文件系统构建工具:busybox、buildroot、Yocto。
buildroot简介
BusyBox 是一个集成了大量的 Linux 命令和工具的软件,例如ls,mv,ifconfig。但是但是要编译其他程序的话需要手工下载、编译,如果它需要某些依赖库,你还需要手工下载、编译这些依赖库。如果想做一个极简的文件系统,可以使用Busybox手工制作。
Buildroot它是一个自动化程序很高的系统,可以在里面配置、编译内核,配置编译u-boot、配置编译根文件系统。在编译某些APP时(比如tftp sqlite),它会自动去下载源码、下载它的依赖库,自动编译这些程序。语法也类似Makefile,容易掌握。
buildroot下载位置:https://buildroot.org/downloads/
buildroot使用手册:https://buildroot.org/downloads/manual/manual.html
移植目标
- 下载编译生成根文件系统。
- 配置,添加所需服务,如tftp、can等;去掉不需要的服务功能。
- 添加脚本,系统启动时,能正确加载并启动应用程序;
编译构建根文件系统
-
下载解压根buildroot。
-
在configs目录下找到的相近的配置atmel_sama5d3xek_deconfig。执行“make atmel_sama5d3xek_deconfig”编译生成配置文件.config(在linux下为隐藏文件,执行ls –a可以查看到)。
-
在buildroot第一级目录下,执行“make menuconfig”命令进入图形化配置界面。修改如下配置:
①” Target options(目标配置)”->” Target ABI”设置为” EABI”,应用程序二进制接口为EABI。
②“Target options”->” ARM instruction set”设置为“ARM”,arm汇编指令集选择为ARM。
③“Toolchain(工具链)”->“GCC compiler Version”选择“gcc 4.8.x”,选择gcc编译器版本。
④“Filesystem imge(文件系统镜像)”->选中” cpio the root filesystem”,设置文件系统镜像类型。
⑤”Filesystem image”->选中“ext2/3/4 rootfilesystem”,次选项选择” ext2/3/4 variant (ext2(rev0))”。
⑥“Filesystem image”-> “Compression method”选中”bzip2”,在kernel中配置过文件系统的压缩格式为bzip2,需要与之对应。
⑦“Bootloaders”下取消所有选择。
⑧“Target packages”->”Networing applications”中选中”can-utils”、”ethtool”(用于获取以太网信息,修改配置等)、“lrzsz”(支持rz sz指令Ymodem传输文件)。
-
保存并退出配置界面,执行“make clean”清除编译信息,执行“make”编译buildroot。编译过程可能需要联网进行服务的下载,所以要保持在网。
-
编译完成过后,在“output/images/”目录下生成rootfs镜像文件rootfs.ext2.bz2。(编译需要几十分钟)
-
裁剪文件系统,去掉除英文和中文以外的其他语言支持,编译完成后,进入“output/targe/usr/share/locale”目录,除保留“en@boldquot”、“en@quot”、“en@shaw”、“en_CA”、“en_GB”、“zh_CN”、“zh_HK”、“zh_TW”目录和“locale.alias”文件外,该目录内的其它子目录和文件全部删除。
-
重新执行make,这个过程比较快,再次编译出来的镜像文件小了很多.
-
下载运行。
增加自启动脚本
编译生成镜像文件之后,如果需要修改目标架构,可以在output/target中修改,修改过后执行make重新打包。
/etc/init.d/rcS是个shell脚本,Linux系统启动过后会自动运行/etc/init.d/rcS脚本。
如果程序开机需要运行自己的程序,则可以在rcS中添加执行。
常见问题
- make过后,弹出LD_LIBRARY_PATH environment variable. This doesn’t work.错误,执行unset LD_LIBRARY_PATH指令。
- 弹出“Permission denied”错误或“write error”错误,是因为文件用户组不对,可以输入ls –l查看。执行sudo chown –R xxx:xxx *修改文件目录和用户组。