当前位置: 首页 > 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.lryc.cn/news/580181.html

相关文章:

  • Adobe Illustrator设置的颜色和显示的颜色不对应问题
  • 新手快速入门Luban+Unity使用
  • OneCode 智能化UI布局与定位:注解驱动的视觉编排艺术
  • 打通线上线下会议室联动的综合解决方案及技术选型
  • Echarts3D柱状图-圆柱体-文字在柱体上垂直显示的实现方法
  • D3 面试题100道之(21-40)
  • 如何查看自己电脑的CUDA版本?
  • 服务器间接口安全问题的全面分析
  • 学习者的Python项目灵感
  • 本地区块链服务在物联网中的应用实例
  • Rust+Blender:打造高性能游戏引擎
  • OneCode图生代码技术深度解析:从可视化设计到注解驱动实现的全链路架构
  • golang 中当 JSON 数据缺少结构体(struct)中定义的某些字段,会有异常吗
  • 【HDMI CEC】 设备 OSD 名称功能详解
  • Rust match 控制流结构
  • 从0开始学习R语言--Day38--辛普森多样性指数
  • 重学前端002 --响应式网页设计 CSS
  • 【网络安全基础】第三章---公钥密码和消息认证
  • <tauri><rust><GUI>使用tauri创建一个文件夹扫描程序
  • 【网络】Linux 内核优化实战 - net.core.flow_limit_table_len
  • C++26 下一代C++标准
  • 深度学习笔记29-RNN实现阿尔茨海默病诊断(Pytorch)
  • 倾斜摄影无人机飞行航线规划流程详解
  • 前端开发-前置知识
  • 2025.7.4总结
  • 物联网数据安全区块链服务
  • DeepSeek-R1知识蒸馏和微调实践(一)源码
  • 使用 C# 发送电子邮件(支持普通文本、HTML 和附件)
  • BEVFormer模型处理流程
  • 佰力博科技与您探讨表面电阻的测试方法及应用领域