当前位置: 首页 > news >正文

Linux基础 -- NAND Flash UBIFS基础特性及注意点

一、NAND Flash 基础特性及注意点

1.1 NAND Flash 的结构

名称描述
页(Page)最小可写单元,常见大小 2K / 4K / 8K
块(Block)最小擦除单元,通常包含 64~128 页
Plane / Die多平面架构,提高并发访问效率

1.2 重要特性

  • 不可覆盖写(Out-of-place write):不能原地更新,只能写入空页;更新数据需要重写新页,并标记旧页为“无效”。
  • 坏块管理(Bad Block Management):NAND 出厂时和使用过程中可能存在坏块。驱动需跳过这些块,避免使用。
  • 擦除次数有限(Wear Leveling):NAND Flash 每块寿命通常在 10k~100k 次擦除,需均衡使用块。
  • 位翻转(Bitflip):需要 ECC(纠错码)机制检测和修复位错误。

二、UBI(Unsorted Block Images)概述

UBI 是为 大容量 NAND Flash 提供的一种擦除块管理机制,它工作在 MTD 原始设备与文件系统之间

2.1 UBI 的作用

  • 块映射(PEB ↔ LEB)
  • 坏块管理
  • 擦除均衡(wear leveling)
  • 空间回收(garbage collection)

2.2 关键术语

名称含义
MTDMemory Technology Device,裸设备接口,如 /dev/mtdX
PEBPhysical Erase Block,物理擦除块
LEBLogical Erase Block,逻辑擦除块
VID HeaderUBI 块的元信息,包含版本、校验、EC 等
EC Header擦除计数信息

2.3 使用注意事项

  • UBI 必须格式化原始 NAND Flash,通过 ubiformat
  • ubiattach 不会破坏数据,但必须配合 ubi.mtd=x 参数。
  • 最大 UBI 设备块数有限(默认 2048),可通过 CONFIG_MTD_UBI_BEB_LIMITCONFIG_MTD_UBI_MAX_VOLUMES 调整。

三、UBIFS(UBI File System)概述

3.1 UBIFS 是什么?

UBIFS 是专门为大容量 NAND Flash 设计的日志型文件系统,它 依赖于 UBI 层 提供的抽象。

3.2 特性优势

  • 支持压缩(LZO、ZLIB)
  • 日志结构(支持断电恢复)
  • 支持写缓存与回写机制
  • 动态 GC 与擦除均衡
  • CRC 校验保证数据完整性

3.3 UBIFS 的组件结构

+---------------------+
|     应用程序        |
+---------------------+
|       VFS           |
+---------------------+
|      UBIFS          |
+---------------------+
|        UBI          |
+---------------------+
|       MTD/NAND      |
+---------------------+

四、UBI & UBIFS 使用流程与工具

4.1 MTD 分区设置(如 in DTS)

partition@0 {label = "ubi";reg = <0x00000000 0x08000000>; // 128MB
};

4.2 工具链使用

ubiformat
  • 擦除并格式化 NAND 的某个 MTD 分区供 UBI 使用:
ubiformat /dev/mtdX -y -f rootfs.ubifs
ubiattach
  • 将某个 MTD 分区附加为 /dev/ubiX
ubiattach /dev/ubi_ctrl -m X
ubimkvol
  • 创建逻辑卷(volume):
ubimkvol /dev/ubi0 -N rootfs -s 60MiB
ubiupdatevol
  • 直接更新 volume 内容(适用于数据升级):
ubiupdatevol /dev/ubi0_0 rootfs.ubifs
mkfs.ubifs
  • 制作 UBIFS 镜像:
mkfs.ubifs -r rootfs_dir -m 4096 -e 258048 -c 2048 -o rootfs.ubifs

参数说明:

  • -m:最小 I/O 单元(来自 /sys/class/mtd/mtdX/writesize
  • -e:逻辑擦除块大小(来自 /sys/class/mtd/mtdX/erasesize 减去头部)
  • -c:最多 LEB 数量(不能超过分区块数)

五、启动参数与挂载方式

5.1 kernel cmdline 参数(例如)

ubi.mtd=ubi root=ubi0:rootfs rootfstype=ubifs

5.2 fstab 中设置挂载

/dev/ubi0_0  /  ubifs  defaults  0  1

六、NAND + UBI + UBIFS 使用的常见陷阱与建议

问题或陷阱建议解决方案
未使用 ubiformat 而直接 ubiattach 导致挂载失败或旧数据干扰一定要先使用 ubiformat 格式化
mkfs.ubifs 的 -m-e 参数不匹配/sys/class/mtd/mtdX/ 获取真实值
sync 非常慢这是 NAND+UBIFS 的特性,建议异步写加回写控制(如 mount -o sync 慎用)
volume 太多或太大合理设计 volume 数量,避免超过 UBI 的最大 LEB 限制
嵌入式系统需要容错和容灾建议使用双系统分区(A/B)、或 rootfs + overlayfs 实现热升级

七、对比其他 Flash 文件系统

文件系统适用介质压缩坏块管理挂载速度特点
JFFS2NOR / 小容量 NAND支持支持慢(全扫描)结构简单
UBIFS大容量 NAND支持依赖 UBI可写缓存
YAFFS2NAND支持中等实时性好
F2FSeMMC/UFS/SD支持控制器管理高性能日志型

八、结语与推荐

在嵌入式系统中,UBIFS + UBI + NAND 是当前主流的稳定解决方案,尤其适用于:

  • 128MB+ NAND Flash
  • 写入频繁、需要断电保护
  • 系统分区和数据分区需要擦除均衡管理
http://www.dtcms.com/a/266770.html

相关文章:

  • 【沉浸式解决问题】idea开发中mapper类中突然找不到对应实体类
  • 【Agent】构建专家级SQL Agent交互
  • Qt控件核心属性全解析
  • 【Bluedroid】 BLE 隐私保护机制深度剖析(btm_ble_reset_id)
  • [学习记录]Unity-Shader-曲面细分着色器
  • IDEA-常用的开发组件
  • 用户进程的借壳挂靠之术
  • JAVA-springboot 整合Redis
  • 大数据在UI前端的应用创新研究:基于图神经网络的用户关系网络分析
  • [C++] C++多重继承:深入解析复杂继承关系
  • Blob分析及形态学分析
  • AWS 中如何添加一个内部域名
  • Spring AI Alibaba 来啦!!!
  • 本地区块链服务在物联网中的应用实例
  • M30280F8HP#U5B 瑞萨16位工业MCU微控制器,CAN 2.0B+专用PWM,电机控制专家!
  • 使用mindie:2.0.RC2-800I-A2-py311-openeuler24.03-lts制作一个通用的模型推理性能测试的镜像
  • Flynn分类法知识点梳理
  • 微服务架构的演进:迈向云原生
  • 【Spring Boot】Druid 连接池 YAML 配置详解
  • 马尔可夫链:随机过程的记忆法则与演化密码
  • 在LinuxMint 22.1(Ubuntu24.04)上安装使用同花顺远航版
  • 力扣刷题记录【1】146.LRU缓存
  • 【机器人】复现 DOV-SG 机器人导航 | 动态开放词汇 | 3D 场景图
  • 设计模式-应用分层
  • 【狂飙AGI】第8课:AGI-行业大模型(系列2)
  • NumPy-核心函数np.dot()深入理解
  • 【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之高斯椭球的颜色表达
  • 鸿蒙开发BindSheet选择章节效果
  • 服务器间接口安全问题的全面分析
  • 数据集-目标检测系列- 卡车 数据集 truck >> DataBall