关注+星号公众号,不容错过精彩
作者:HywelStar
在嵌入式系统中,根文件系统是系统启动后的基础环境,它包含了系统启动所需的所有文件和库。它不仅为用户提供操作系统环境,还承担着系统资源的管理任务。在嵌入式开发中,根文件系统的设计和构建至关重要,直接影响系统的启动速度、功能性和效率。
有原厂直接提供的支持,通常会采用原厂 SDK 中的工具或文件来制作根文件系统。本章节就简单总结看看根文件系统相关的知识。
1. 根文件系统的概念
根文件系统(Root File System,简称 RFS)是操作系统的核心文件系统。它通常挂载在启动过程中由内核加载,并包含所有必要的工具和库来启动和运行操作系统。
基本目录结构:
• /bin
:包含基本的系统命令,如ls
、cp
、cat
等。• /etc
:系统配置文件,如/etc/fstab
、/etc/network/interfaces
等。• /lib
:包含共享库和内核模块。• /usr
:包含应用程序和文件,是扩展的文件系统,通常包括安装的程序和库。• /var
:存储动态数据,如日志文件、邮件等。• /dev
: 外部设备。
2. 根文件系统构建方式
构建一个根文件系统的方式有很多种,这里就主要说说 BusyBox、Buildroot 和 Yocto,这 是最常用的三大工具,它们各自具有不同的优势和适用场景。
2.1 BusyBox 构建根文件系统
BusyBox 是一个轻量级的 Unix 工具集,它将常用的命令行工具(如 ls
、cat
、cp
等)打包成一个单一的二进制文件,极大地减少了根文件系统的体积。对于嵌入式系统,尤其是资源受限的设备,BusyBox 是一个非常受欢迎的选择。
https://www.busybox.net/about.html
优点:
• 小巧紧凑:将多个常见工具合并为一个二进制文件,大大节省了存储空间。 • 高度可定制:用户可以根据项目需求选择需要的工具,去掉不必要的部分,进一步优化体积。 • 启动快速:因文件体积小,加载和启动速度快,适合嵌入式系统。
适合这种资源受限,构建一个极简的根文件系统,快速启动并运行基本的系统命令。
2.2 Buildroot 构建根文件系统
Buildroot 是一个自动化工具,旨在简化嵌入式 Linux 系统的构建过程。它提供了一个快速的方式来构建交叉编译工具链、内核镜像、根文件系统和用户空间应用。Buildroot 提供了广泛的预配置选项,能够帮助开发者根据目标平台快速构建系统。
https://buildroot.org/
优点:
• 自动化构建:只需要配置一个 .config
文件,Buildroot 会自动化处理所有的构建任务。• 多平台支持:支持 ARM、MIPS、x86 等多种硬件架构,适合不同的嵌入式设备。 • 丰富的软件包支持:提供了大量预配置的软件包(如 busybox
、openssh
、python
等),可以根据需要选择并集成。
适用于这种需要定制化,通过自动化构建的开发者,很适合在不同硬件平台下生成不一样的镜像。
2.3 Yocto 构建根文件系统
Yocto 是一个功能强大的构建框架,旨在为嵌入式 Linux 提供一个灵活的、可定制的开发环境。它使用 BitBake 构建工具,能够管理复杂的依赖关系并为不同平台构建完整的系统。Yocto 项目不仅支持根文件系统的构建,还能生成交叉编译工具链、内核镜像、用户空间应用等。
https://www.yoctoproject.org/
优点:
• 高度可定制:Yocto 提供了完整的构建工具链,能够定制内核、库、驱动、应用等,非常适合复杂和大规模的嵌入式系统。 • 支持多种硬件平台:Yocto 提供了丰富的硬件平台支持包(BSP),能方便地为不同架构的设备构建系统。 • 强大的软件包管理:通过 Yocto 的层机制,可以轻松扩展和定制软件包,支持大规模应用和复杂的依赖管理。
适用于较为复杂的定制系统,对软件依赖,内核配置,硬件支持要求较高的系统,可以用于各种平台。目前 Yocto 已被广泛应用于复杂嵌入式系统的开发。
3. 根文件系统的挂载
在内核启动时,通过命令行参数(如 root=/dev/mmcblk0p1
)指定根文件系统的位置。内核加载相应的设备驱动(如 SD 卡驱动和文件系统驱动),并尝试将根文件系统挂载到 /
目录。如果根文件系统已加密,则启动时 initramfs
需要完成解密后挂载根文件系统。挂载成功后,系统会根据 /etc/fstab
挂载其他文件系统,最终启动 init
进程进入用户空间。
4. 工作中根文件系统开发与调试
在工作中对于文件系统会遇到什么问题,需要考虑哪些?依据笔者来看,可能有以下可能出现:
1.系统启动失败制作后的文件系统打包到系统镜像后,出现无法启动或出现panic。对于这种原因可以考虑内核配置与文件系统是否匹配,启动脚本或者库文件缺失,还有可能文件系统镜像损坏或不完整。
2.文件或者库缺失出现这种情况,一般在应用程序中出现报错,找不到文件或者库缺失,很可能在构建系统中遗漏一些依赖文件或者工具。可以使用 ldd检查动态库的依赖关系,并在打包过程中尽量通过脚本自动化处理。
3.文件系统损坏设备运行一段时间发现数据丢失或者无法挂载,可能存在存储介质质量问题,选择不正确文件系统类型原因。
4.权限问题对于权限问题,可以影响到服务启动失败,只需要将对应文件进行修改权限即可。
对于开发调试,根文件系统制作完毕后,为了避免烧写麻烦,可以选择网络文件系统进行先验证,后续采用烧录方式节约时间加快开发进度。对于定制化系统尽量简单,减小系统镜像,这对于系统的性能都有一定的提升。
5. 总结
本章节主要简单对根文件系统制作的工具简单介绍,开发过程可能遇到的问题解读,但更多的是在实际开发过程中去接触,随着更加完善,buildroot , yocto 作为主流,busybox 更多是一些基础工具,都是需要开发者进行去了解。
往期推荐