🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习 🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发 ❄️作者主页:一个平凡而乐于分享的小比特的个人主页 ✨收录专栏:操作系统,本专栏为讲解各操作系统的历史脉络,以及各性能对比,以及内部工作机制,方便开发选择 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

比喻理解:
BusyBox ≈ 瑞士军刀(多功能工具集)
文件系统 ≈ 工具箱(存放和使用工具的地方)
┌─────────────────────────────────────────────────┐
│ 完整的嵌入式Linux系统 │
├──────────────┬──────────────────────────────────┤
│ 内核层 │ 根文件系统层 │
│ ├──────────────────────────────────┤
│ Linux Kernel │ initramfs / jffs2 / ubifs / ... │
│ │ ↓ │
│ │ /bin /sbin /usr /etc ... │
│ │ ↓ │
│ │ ┌────────────┐ │
│ │ │ BusyBox │←── 关键组件! │
│ │ │ (工具箱) │ │
│ │ └────────────┘ │
└──────────────┴──────────────────────────────────┘传统Unix系统 vs BusyBox嵌入式系统:
传统Unix: BusyBox:
/bin/ls ┌─────────────────────┐
/bin/cp │ busybox │
/bin/mkdir ├─────────────────────┤
/bin/rm │ 符号链接: │
... 上百个单独命令 │ ls → busybox │
│ cp → busybox │
│ mkdir → busybox │
│ rm → busybox │
│ ... 所有命令共用 │
│ 同一个二进制文件 │
└─────────────────────┘
优势:体积小、节省空间、高度集成工具类别 | 示例命令 | 在嵌入式中的作用 |
|---|---|---|
核心工具 | init, sh, ash | 系统启动、shell环境 |
文件操作 | ls, cp, mv, rm | 基本文件管理 |
文本处理 | grep, sed, awk | 配置处理、日志分析 |
网络工具 | ping, ifconfig, telnetd | 网络连接与调试 |
系统管理 | mount, ps, kill | 系统监控与控制 |
工具链 | gzip, tar, vi | 压缩、打包、编辑 |
典型嵌入式根文件系统结构:
/
├── bin/ ← BusyBox主程序在这里!
│ ├── busybox (实际的BusyBox二进制文件)
│ ├── sh → busybox (符号链接)
│ ├── ls → busybox (符号链接)
│ └── ... 更多链接
├── sbin/
│ ├── init → ../bin/busybox
│ ├── ifconfig → ../bin/busybox
│ └── ...
├── etc/
│ ├── init.d/ (启动脚本)
│ ├── inittab (BusyBox init配置)
│ └── ...
└── lib/ (动态库,可选)文件系统 | BusyBox存储特点 | 配置注意事项 |
|---|---|---|
initramfs | 完全在内存中 | 可以精简,快速启动优先 |
jffs2 | 存储在闪存,运行时加载 | 考虑磨损均衡,可完整配置 |
yaffs2 | NAND闪存存储 | 优化NAND访问模式 |
cramfs | 高度压缩只读 | 需要静态编译BusyBox |
squashfs | 压缩只读,高效 | 适合完整功能集 |
romfs | 最简单只读 | 必须静态编译,功能最简 |
ubifs | 大容量闪存 | 可配置完整功能+动态库 |
文件系统:cramfs 或 romfs
BusyBox配置:静态编译,仅核心功能
体积:~500KB
包含命令:init, sh, mount, ls, cat, echo
优点:极简、启动快、占用资源少文件系统:squashfs(系统) + jffs2(配置)
BusyBox配置:动态链接,中等功能集
体积:~2MB
包含命令:完整shell、网络工具、文件操作
优点:平衡体积与功能,支持配置更新文件系统:ubifs
BusyBox配置:完整功能+自定义applets
体积:~5MB
包含命令:所有工具+自定义命令
优点:功能全面,适合复杂应用文件系统:initramfs
BusyBox配置:救援专用功能集
体积:~8MB(可接受,在内存中)
包含命令:网络、磁盘、修复工具
优点:独立运行,无需底层系统# 下载和解压
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar xjf busybox-1.36.1.tar.bz2
cd busybox-1.36.1
# 配置(菜单界面选择需要的功能)
make menuconfig
# 重要配置选项:
# Settings → Build Options →
# [*] Build static binary (no shared libs) # cramfs/romfs需要
# [ ] Build shared libbusybox # 动态链接可选
# [*] Build with Large File Support # 大文件支持
# 编译
make -j4
make install# 创建基本目录
mkdir -p rootfs/{bin,sbin,etc,proc,sys,dev,lib,usr,home}
# 复制BusyBox
cp -a busybox-1.36.1/_install/* rootfs/
# 创建符号链接
cd rootfs/bin
ln -s busybox sh
ln -s busybox ls
ln -s busybox cat
# ... 创建所有需要的链接# 创建inittab(BusyBox init配置文件)
cat > rootfs/etc/inittab << EOF
::sysinit:/etc/init.d/rcS
::respawn:/sbin/getty -L ttyAMA0 115200 vt100
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
EOF
# 创建启动脚本
mkdir -p rootfs/etc/init.d
cat > rootfs/etc/init.d/rcS << EOF
#!/bin/sh
# 挂载虚拟文件系统
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs devtmpfs /dev
# 设置主机名
hostname embedded-system
# 创建必要的设备节点
mknod /dev/console c 5 1
EOF
chmod +x rootfs/etc/init.d/rcS# 1. 制作cramfs
mkcramfs rootfs rootfs.cramfs
# 2. 制作squashfs
mksquashfs rootfs rootfs.squashfs -comp xz
# 3. 制作jffs2(需要知道闪存参数)
mkfs.jffs2 -r rootfs -o rootfs.jffs2 -e 0x20000 -s 0x800
# 4. 制作ubifs(通过UBI层)
mkfs.ubifs -r rootfs -m 2048 -e 124KiB -c 1000 -o rootfs.ubifs┌─────────┐ 加载内核 ┌──────────────┐ 挂载根文件系统 ┌─────────────┐
│Bootloader│───────────▶│ Linux Kernel │───────────────▶│ 根文件系统 │
└─────────┘ └──────────────┘ │ (jffs2/ubifs)│
└──────┬───────┘
│找到并执行init
┌──────▼───────┐
│ /sbin/init │
│ (BusyBox符号链接)│
└──────┬───────┘
│读取配置
┌──────▼───────┐
│ /etc/inittab │
│ (BusyBox格式)│
└──────┬───────┘
│启动服务
┌──────▼───────┐
│ BusyBox工具 │
│ shell、服务等 │
└──────────────┘BusyBox init启动过程:
开始
↓
解析/etc/inittab
↓
执行sysinit操作
↓
┌──────────────┐
│启动shell/登录│
│或运行指定服务│
└──────┬───────┘
↓
等待事件/命令
↓
处理信号/重启文件系统 | BusyBox编译建议 | 理由 |
|---|---|---|
cramfs/romfs | 静态编译,精简功能 | 只读,无法加载动态库 |
initramfs | 静态编译,救援功能 | 内存中运行,需要独立 |
jffs2/yaffs2 | 动态编译,中等功能 | 可写,支持动态库更新 |
ubifs | 动态编译,完整功能 | 大容量,性能要求高 |
启动时间分解示例(假设100MB根文件系统):
方案A:jffs2 + 动态BusyBox
1. 挂载jffs2: 2.5秒(扫描时间长)
2. 加载动态库: 0.3秒
3. BusyBox init: 0.1秒
总时间: ~2.9秒
方案B:ubifs + 静态BusyBox
1. 挂载ubifs: 0.5秒(快速挂载)
2. 加载动态库: 0秒(静态)
3. BusyBox init: 0.1秒
总时间: ~0.6秒
结论:文件系统选择对启动时间影响巨大!存储占用对比(相同功能集):
┌──────────────────┬────────────┬────────────┐
│ 方案 │ BusyBox大小 │ 总系统大小 │
├──────────────────┼────────────┼────────────┤
│ cramfs + 静态 │ 1.2MB │ 8MB │
│ squashfs + 动态 │ 800KB + │ 10MB │
│ │ 库文件 │ │
│ jffs2 + 完整动态 │ 600KB + │ 15MB │
│ │ 完整库 │ │
└──────────────────┴────────────┴────────────┘
选择策略:空间紧张选cramfs+静态,功能需要选动态可能原因:inittab格式错误
解决方案:
# 检查inittab格式
cat /etc/inittab
# 正确格式示例:
::sysinit:/etc/init.d/rcS
::respawn:/bin/sh
::ctrlaltdel:/sbin/reboot现象:bash: ls: command not found
原因:BusyBox符号链接未创建
解决:
# 进入根文件系统
cd /bin
# 创建链接
ln -sf busybox ls
ln -sf busybox cp
# 或使用BusyBox安装脚本
busybox --install -s现象:修改配置重启后丢失
原因:使用cramfs/romfs等只读文件系统
解决方案:
# 方案A:使用overlayfs叠加可写层
mount -t overlay overlay -o lowerdir=/,upperdir=/tmp/overlay,workdir=/tmp/work /mnt
# 方案B:使用可写文件系统(jffs2/ubifs)存储配置现象:系统启动后内存耗尽
诊断:查看BusyBox大小
ls -lh /bin/busybox
解决:
# 重新编译BusyBox,精简功能
make menuconfig
# 禁用不需要的applets
# 使用静态编译减少依赖initramfs中的BusyBox作为"急救员":
职责:
• 加载必要的硬件驱动
• 挂载真正的根文件系统
• 执行系统修复操作
• 提供紧急shell环境
配置特点:
• 静态编译,独立运行
• 包含磁盘工具(fdisk, fsck)
• 包含网络工具(用于网络启动)cramfs/squashfs + BusyBox的写操作问题:
┌─────────────────────────────────────┐
│ 只读根文件系统 │
│ / (cramfs) │
│ ├── bin/busybox (只读) │
│ ├── etc/ (只读) │
│ └── ... │
├─────────────────────────────────────┤
│ 可写overlay层 │
│ /tmp/overlay │
│ ├── etc/passwd (修改后的) │
│ └── var/log/ (日志文件) │
└─────────────────────────────────────┘
BusyBox配置:
• 日志写到/tmp或/var(指向可写分区)
• 配置文件通过overlayfs修改ubifs大容量方案:
/ (ubifs, 可读写)
├── busybox完整部署
├── 用户应用程序
├── 配置文件(直接可写)
├── 日志系统
└── 软件更新区域
优势:
• 无需overlayfs等复杂方案
• 直接修改所有文件
• 适合复杂应用场景你的需求 | 推荐文件系统 | BusyBox配置 | 理由 |
|---|---|---|---|
最小体积 | cramfs/romfs | 静态编译,核心功能 | 极致压缩,只读 |
快速启动 | ubifs + initramfs | 静态编译,精简 | ubifs挂载快,initramfs内存运行 |
频繁更新 | jffs2/yaffs2 | 动态编译,中等功能 | 支持擦写,磨损均衡 |
大容量复杂 | ubifs | 动态编译,完整功能 | 性能好,支持大容量 |
恢复系统 | initramfs | 静态编译,救援功能集 | 独立运行,无需存储 |
低成本 | jffs2 + squashfs | 动态编译,分区域配置 | jffs2便宜,squashfs节省空间 |
功能丰富度
↑
ubifs+完整BusyBox
|
jffs2+中等 ──┼── squashfs+核心
|
cramfs+最小
↓
成本/体积
实际选择:根据项目在三角形中找平衡点核心观点:
黄金组合推荐:
记住这个比喻:
文件系统是土地,BusyBox是建筑工具包,你的应用是建筑物。
无论什么土地,BusyBox都是你的多功能工具箱!
这种共生关系使得嵌入式Linux系统既能保持小巧高效,又能提供丰富的功能,正是这种灵活性让嵌入式Linux在各个领域大放异彩。