2026年正点原子开发板移植方案——从0开始的Rootfs之路1——移植Rootfs 概述PS有朋友问笔者为啥不是Buildroot一方面Buildroot太大听说Yocto更加抽象但是可惜笔者没试过对初学者虽然是一键点点点的事情但是出问题了会有点难排查另一方面把细节全藏起来了。藏起来了还要找我有点懒逃。RK系列可能要很久之后笔者会单独聊聊buildroot做一个专门的集合教程仓库已经开源可以研究补丁和直接看完整教程https://github.com/Awesome-Embedded-Learning-Studio/imx-forge有任何意见欢迎提出 PR会第一时间留意的为什么要写这篇文章当我们谈论嵌入式 Linux 启动流程时大家通常会关注 U-Boot、内核、设备树这些高大上的组件。但很多人包括我自己刚开始的时候往往会忽略一个同样关键的部分——Rootfs。我第一次接触 Rootfs 的时候心里充满了疑问内核不是已经编译好了吗不是已经能跑起来了吗为什么还需要一个 Rootfs它到底放什么东西为什么网上的教程有的用 BusyBox有的用 Buildroot还有的直接上 Debian这些问题当时困扰了我好几天。后来我才发现Rootfs 才是 Linux 系统的最后一公里。内核负责驱动硬件、管理进程、调度资源但用户空间的程序、脚本、配置文件——这些才是我们真正和系统交互的方式。没有 Rootfs内核就像一辆没有方向盘的车能跑但不知道往哪跑。更糟糕的是网上的 Rootfs 教程要么太简单只告诉你复制这些文件进去就行要么太复杂一上来就讲 Buildroot 的 100 个配置选项。新手很容易迷失在各种方案之间不知道该选哪一个。所以这篇文章我想从最基础的概念讲起什么是 Rootfs为什么需要它有哪些常见的方案以及为什么我们选择 BusyBox 作为入门方案。当你理解了这些后面的编译配置就会变得顺理成章。Rootfs 到底是什么如果你在 Linux 终端输入ls /你会看到类似这样的输出$ls/ bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var这些目录大部分就构成了 Rootfs。它是 Linux 系统启动后挂载的第一个文件系统是所有用户空间程序的根。内核和 Rootfs 的关系你可能会有一个疑问内核启动的时候Rootfs 还没挂载那内核是怎么找到并挂载它的呢答案就在 U-Boot 的 bootargs 环境变量里。你可能见过类似这样的配置setenv bootargsconsolettymxc0,115200 root/dev/nfs rw nfsroot192.168.1.100:/path/to/rootfs,tcp,v3 ipdhcp这里的root/dev/nfs就是在告诉内核你的根文件系统在 NFS 上。内核启动完成后会根据这个参数去挂载对应的 Rootfs。所以整个启动链条是这样的ROM Code → U-Boot → Linux Kernel → 挂载 Rootfs → 运行 init 程序 → 启动用户空间内核的职责是把车开到目的地挂载 Rootfs而 Rootfs 的职责是提供驾驶室和控制装置shell、命令、配置、服务。为什么不能没有 Rootfs理论上你可以把所有用户程序都编译进内核作为 initramfs但这不是个好主意。原因如下体积问题一个完整的 Rootfs 可能有几十 MB 甚至几百 MB全部塞进内核镜像会让内核变得臃肿不堪。灵活性差每次修改配置、添加程序都要重新编译内核开发效率极低。不符合设计原则内核和用户空间本就应该分离这是 Linux 设计的基本原则。所以即使是最简单的嵌入式系统也需要一个独立的 Rootfs。Rootfs 方案大比拼谁才是你的菜当你决定要制作 Rootfs 时会发现自己面临着很多选择。让我来帮你分析一下常见方案的优缺点。BusyBox瑞士军刀小巧精悍优点体积小一个二进制文件包含几百个常用命令最终产物可能只有 1-2 MB编译简单配置项相对较少新手容易上手可控性强你完全知道里面放了什么资源占用低内存和 CPU 占用都很小缺点功能有限很多高级功能需要额外配置软件包少没有包管理器添加软件需要手动编译适合场景资源受限的嵌入式设备、学习理解 Linux 基本原理Buildroot全家桶一站式解决方案优点自动化程度高自动下载、交叉编译、打包所有依赖软件包丰富支持 2000 软件包包含常用的工具和库灵活配置通过 menuconfig 选择需要的组件成熟稳定广泛用于商业产品缺点编译时间长首次编译可能需要几小时我靠我有的说之前玩RK家的板子一次编译我等了10来个小时学习曲线陡峭配置项繁多新手容易迷失体积较大完整编译可能上 GB适合场景需要多种软件包的复杂嵌入式系统Debian/Raspbian完整发行版开箱即用优点软件包最丰富apt-get install 想装什么装什么文档完善遇到问题容易找到解决方案开发效率高不需要自己编译常见软件更新及时安全补丁和软件更新较快缺点体积庞大最小安装也要几百 MB资源占用高后台服务多不适合资源受限设备启动较慢systemd 等初始化系统比较重适合场景树莓派等资源充足的单板机、快速原型开发Yocto/OpenEmbedded企业级定制专业但复杂优点高度可定制可以精确控制每一个组件企业级支持适合大规模生产分层设计便于维护和复用许可证管理适合商业产品合规需求缺点学习曲线极陡峭文档写得像学术论文编译环境复杂需要大量依赖和配置编译时间极长完整编译可能需要一天适合场景大规模商业产品、需要严格定制和许可证管理为什么选择 BusyBox 作为入门方案看到这里你可能会问既然 Buildroot 功能更强大Debian 更方便为什么我们还要学 BusyBox 呢我的回答是万丈高楼平地起先把基础打扎实。BusyBox 是理解 Linux 系统运作原理的最佳起点。它让你能够理解 Linux 的基本构成你会亲手创建每一个目录、编写每一个配置文件深刻理解它们的作用。掌握交叉编译的基本流程BusyBox 的编译过程是嵌入式开发的经典案例学会它其他软件的编译也就触类旁通。建立问题排查能力当你从零开始构建系统遇到问题时你会知道去哪里找线索而不是只会重启试试。为进阶学习铺路理解了 BusyBox再学 Buildroot 时你就知道它在做什么而不再是黑盒操作。此外BusyBox 本身也很实用。很多商业产品的 Rootfs 就是基于 BusyBox 构建的——它够小、够快、够稳定。嘿嘿你猜猜Ubuntu启动失败了进的哪就是busybox啦Rootfs 目录结构速览标准 Linux Rootfs 的目录结构遵循 FHSFilesystem Hierarchy Standard规范。让我们快速浏览一下最重要的几个目录目录作用典型内容/bin基本用户命令ls, cat, cp, mv, sh 等/sbin系统管理命令ifconfig, reboot, init 等/etc配置文件inittab, fstab, passwd, init.d/ 等/lib共享库libc.so, ld-*.so 等/dev设备文件console, null, tty*, mmcblk* 等/proc虚拟文件系统进程信息/proc/cpuinfo, /proc/meminfo 等/sys虚拟文件系统硬件信息/sys/class/, /sys/devices/ 等/tmp临时文件运行时生成的临时数据/var可变数据log, lock, run 等子目录/usr用户程序和数据/usr/bin, /usr/lib, /usr/share 等/home用户主目录普通用户的文件和数据/rootroot 用户主目录管理员的个人文件对于最小化的 BusyBox Rootfs我们只需要其中的一部分必需的/bin、/sbin、/etc、/lib、/dev、/proc、/sys推荐的/tmp、/usr至少/usr/lib可选的/home、/var根据需求IMX-Forge 项目的 Rootfs 策略在 IMX-Forge 项目中我们采用渐进式的 Rootfs 构建策略第一阶段BusyBox 基础系统使用 BusyBox 构建最小可启动系统理解基本原理。第二阶段目录结构完善手动创建完整目录结构添加必要的配置和脚本。第三阶段网络和存储添加网络支持、存储挂载等功能。第四阶段应用程序集成交叉编译并添加自定义应用程序。当前项目中的 Rootfs 位于rootfs/nfs/目录结构如下rootfs/nfs/ ├── bin/# BusyBox 及其符号链接├── etc/# 配置文件│ ├── fstab# 文件系统挂载表│ ├── inittab# init 配置文件│ └── init.d/# 启动脚本│ └── rcS# 系统初始化脚本├── lib/# 共享库├── usr/ │ └── lib/# 额外的库文件└── home/# 用户程序如 hello 示例这个结构虽然是精简的但已经包含了 Linux 系统最核心的部分足以支持基本的开发和调试。写在最后Rootfs 是嵌入式 Linux 系统不可或缺的一部分但往往被初学者忽视。通过这篇文章我希望你能够理解Rootfs 是什么为什么需要它内核和 Rootfs 是如何协作的各种 Rootfs 方案的优缺点为什么 BusyBox 是学习的最佳起点在下一篇文章中我们将动手编译 BusyBox。你会看到BusyBox 的瑞士军刀设计是怎样的如何配置和交叉编译 BusyBoxARM 架构有哪些特殊注意事项如何将编译好的 BusyBox 安装到 Rootfs准备好了吗我们开始动手吧