嵌入式 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 架构的技术资源和讨论平台。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flowable 基本入门

flowable.7z官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 1、Flowable介绍 Flowable是BPMN的一个基于java的软件实现&#xff0c;不过Flowable不仅仅包括BPMN&#xff0c;还有DMN决策表和CMMN Case管理引擎&#xff0c;并且有自己的用户管理、微服务API等一系列功能&a…

如何使用 LLM 生成的术语自动在搜索应用程序上构建 autocomplete 功能

作者&#xff1a;来自 Elastic Michael Supangkat 了解如何在 Elastic Cloud 中&#xff0c;通过使用 LLM 生成的词汇&#xff0c;为搜索应用增强自动补全功能&#xff0c;实现更智能、更动态的搜索建议。 自动补全是搜索应用中的一项关键功能&#xff0c;它通过在用户输入时实…

【LTSPCIE】D触发器的搜索和使用

几乎没有D触发器的spice模型&#xff0c;不过LTSPICE里面自带一个D触发器 搜索&#xff1a;DFLOP 如下图&#xff08;这里必须吐槽一下LTSPICE的搜索功能&#xff0c;超级难用&#xff09; 但是接入电路后发现并不工作&#xff01;原因是还需要进行参数的设置。参考该篇文章L…

从零开始实现大语言模型(十四):高阶训练技巧

1. 前言 预训练大语言模型的流程与训练普通神经深度网络模型本质上并没有任何不同。可以使用深度学习实践中已经被证明非常有效的高阶训练技巧&#xff0c;优化大语言模型预训练流程&#xff0c;使大语言模型预训练效率更高&#xff0c;训练过程更稳定。 本文介绍深度学习领域…

鸿蒙HarmonyOS-Navagation基本用法

Navagation基本用法 Navigation组件是路由导航的根视图容器&#xff0c;一般作为Page页面的根容器使用&#xff0c;其内部默认包含了标题栏&#xff0c;内容栏和公工具栏&#xff0c;其中内容区默认首页显示导航内容&#xff08;Navigation的子组件&#xff09;或非首页显示&am…

centos8更换阿里云yum源

1.centos8更换为阿里云yum源 2.更换阿里云Yum-centos8源 mv /etc/yum.repos.d/CentOS-Stream-BaseOS.repo /etc/yum.repos.d/CentOS-Stream-BaseOS.repo.backupcurl -o /etc/yum.repos.d/CentOS-Stream-BaseOS.repo https://mirrors.aliyun.com/repo/Centos-8.repowget -O /et…

springboot-bug

spring boot :3.2.6该版本不与mybatis框架兼容&#xff0c;所以使用该版本时&#xff0c;请注意JDBC框架&#xff0c;要不然你会疑问&#xff0c;明明自己映射是对的&#xff0c;实体类是对的&#xff0c;各种东西都配好了&#xff0c;但就是报错&#xff0c;这是因为SpringBoo…

【HarmonyOS Next之旅】DevEco Studio使用指南(一)

目录 1 -> 工具简介 1.1 -> 概述 1.2 -> HarmonyOS应用/服务开发流程 1.2.1 -> 开发准备 1.2.2 -> 开发应用/服务 1.2.3 -> 运行、调试和测试应用/服务 1.2.4 -> 发布应用/服务 2 -> 工程介绍 2.1 -> APP包结构 2.2 -> 切换工程视图 …

2025网络安全工程师:软考新挑战与职业发展探析

网络安全工程师的崛起 随着信息技术的迅猛发展&#xff0c;网络安全问题日益凸显&#xff0c;网络安全工程师这一职业逐渐受到社会各界的广泛关注。特别是在2025年&#xff0c;随着各项网络安全法规的完善和实施&#xff0c;网络安全工程师的角色愈发重要。他们不仅是企业信息…

【SpringMVC】深入解析@ RequestMapping 注解的概念及使用和 MVC 介绍

Spring Web MVC入门 1. Spring Web MVC 什么是 Spring Web MVC&#xff1f; MVC官方文档介绍 Spring Web MVC是Spring框架中的一个用来做网站开发的部分&#xff0c;它是基于Servlet技术的。 虽然它的正式名字叫“Spring Web MVC”&#xff0c;但大家一般都简称它“SpringMVC”…

高效编程指南:PyCharm与DeepSeek的完美结合

DeepSeek接入Pycharm 前几天DeepSeek的充值窗口又悄悄的开放了&#xff0c;这也就意味着我们又可以丝滑的使用DeepSeek的API进行各种辅助性工作了。本文我们来聊聊如何在代码编辑器中使用DeepSeek自动生成代码。 注&#xff1a;本文适用于所有的JetBrains开发工具&#xff0c…

deepseek使用记录18——艺术的追问

一 好的&#xff0c;基于前面学习结果&#xff0c;再写一篇有艺术美的文章 《美的起义》 凌晨四点的茶摊在电子支付二维码下苏醒&#xff0c;蒸腾的水汽中浮动着八百年前建盏的釉色。老板娘把栀子花插在共享单车车筐里&#xff0c;花瓣的弧度与北宋汝窑青瓷的冰裂纹暗合&…

Docker参数,以及仓库搭建

一。Docker的构建参数 注释&#xff1a; 1.对于CMD&#xff0c;如果不想显示&#xff0c;而是使用交互界面&#xff1a;docker run -ti --rm --name test2 busybox:v5 sh 2.对于CMD&#xff0c;一个交互界面只可以使用一个&#xff0c;如果想多次使用CMD&#xff0c;则用ENTR…

并发编程——累加器

目录 1 AtomicLong 1.1 核心功能 1.2 实现原理&#xff1a; (1&#xff09;基于 Unsafe 的底层操作 (2) volatile字段的内存可见性 (3&#xff09;CAS 操作与 ABA 问题 1.3 性能分析 1.4 使用场景 2 LongAdder 核心设计原理 1 分段存储 2 分散更新策略 3.处理高竞…

10 【HarmonyOS NEXT】 仿uv-ui组件开发之Avatar头像组件开发教程(一)

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 目录 第一篇&#xff1a;Avatar 组件基础概念与设计1. 组件概述2. 接口设计2.1 形状类型定义2.2 尺寸类型定义2.3 组件属性接口 3. 设计原则4. 使用…

天津大学02-深度解读DeepSeek:部署、使用、安全【文末附下载链接】

大模型风险与不当用例——价值观错位 大模型与人类价值观、期望之间的不一致而导致的安全问题&#xff0c;包含&#xff1a;• 社会偏见&#xff08;Social Bias&#xff09;LLM在生成文本时强化对特定社会群体的刻板印象&#xff0c;例如将穆斯林与恐怖主义关联&#xff0c;或…

C#程序加密与解密Demo程序示例

目录 一、加密程序功能介绍 1、加密用途 2、功能 3、程序说明 4、加密过程 5、授权的注册文件保存方式 二、加密程序使用步骤 1、步骤一 ​编辑2、步骤二 3、步骤三 4、步骤四 三、核心代码说明 1、获取电脑CPU 信息 2、获取硬盘卷标号 3、机器码生成 3、 生成…

《Python实战进阶》No14: 使用Dask处理大规模数据集

文章特色&#xff1a; 包含3个核心代码块&#xff0c;覆盖延迟计算、分块策略和云原生集成4个架构图/监控面板示意图的占位说明对比表格清晰展示技术选型差异实战案例包含从数据读取到机器学习的完整流水线扩展思考部分引入最新云原生技术实践 Dask 是一个灵活的开源库&#…

React + React-intl @3.xx + TypeScript

声明&#xff1a;此篇文章使用的版本是 "react-intl": "^3.12.0"。 因为react-intl3.xx版本相较于react-intl2.xx版本差别较大&#xff0c;有些API是break change, 所以这篇文章的实现方式&#xff0c;不适用于react-intl2.xx版本。 一: 安装react-intl np…

TON基金会确认冠名赞助2025香港Web3嘉年华,并将于4月8日重磅呈现“TON生态日”

近日&#xff0c;由万向区块链实验室与HashKey Group联合推出的Web3年度盛典——2025香港Web3嘉年华正式宣布&#xff0c;TON基金会确认成为本届嘉年华的冠名赞助商&#xff0c;并将于4月8日在主会场特别举办“TON生态日”专题Side Event&#xff0c;集中展现TON生态的最新技术…