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

特性 | initramfs | jffs2 | yaffs2 | cramfs | squashfs | romfs |
|---|---|---|---|---|---|---|
读写支持 | 读写 | 读写 | 读写 | 只读 | 只读 | 只读 |
压缩支持 | 支持(gzip) | 实时压缩 | 不压缩 | 压缩 | 高压缩比 | 不压缩 |
掉电安全 | 否 | 是 | 是 | 不适用 | 不适用 | 不适用 |
内存需求 | 高(加载到RAM) | 中等 | 低 | 低 | 低 | 最低 |
NAND支持 | 一般 | 优秀 | 专为NAND | 一般 | 一般 | 一般 |
启动速度 | 中等 | 慢 | 中等 | 快 | 中等 | 最快 |
典型用途 | 临时根文件系统 | NOR/NAND闪存 | NAND闪存 | 只读设备 | CD/只读存储 | 最小系统 |
概念:启动时加载到内存中的临时根文件系统
启动流程示意图:
┌─────────┐ 加载 ┌─────────────┐ 切换 ┌─────────┐
│ Bootloader │───────▶│ initramfs │─────────▶│ 真实根 │
│ │ 到内存 │ (内存中) │ 到磁盘 │ 文件系统│
└─────────┘ └─────────────┘ └─────────┘特点:
适用场景:
概念:为NOR闪存设计的日志型文件系统
jffs2结构示意:
┌─────────────────────────────────┐
│ jffs2分区 │
├─────────┬─────────┬─────────┬───┤
│节点头 │ 数据段 │节点头 │...│
│(元数据) │ (实际数据)│(元数据)│ │
└─────────┴─────────┴─────────┴───┘
特点:磨损均衡、掉电安全、实时压缩优势:
局限:
适用场景:NOR闪存、需要频繁更新的嵌入式设备
概念:专为NAND闪存优化的文件系统
yaffs2 NAND块管理:
每个块(128KB) → 多个页(2KB) → OOB区域存储元数据
┌──────┬──────┬──────┬──────┐
│ Page │ Page │ Page │ ... │ ← 数据存储
├──────┴──────┴──────┴──────┤
│ OOB (Out-Of-Band)区域 │ ← 存储ECC、元数据等
└───────────────────────────┘独特优势:
适用场景:
概念:高度压缩的只读文件系统
cramfs压缩原理:
原始文件 → 分块压缩 → 压缩数据块
↓ ↓ ↓
┌─────────┐ ┌───────┐ ┌─────────┐
│ 文件A │ │块1 │ │压缩块1 │
│ 文件B │ │块2 │ │压缩块2 │
│ ... │ │... │ │... │
└─────────┘ └───────┘ └─────────┘特点:
适用场景:
概念:比cramfs更先进的压缩只读文件系统
squashfs vs cramfs对比:
┌──────────────┬──────────────┐
│ squashfs │ cramfs │
├──────────────┼──────────────┤
压缩算法 │ gzip/lzo/xz │ zlib │
最大文件 │ 16EB │ 16MB │
最大文件系统│ 16EB │ 256MB │
目录项压缩 │ 支持 │ 不支持 │
碎片处理 │ 优秀 │ 无 │
└──────────────┴──────────────┘优势:
适用场景:
概念:最简单的只读文件系统
romfs超简结构:
┌─────────────────┐
│ 超级块 │
├─────────────────┤
│ 目录项1 │
│ → 文件1信息 │
├─────────────────┤
│ 目录项2 │
│ → 文件2信息 │
├─────────────────┤
│ 文件1数据 │
├─────────────────┤
│ 文件2数据 │
└─────────────────┘
特点:零开销、线性结构特点:
适用场景:
推荐:squashfs(系统) + jffs2(配置区)
原因:
• 系统部分只读,用squashfs节省空间
• 配置需要频繁更新,用jffs2保证掉电安全推荐:cramfs或romfs
原因:
• 程序固化,不需要更新
• 可靠性要求高,只读系统更稳定
• 资源有限,需要最小开销推荐:yaffs2
原因:
• 使用NAND闪存
• 需要处理大量媒体文件
• 需要快速启动推荐:squashfs + overlayfs
原因:
• 基础系统只读,保证稳定性
• 通过overlayfs支持配置更新
• 节省Flash空间启动流程示例:
┌───────┐ ┌───────┐ ┌─────────┐ ┌──────┐
│Boot │→│initramfs│→│切换到 │→│应用 │
│Loader │ │(内存中)│ │squashfs │ │启动 │
└───────┘ └───────┘ └─────────┘ └──────┘启动时间对比:
romfs < cramfs < squashfs < yaffs2 < initramfs < jffs2
压缩率对比:
squashfs > cramfs > jffs2 > yaffs2 > romfs = initramfs(依赖配置)
内存占用对比:
initramfs > jffs2 > yaffs2 > squashfs > cramfs > romfs
适用闪存类型:
• NOR专用: jffs2
• NAND专用: yaffs2
• 通用: 其他每种文件系统都有其设计哲学和适用场景,理解其底层原理和限制,才能为特定应用选择最合适的解决方案。在实际项目中,经常需要根据具体的硬件约束、性能要求和功能需求进行权衡选择。