🔨 整理中 · 这一篇讲嵌入式 rootfs——内核启动后挂载的根文件系统。素材从 ch04 + 本站 04 BusyBox rootfs 实战整理。本站用
scripts/rootfs-minimal-maker.sh手搓 BusyBox rootfs,这里对比嵌入式 rootfs 的几种构建方式:手搓 BusyBox(学习用)、Buildroot(小系统生产用)、Yocto(复杂产品级)。
做什么
内核启动后要挂一个根文件系统才能跑 init、起 shell、跑应用——这就是 rootfs。04 BusyBox rootfs 里我们手搓了一个:BusyBox(提供 shell + Unix 工具)+ 静态或动态 libc + 最小 /etc init 脚本,打包成 initramfs。这种手搓方式适合学习、适合超小系统,但真实嵌入式产品里 rootfs 要包含完整的应用、库、配置、固件、init 系统(systemd/BusyBox init),手动拼不现实——所以有 Buildroot(自动化构建整个嵌入式 Linux 系统)和 Yocto(更复杂、产品级的发行版构建器)。这一篇对比这几种方式。
要了解什么
一、initramfs vs 持久 rootfs
- initramfs(本站用的方式):rootfs 打包成
cpio.gz,内核启动时解到内存(RAM-based)——只读快照(改了重启丢)、占 RAM。适合学习、小系统、或"真正 rootfs 加载前的过渡"。 - 持久 rootfs:rootfs 是真实的块设备分区(ext4/squashfs),挂载、可写、持久。真实产品用这个——rootfs 在 flash/eMMC 上,改动持久保留。需要内核支持该文件系统 + 启动参数
root=/dev/mmcblk0p2指向它。
本站 initramfs 是学习选择;真实板子多走持久 rootfs(ext4 on eMMC,或 squashfs 只读 + overlayfs 可写层)。
二、BusyBox:rootfs 的"瑞士军刀"
BusyBox 把 shell(ash)、coreutils(ls/cat/cp/...)、util-linux(mount/umount/...)、init、udhcpc 等几十个 Unix 工具集成进一个二进制(用 applet 机制,符号链接),体积几 MB——是嵌入式 rootfs 的标配。本站 04 BusyBox rootfs 就是手搓这套:编 BusyBox + 最小 /etc/{inittab,init.d/rcS,profile,fstab} + 打包 cpio。学习 rootfs 内部结构用它最清楚。
三、Buildroot:自动化构建整套嵌入式系统
Buildroot 用一个 .config(类似内核 menuconfig)描述"目标系统长什么样"——选 CPU 架构、工具链、内核版本、BusyBox/系统库/应用、init 系统——make 后自动交叉编出全套:工具链、内核镜像、rootfs(各种格式 cpio/ext4/squashfs/ubi)、甚至 bootloader。它解决了"手搓 rootfs 拼不齐应用和库"的痛点,是小到中型嵌入式系统的首选。下一篇 06 Buildroot 专讲。
四、Yocto:产品级发行版构建器
Yocto/OpenEmbedded 更复杂——它不只是"构建一个 rootfs",而是一套完整的嵌入式 Linux 发行版构建框架:用 bitbake + recipe 描述每个组件,支持包管理(rpm/deb/ipk)、镜像变体、SDK 生成、长期维护、多板子 BSP 管理。学习曲线陡,但产品级嵌入式(手机/IoT/工业)多用它——可维护性、可定制性、商业支持都强。学习/小系统用 Buildroot 够,产品级多发行版变体选 Yocto。
五、选型
| 场景 | 选择 |
|---|---|
| 学习 rootfs 原理 | 手搓 BusyBox(本站 04) |
| 小系统、单一镜像 | Buildroot |
| 产品级、多变体、需包管理、长期维护 | Yocto |
| 仅启动一个简单应用 | initramfs + BusyBox(本站方式) |
动手试试
- 复习本站 04 BusyBox rootfs 的手搓流程,理解 rootfs 每个目录(
/bin//sbin//etc//lib)放什么 - 改
rootfs-minimal-maker.sh打包出一个持久 ext4 rootfs 镜像(不用 cpio initramfs),QEMU-drive挂载,验证改动持久 - 下载 Buildroot,
make qemu_aarch64_virt_defconfig && make,跑它生成的 rootfs(下一篇详讲) - 思考题:initramfs 和持久 rootfs 各适合什么场景?(提示:只读快照 vs 持久可写)
延伸阅读
- 关联本站:04 BusyBox rootfs 手搓、05 QEMU 启动 挂载 rootfs;下一篇 06 Buildroot 自动化构建;本站
scripts/rootfs-minimal-maker.sh。 - 外部:Buildroot、Yocto Project、BusyBox 项目。
- 读书笔记:ch04 讲 rootfs 与模块加载。