惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
GbyAI
GbyAI
D
Docker
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
H
Hackread – Cybersecurity News, Data Breaches, AI and More
大猫的无限游戏
大猫的无限游戏
WordPress大学
WordPress大学
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Simon Willison's Weblog
Simon Willison's Weblog
F
Fortinet All Blogs
美团技术团队
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
CERT Recently Published Vulnerability Notes
V
Vulnerabilities – Threatpost
Google DeepMind News
Google DeepMind News
云风的 BLOG
云风的 BLOG
PCI Perspectives
PCI Perspectives
P
Privacy & Cybersecurity Law Blog
V2EX - 技术
V2EX - 技术
博客园 - Franky
Forbes - Security
Forbes - Security
P
Privacy International News Feed
罗磊的独立博客
博客园 - 聂微东
V
Visual Studio Blog
V
V2EX
aimingoo的专栏
aimingoo的专栏
宝玉的分享
宝玉的分享
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
A
About on SuperTechFans
S
Securelist
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 叶小钗
小众软件
小众软件
T
Tenable Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
B
Blog RSS Feed
M
MIT News - Artificial intelligence
L
LangChain Blog
N
Netflix TechBlog - Medium
S
Security Affairs
H
Heimdal Security Blog
H
Help Net Security
A
Arctic Wolf
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
月光博客
月光博客
C
Cisco Blogs
Martin Fowler
Martin Fowler

博客园 - 邗影

关于音频PA结构腔体 球面渲染 关于linux和shi脚本常用的通配符 关于fread读不满一块和读不满count的返回值 如何去掉merge DTSI 多个模块共用同一个 GPIO 引脚冲突 问题汇总 debug比release程序启动的快 关于CPU占用优先级的调整 关于蜂鸣器发声 麦序与声源定位 关于squashfs压缩挂载 软连接生成 线程退出未定义行为 linux文件查找 C语言弱函数 数据传输报错port unreachable D3D11绘制三角形 关于延迟测试 v4l2检测 关于数据库的性能 流媒体小记包含一些面试问题 v4l2视频采集 流媒体ZLM配置vscode远程开发 关于SPS中的帧率问题 Linux编译问题 SSl冲突问题 D3D初始化窗口显示 关于线程池
UBI的覆盖写和擦除
邗影 · 2026-05-20 · via 博客园 - 邗影

首先UBI的擦除并不需要“使用多少,清0多少”,只要破坏这个分区块的头部记录即可;

一、核心命令行工具概览

UBI提供了一系列用户空间工具(通常包含在 mtd-utilsubi-utils 软件包中),用于执行卷的创建、删除、更新等操作。与覆盖和清除相关的核心命令如下表所示:

命令主要功能对应操作类型
ubiupdatevol 更新(覆盖)UBI卷的内容 数据覆盖
ubirmvol 删除(清除)指定的UBI卷 卷清除
ubimkvol 创建新的UBI卷 卷创建(为覆盖做准备)

二、数据覆盖命令:ubiupdatevol

ubiupdatevol 是用于更新(即覆盖)UBI卷内容的核心命令。它可以将文件、数据流或全零写入指定的UBI卷,实现卷内容的完全替换。

2.1 命令语法与关键参数

ubiupdatevol [options] <UBI volume node> [<input file>]

常用参数解析:

参数说明
-t, --truncate 截断卷。将卷大小设置为0,即清空卷内所有数据(逻辑清除)。
-s <bytes>, --size=<bytes> 指定要写入的数据大小。如果输入文件小于卷大小,未指定部分将保持原内容不变(部分覆盖)。常与 -t 联用实现精确写入。
<UBI volume node> 目标UBI卷的设备节点,格式为 /dev/ubiX_Y (X为设备号,Y为卷号) 或 ubiX:Y
<input file> 输入文件。如果省略或为 -,则从标准输入读取数据。

2.2 典型使用场景与代码示例

场景1:用文件完全覆盖一个UBI卷

这是最常见的用法,用于更新卷内的固件、配置文件或Logo等。

Bash

 

此命令会用量为 new_kernel.bin 文件的大小覆盖卷的起始部分。如果文件小于卷容量,剩余空间保留原数据。

# 示例:将新的内核镜像 `new_kernel.bin` 写入 UBI设备0上的卷1
ubiupdatevol /dev/ubi0_1 new_kernel.bin
# 基本语法:ubiupdatevol <目标UBI卷设备节点> <镜像文件>
sudo ubiupdatevol /dev/ubi0_1 rootfs.squashfs

场景2:清空UBI卷(逻辑清除)

使用 -t 参数可以快速将卷大小截断为0,实现逻辑上的清除。这对于需要重置卷状态或准备接收新数据流非常有用。

# 示例:清空 UBI设备0上的卷2
ubiupdatevol -t /dev/ubi0_2

注释:该操作并非物理擦除Flash块,而是更新UBI内部元数据,将卷标记为空。后续写入操作将从逻辑起始地址开始。

场景3:从标准输入流写入数据

适用于通过管道接收数据并直接写入UBI卷的场景,例如在OTA升级中解压后直接写入。

# 示例:解压一个归档文件并将其内容直接写入UBI卷
tar -xOzf rootfs.tar.gz | ubiupdatevol /dev/ubi0_0 -s $(tar -tzf rootfs.tar.gz | wc -c)

注释:通过 -s 指定精确的数据大小,确保写入操作正确完成。

场景4:填充卷为全零(物理覆盖)

有时为了安全或调试,需要将整个卷用特定数据填充。

# 示例:使用全零填充整个UBI设备0上的卷1
dd if=/dev/zero bs=1K count=<volume_size_in_KB> | ubiupdatevol /dev/ubi0_1 -
# 或者使用 `truncate` 创建全零文件后再写入
truncate -s <volume_size> zero.bin
ubiupdatevol /dev/ubi0_1 zero.bin

三、卷清除命令:ubirmvol

ubirmvol 命令用于从UBI设备上永久删除一个逻辑卷。这是一种更彻底的“清除”,卷被删除后,其占用的物理擦除块(PEB)将被释放回UBI设备池,可用于创建新卷。

3.1 命令语法与参数

ubirmvol [options] <UBI device node> -n <volume ID>

常用参数解析:

参数说明
-n <ID>, --name=<ID> 指定要删除的卷的ID(卷编号)。卷ID可通过 ubinfo /dev/ubiX 命令查看。
<UBI device node> UBI设备节点,格式为 /dev/ubiX

3.2 使用示例与注意事项

# 1. 首先,查看UBI设备上的卷信息,确认要删除的卷ID
ubinfo /dev/ubi0

# 输出示例:
# Present UBI devices: ubi0
# ubi0
# Volumes count:                           2
# Logical eraseblock size:                 126976 bytes, 124.0 KiB
# ...
# Volume ID:   0 (on ubi0)
# Type:        dynamic
# Alignment:   1
# Size:        100 LEBs, 12697600 bytes, 12.1 MiB
# Name:        boot
# ...
# Volume ID:   1 (on ubi0)
# Name:        rootfs
# ...

# 2. 删除卷ID为1的卷(例如名为rootfs的卷)
ubirmvol /dev/ubi0 -n 1

重要提示:

  • 卷删除操作是不可逆的,该卷上的所有数据将丢失。

  • 确保没有进程正在访问或挂载该卷,否则删除操作会失败。

  • 删除卷后,其逻辑空间被释放,但底层Flash的物理擦除操作由UBI子系统在后台的损耗均衡和垃圾回收过程中异步完成。

四、综合应用场景与对比

为了更清晰地理解何时使用覆盖 (ubiupdatevol) 和何时使用清除 (ubirmvol),可以参考下表:

操作需求推荐命令说明与示例
更新卷内容 ubiupdatevol 系统升级时更新rootfs:ubiupdatevol /dev/ubi0_0 new_rootfs.ubifs
清空卷数据 ubiupdatevol -t 快速重置一个配置卷:ubiupdatevol -t /dev/ubi0_2
彻底删除卷 ubirmvol 移除一个不再需要的旧日志卷:ubirmvol /dev/ubi0 -n 3
安全擦除 ubiupdatevol + dd 用随机数据覆盖整个卷后再删除,增强安全性:`dd if=/dev/urandom bs=1M count=X

高级场景:OTA升级中的组合使用
在嵌入式系统OTA升级中,常结合使用这些命令:

  1. 准备阶段:可能使用 ubirmvol 删除旧的备份卷。

  2. 更新阶段:使用 ubiupdatevol 将新固件写入目标卷。

  3. 回滚准备:在更新主卷前,先用 ubiupdatevol 将当前运行系统备份到另一个卷。

# 假设 ubi0_0 是主系统卷,ubi0_1 是备份卷
# 1. 将当前运行系统备份到备份卷 (假设已通过其他方式生成镜像)
# 2. 更新主系统卷
ubiupdatevol /dev/ubi0_0 new_firmware.bin
# 3. 如果更新失败,从备份卷恢复
# ubiupdatevol /dev/ubi0_0 backup_firmware.bin

五、底层原理与注意事项

  1. 磨损均衡:无论是 ubiupdatevol 的写入还是 ubirmvol 删除后的空间回收,UBI都会在底层执行磨损均衡操作,将数据迁移到擦除次数较少的物理块上,从而延长Flash寿命。

  2. 坏块管理:这些命令在执行时,UBI会自动避开坏块,用户无需关心物理坏块的存在。

  3. 原子性操作:ubiupdatevol 的写入操作是原子的。如果更新过程意外中断(如断电),卷将包含完整的旧数据或完整的新数据,不会处于损坏的中间状态。

  4. 空间预留:UBI卷在创建时通常会预留少量空间(由 -b 参数在 ubiattach 时设置)用于坏块替换和损耗均衡。因此,卷的可用逻辑大小会略小于物理MTD分区的大小。

  5. 性能考虑:频繁地对整个UBI卷进行 ubiupdatevol 覆盖操作会产生大量的Flash擦写,可能影响寿命。在设计系统时,应考虑增量更新或日志结构化文件系统(如UBIFS)来管理频繁变化的数据。