嵌入式 ARM Linux 系统构成(3):根文件系统(Root File System)

目录

一、根文件系统的原理与重要性

二、根文件系统的构成

2.1. 基本目录结构

2.2. 核心组件

2.3. 设备驱动

2.4. 网络工具和协议

2.5. 调试工具

三、根文件系统的制作方法

四、根文件系统的测试

五、构建根文件系统的关键技术

5.1. 最小化构建工具

5.2. 关键配置文件

5.3. 动态库优化

六、嵌入式根文件系统类型

七、优化根文件系统

八、常见问题解决

九、参考资料


在嵌入式 ARM Linux 系统的构建中,根文件系统(Root File System,简称根文件系统)扮演着至关重要的角色。它是整个系统运行的基础,承载着系统运行所需的各种文件和目录,如同大树的根系,为系统的正常运转提供必要的支持。

一、根文件系统的原理与重要性

根文件系统是 Linux 系统中所有其他文件系统和目录的起源。在 Linux 中,所有文件、目录、设备和驱动都被组织为一个树型结构,根文件系统就是这个结构的根节点。它是 Linux 内核启动后挂载的第一个文件系统,内核代码映像文件保存在根文件系统中,系统引导程序会在其挂载之后将一些初始化脚本和服务加载到内存中去运行。

一套完整的 Linux 系统,只有内核本身是无法正常工作的。内核需要 rootfs 上的 etc 目录下的配置文件、/bin /sbin 等目录下的 shell 命令,以及 /lib 目录下的库文件等相配合才能工作。如果没有根文件系统,Linux 内核在启动时会提示内核崩溃(Kernel panic)。

其主要作用包括:

  • 提供可执行程序:存放系统启动时需要运行的初始化脚本、守护进程等可执行文件,确保系统能够顺利启动并运行各种服务。例如,系统的 init 进程就是从根文件系统中加载并执行的,它负责启动其他进程和服务。

  • 存储库文件:包含了系统和应用程序运行所需的各种库文件。这些库文件提供了函数和功能的实现,使得应用程序能够调用它们来完成特定的任务。比如,C 语言标准库、图形库等。

  • 保存配置信息:根文件系统中的配置文件记录了系统和应用程序的各种设置和参数。例如,网络配置文件用于设置网络接口的 IP 地址、子网掩码等信息;系统服务的配置文件则决定了服务的运行方式和参数。

  • 管理设备文件:在 Linux 系统中,设备被抽象为文件。根文件系统中的设备文件目录(如 /dev)包含了各种设备文件,通过这些文件,系统可以对硬件设备进行访问和控制。例如,/dev/ttyS0 可能代表串口设备,应用程序可以通过操作这个文件来与串口设备进行通信。

二、根文件系统的构成

2.1. 基本目录结构

嵌入式 ARM Linux 系统的根文件系统通常由以下几个关键部分组成:

目录核心内容典型示例文件/工具
/bin基础用户命令(所有用户可用)lscpshmount
/sbin系统管理员命令(需root权限)ifconfigrebootfsck
/etc系统配置文件fstabpasswdnetwork/
/lib动态链接库(如glibc、内核模块)libc.sold-linux-armhf.so.3
/dev设备节点文件(由内核或udev生成)ttyS0mmcblk0p1gpiochip0
/proc内核和进程信息的虚拟文件系统(运行时生成)cpuinfomeminfo
/sys内核对象和硬件控制的虚拟文件系统电源管理、GPIO控制接口
/usr用户级程序和非关键库(可挂载为独立分区)/usr/bin/usr/lib
/var可变数据(日志、缓存等)/var/log/messages
/tmp临时文件(通常挂载为tmpfs以提高性能)-
/rootroot用户的家目录-
/home普通用户的家目录(嵌入式系统可能省略)-

2.2. 核心组件

  • init 系统:负责系统启动过程中的初始化和进程管理,如 SysVinit、Upstart 或 systemd。
  • Shell:提供用户与操作系统交互的界面,如 Bash、Sh 等。
  • 基本工具:如 ls、cp、mv、rm 等文件操作命令,以及 grep、sed、awk 等文本处理工具。
  • 网络配置工具:如 ifconfig、route、ping 等,用于配置和管理网络连接。

2.3. 设备驱动

虽然设备驱动通常包含在内核中,但某些特定设备或外设的驱动可能以用户空间程序的形式存在,并位于根文件系统的某个目录中。

2.4. 网络工具和协议

如 SSH、Telnet、FTP、HTTP、DHCP、DNS 等。这些工具和协议提供了系统连接其他网络设备、数据交换和网络管理的能力。

2.5. 调试工具

如 gdb、strace、top 等。这些工具能够帮助开发者定位和解决系统中的各种问题和异常。

三、根文件系统的制作方法

制作根文件系统的方法有多种,下面介绍一种常用的基于 BusyBox 的方法:

①准备开发环境

  • 安装交叉编译工具链,如 arm-linux-gcc。
  • 下载 BusyBox 源码。

②配置 BusyBox

  • 解压 BusyBox 源码并进入源码目录。
  • 运行 make menuconfig 进入配置界面。
  • 选择需要的功能和配置选项,如选择静态链接、设置安装前缀等。

③编译 BusyBox

  • 运行 make 进行编译。
  • 运行 make install 将编译结果安装到指定的目录(如 rootfs)。

④创建根文件系统目录结构

  • 在开发主机中创建一个空文件夹作为根文件系统的雏形。
  • 在该文件夹中创建必要的目录,如 /bin、/sbin、/etc、/lib 等。

⑤添加必要的文件

  • 将 BusyBox 安装到根文件系统目录中。
  • 复制必要的库文件到 /lib 目录。
  • 创建必要的配置文件到 /etc 目录。

⑥制作根文件系统镜像:使用专用工具(如 mke2fs)将文件夹形式的根文件系统制作成可供烧录的镜像文件。

四、根文件系统的测试

制作完成后,需要对根文件系统进行测试以确保其能够正常工作。常用的测试方法包括:

①使用 NFS 挂载测试

  • 在开发主机中搭建 NFS 服务器,并导出根文件系统目录。
  • 在开发板中配置 NFS 启动参数,通过 NFS 挂载根文件系统进行测试。

②烧录到块设备测试

  • 将根文件系统镜像烧录到开发板的块设备(如 EMMC、NAND Flash)中。
  • 启动开发板,测试根文件系统是否能够正常挂载和运行。

五、构建根文件系统的关键技术

5.1. 最小化构建工具

  • BusyBox:集成精简版UNIX工具(lsifconfiginit等),替代GNU Coreutils

# 编译BusyBox示例
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig
make menuconfig  # 选择所需工具
make install     # 输出到_install目录
  • Buildroot/Yocto:自动化构建工具链、库和文件系统

    • Buildroot适合快速构建轻量级系统

    • Yocto适合复杂定制和长期维护 

5.2. 关键配置文件

  • /etc/inittab:定义系统初始化行为(串口登录、启动脚本)

::sysinit:/etc/init.d/rcS
ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100
  • /etc/fstab:定义文件系统挂载点 
proc  /proc proc  defaults  0 0
tmpfs /tmp  tmpfs defaults,size=64M 0 0
  • /etc/init.d/rcS:系统启动脚本(挂载文件系统、启动服务) 

5.3. 动态库优化

  • 使用arm-linux-gnueabihf-strip裁剪调试符号

  • 通过ldd检查依赖:

arm-linux-gnueabihf-ldd /bin/busybox
  • 可选方案:静态编译(增大体积但减少依赖) 

六、嵌入式根文件系统类型

类型特点适用场景
initramfs压缩的CPIO归档,直接嵌入内核镜像早期启动/临时根文件系统
squashfs只读压缩文件系统(节省空间)固件升级(与可写分区配合使用)
UBIFS专为NAND Flash设计(支持磨损均衡、坏块管理)NAND Flash存储设备
ext4经典日志文件系统(支持读写)eMMC/SD卡等块设备
tmpfs内存文件系统(高速但易失)/tmp目录或临时数据存储

七、优化根文件系统

在嵌入式系统中,资源有限,因此需要对根文件系统进行优化以提高性能和降低功耗。以下是一些优化建议:

①空间节省

  • 删除未使用语言包:rm -rf /usr/share/locale/*

  • 使用musl-libc替代glibc(更小的体积)

②只读优化

# 挂载为只读(提高可靠性)
mount -o remount,ro / 

③调试手段

  • 通过strace跟踪系统调用

  • 使用df -h检查存储空间占用

④裁剪不必要的组件:移除根文件系统中不必要的程序和库文件,以减少系统的大小和复杂度。

⑤使用压缩文件系统:选择压缩文件系统(如 CRAMFS、SquashFS 等)来减少根文件系统的大小,同时提高读取速度。

⑥优化启动过程:使用轻量级的 init 系统(如 systemd 的简化版或 BusyBox 的 init)来加快系统启动速度。

⑦动态加载库文件:使用动态链接库(Shared Libraries)来减少程序占用的空间,并允许在运行时按需加载库文件。

⑧调整系统配置:根据实际需求调整系统配置文件(如 /etc/inittab/etc/fstab 等),以减少不必要的启动服务和挂载点。

八、常见问题解决

①启动失败:Kernel panic - not syncing: No init found

  • 检查内核命令行参数:root=是否正确指定设备

  • 确认/sbin/init/bin/sh存在且有可执行权限

②动态库缺失

  • 使用LD_LIBRARY_PATH指定库路径

  • 通过readelf -d <binary>查看依赖库

③存储空间不足

  • 启用压缩文件系统(如squashfs+lzo)

  • 将大文件移到独立分区(如/usr挂载到单独分区)

九、参考资料

  1. 《嵌入式 Linux 应用开发完全手册》:作者宋宝华,这本书全面深入地介绍了嵌入式 Linux 系统开发的各个方面,包括根文件系统的概念、构建方法以及在实际项目中的应用。
  2. 《深入理解 Linux 内核》(第三版):虽然主要聚焦于 Linux 内核,但其中关于文件系统的部分,包括根文件系统的原理和机制,讲解得非常深入细致。
  3. 《ARM 嵌入式 Linux 系统开发实战指南》:详细介绍了基于 ARM 架构的嵌入式 Linux 系统开发流程,其中对根文件系统的构建、配置以及优化等方面都有专门的章节进行讲解。
  4. Linux 官方文档(The Linux Kernel documentation — The Linux Kernel documentation):Linux 内核官方文档中包含了关于各种文件系统的详细技术文档,对于深入了解根文件系统的实现原理和内核接口非常有价值。
  5. Buildroot 官方文档(https://buildroot.org/downloads/manual/manual.html):Buildroot 是一个常用的嵌入式 Linux 系统构建工具,其官方文档详细介绍了如何使用 Buildroot 构建根文件系统,包括配置选项、软件包管理以及生成根文件系统的具体步骤等。
  6. Yocto Project 官方文档(Welcome to the Yocto Project Documentation — The Yocto Project ® 5.1.999 documentation):Yocto Project 是一个功能强大的嵌入式 Linux 开发框架,官方文档对其各个方面都有详细的说明。在根文件系统构建方面,文档中介绍了 Yocto Project 的构建流程、层叠架构以及如何定制根文件系统的内容和结构等,适合想要深入学习和使用 Yocto Project 进行嵌入式系统开发的读者。
  7. Linux 中国(Linux 中国◆开源社区):该网站上有许多关于嵌入式 Linux 系统开发的博客文章,其中不乏关于根文件系统的技术分享。博主们会结合自己的实际开发经验,介绍根文件系统的构建技巧、常见问题及解决方法等,内容丰富且实用。
  8. Linux 社区(https://www.linux.org/):这是一个全球性的 Linux 技术社区,用户可以在论坛上提问、分享经验和讨论技术问题。
  9. 电子发烧友论坛(电子发烧友):作为电子技术领域的专业论坛,电子发烧友论坛上有很多关于嵌入式系统开发的讨论
  10. ARM 社区(Challenge Validation):ARM 官方社区提供了丰富的关于 ARM 架构的技术资源和讨论平台。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/983197.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot知识点及其源码解析(1)

自动配置 以web启动器为例&#xff0c;在spring-boot-starter-test-3.4.3.pom文件整合了一系列的依赖&#xff0c;那么当启动程序后会不会进行自动配置&#xff1f;当获取到这个容器后&#xff0c;可以从容器中获取所有bean的名字&#xff0c;此时就可以在控制台发现很多bean的…

网络安全配置截图 网络安全i

网络安全概念及规范 1.网络安全定义 网络安全的概述和发展历史 网络安全 广义的网络安全&#xff1a;Cyber Security&#xff08;网络空间安全&#xff09; 网络空间有独立且相互依存的信息基础设施和网络组成&#xff0c;包括互联网、电信网、计算机系统、嵌入式处理器和控…

【ThreeJS Basics 09】Debug

文章目录 简介从 dat.GUI 到 lil-gui例子安装 lil-gui 并实例化不同类型的调整改变位置针对非属性的调整复选框颜色 功能/按钮调整几何形状文件夹调整 GUI宽度标题关闭文件夹隐藏按键切换 结论 简介 每一个创意项目的一个基本方面是能够轻松调整。开发人员和参与项目的其他参与…

第六课:数据存储三剑客:CSV/JSON/MySQL

在Python的数据存储与处理领域&#xff0c;CSV、JSON和MySQL被广大开发者誉为“数据存储三剑客”。它们各自在不同的场景下发挥着重要作用&#xff0c;无论是简单的数据交换、轻量级的数据存储&#xff0c;还是复杂的关系型数据库管理&#xff0c;都能找到它们的身影。本文将详…

CSS设置文字渐变色样式(附带动画效果)

最近用DeepSeek问了一下如何使用css设置文字的渐变色效果&#xff0c;并且希望可以有动画效果&#xff0c;然而DeepSeek给出的答案动画效果有些bug&#xff0c;于是自己动手改了改。 下面是CSS样式设置代码 .gradient-text {background-image: linear-gradient(to right, #ff6…

三维建模与视频融合(3D-Video Integration)技术初探。

三维建模与视频融合&#xff08;3D-Video Integration&#xff09;是一种将虚拟三维模型无缝嵌入实拍视频场景的技术&#xff0c;广泛应用于影视特效、增强现实&#xff08;AR&#xff09;、游戏开发、广告制作 、视频监控 等领域。 一、技术核心流程 三维建模与动画 使用工具…

electron + vue3 + vite 主进程到渲染进程的单向通信

用示例讲解下主进程到渲染进程的单向通信 初始版本项目结构可参考项目&#xff1a;https://github.com/ylpxzx/electron-forge-project/tree/init_project 主进程到渲染进程&#xff08;单向&#xff09; 以Electron官方文档给出的”主进程主动触发动作&#xff0c;发送内容给渲…

第八节:基于Winform框架的串口助手小项目---完结优化《C#编程》

C# 实战串口助手完成&#xff01; ----------------------------不竭余力&#xff0c;方能成长&#xff01;-----------WHAPPY 源码&#xff1a;我会分享开源平台&#xff0c;可以艾特me&#xff01;&#xff08;2025/3/5&#xff09;时间紧张任务中&#xff01; 文章上所说的…

SpringBoot接入DeepSeek(硅基流动版)+ 前端页面调试(WebSocket连接模式)

文章目录 前言正文一、项目环境二、项目代码2.1 pom.xml2.2 DeepSeekController.java2.3 启动类2.4 logback-spring.xml2.5 application.yaml2.6 WebsocketConfig.java2.7 AiChatWebSocketHandler.java2.8 SaveChatSessionParamRequest.java2.9 index.html 三、页面调试3.1 主页…

计算机视觉之dlib人脸关键点绘制及微笑测试

dlib人脸关键点绘制及微笑测试 目录 dlib人脸关键点绘制及微笑测试1 dlib人脸关键点1.1 dlib1.2 人脸关键点检测1.3 检测模型1.4 凸包1.5 笑容检测1.6 函数 2 人脸检测代码2.1 关键点绘制2.2 关键点连线2.3 微笑检测 1 dlib人脸关键点 1.1 dlib dlib 是一个强大的机器学习库&a…

进程控制 ─── linux第15课

目录 进程控制 1.进程创建 fork函数 写时拷贝 fork常规用法 fork调用失败的原因 进程终止 进程退出的场景 退出码 ​编辑 进程终止的方法 _exit函数 exit函数 exit与_exit 进程等待 进程等待必要性 进程等待的方法(wait 和waitpid) 阻塞非阻塞问题 ​编辑 非…

Kubernetes 的正式安装

1.基础的网络结构说明 软件路由器 ikuai 当然同一个仅主机模式 相当于在 同一个我们所谓的广播域内 所以相当于它们的几张网卡 是被连接起来的 为了防止出现问题 我们可以把第二块网卡临时关闭一下 2.准备路由器 ikuai 爱快 iKuai-商业场景网络解决方案提供商 (ikuai8.com)…

【为什么会有 map、weakmap 类型?】

为什么会有 map、weakmap 类型? 传统对象的局限性催生 Map‌1. 键类型单一性‌2. 有序性与迭代支持‌3. 性能优化场景‌ 内存管理需求催生 WeakMap‌1.弱引用机制‌2. 私有数据存储‌3. 规避循环引用问题‌ 总结 传统对象的局限性催生 Map‌ 1. 键类型单一性‌ 传统对象&…

HTML-05NPM使用踩坑

2025-03-04-NPM使用踩坑 本文讲述了一个苦逼程序员在使用NPM的时候突然来了一记nmp login天雷&#xff0c;然后一番折腾之后&#xff0c;终究还是没有解决npm的问题&#x1f61e;&#x1f61e;&#x1f61e;,最终使用cnpm完美解决的故事。 文章目录 2025-03-04-NPM使用踩坑[toc…

java后端开发day27--常用API(二)正则表达式爬虫

&#xff08;以下内容全部来自上述课程&#xff09; 1.正则表达式&#xff08;regex&#xff09; 可以校验字符串是否满足一定的规则&#xff0c;并用来校验数据格式的合法性。 1.作用 校验字符串是否满足规则在一段文本中查找满足要求的内容 2.内容定义 ps&#xff1a;一…

鸿蒙HarmonyOS评论功能小demo

评论页面小demo 效果展示 1.拆解组件&#xff0c;分层搭建 我们将整个评论页面拆解为三个组件&#xff0c;分别是头部导航&#xff0c;评论项&#xff0c;回复三个部分&#xff0c;然后统一在index界面导入 2.头部导航界面搭建 Preview Component struct HmNavBar {// 属性&a…

智能机器人学习机WT3000A AI芯片方案-自然语音交互 打造沉浸式学习体验

一、概述 当AI浪潮席卷全球&#xff0c;教育领域也未能幸免。AI学习机&#xff0c;这个打着“个性化学习”、“精准提分”旗号的新兴产品&#xff0c;正以惊人的速度占领市场。从一线城市到偏远乡镇&#xff0c;从学龄前儿童到高考备考生&#xff0c;AI学习机的广告铺天盖地&am…

鸿蒙与DeepSeek深度整合:构建下一代智能操作系统生态

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/north 目录 技术融合背景与价值鸿蒙分布式架构解析DeepSeek技术体系剖析核心整合架构设计智能调度系统实现…

【UCB CS 61B SP24】Lecture 22 23: Tree and Graph Traversals, DFS, BFS 学习笔记

本文讲解了二叉树的四种遍历方式&#xff0c;以及如何通过前/后序遍历与中序遍历重建出二叉树&#xff0c;接着介绍了新的非线性数据结构&#xff1a;图&#xff0c;详细讲解了图的存储方式与遍历方式&#xff0c;最后使用 Java 基于邻接表的存储方式实现了图与 DFS、BFS 两种遍…

GCC RISCV 后端 -- C语言语法分析过程

在 GCC 编译一个 C 源代码时&#xff0c;先会通过宏处理&#xff0c;形成 一个叫转译单元&#xff08;translation_unit&#xff09;&#xff0c;接着进行语法分析&#xff0c;C 的语法分析入口是 static void c_parser_translation_unit(c_parser *parser); 接着就通过类似递…