Linux mtd与ubi关系详解,ubi使用命令总结

首先贴上ubi的一个网站,上面对ubi 文件系统由很详细的说明:

http://www.linux-mtd.infradead.org/faq/ubifs.html#L_empty_file

整理一下mtd和ubi的关系,出自其他博客:

https://blog.csdn.net/faithsws/article/details/5381424

初识ubifs,相信大家都是从uibfs的操作工具来开始的。通过ubifs的工具可以attach/detach mtd,create/destroy ubi_volume, resize/rename ubi_volume, read/write ubi_volume。在操作的过程中,我的第一个疑问是:
在mtd设备上存在着partition,在ubi上存在volume,他们之间什么关系,同时也存在着两个概念mtd device,ubi device,他们之间的区别和联系又是什么?
对这个问题的解答,我并没有从网络获得明确的答案。所以我转到对内核的解析上。对于第二个提问,我在内核(2.6.29)中的ubifs.txt上,有了一个大致概念。先说这个,mtd device 代表着物理设备,这个物理设备上存在着许多物理块(nand),这些块大部分是好的,也有少数是坏块,所以mtd device 代表着所有的好块和坏块。对这些mtd device,内核提供了读写等操作。
Ubi device 代表着物理介质上的逻辑设备。跟mtd device一样,也有读写等操作接口。可是这个设备在用户看来是没有坏块的,ubi device 负责了坏块的管理,并且对物理块进行了新的组织,即使在用户层看来这是一个串行的读写设备,但是在ubi device中,却是进行了新的映射。这种映射目的在于负载的均衡。
再说第一个提问。首先是对mtd 部分的解析。以下是结果。
Mtd 在初始化时,会将同一类型的flash划分成一个mtd device。这个device的大小等于所以芯片容量的总和。这个过程完成后,就会从内核启动参数或者默认的分区表中获得分区信息。最后,将每个分区作为,一个mtd device添加到mtd_tables中。
我们在cat /proc/mtd时,就是返回的mtd_table中的信息。
下图指示了整个流程。

这里有一点重要的是:在parse_mtd_partition的cmdline中一个关键点是需要mtd->name = mtd->id,否则parse将返回错误结果。这是在开发驱动的时候,应该了解的。
另外一个重要结构是:mtd_table。其中保存了所有的mtd device的信息。
至此我们知道了mtd 上的partition 最终被作为mtd device保存到了mtd_table中了。
继续,ubifs的部分。
这个部分我只能写一下流程了,画图更能说明问题。

从中我们可以看出,最后每个ubi volume又被模拟成partition 添加到了mtd_table中了。
因此可以得到一个总体的mtd 和ubi 的关系图。
每个mtd partition 可以attach 到一个ubi device上,在每个ubi device上又可以创建很多ubi volume,而每个ubi volume又被作为一个mtd device 保存于mtd table 中。
从内核中我们可以看到mtd的type分为 nor ,nand,ram,rom,ubivolume。
下面是一个比较直观的ubi和mtd相互之间的关系图:

1.MTD Subsystem:
MTD 子系统, 提供对flash芯片的访问接口, MTD子系统提供了MTD device的概念,比如/dev/mtdx,MTD可以认为是raw flash。
2.UBI subsystem:
为flash device提供了wear-leveling和 volume management功能; UBI工作在MTD设备之上,提供了UBI volume;UBI是MTD设备的高层次表示,对上层屏蔽了一些MTD不得不处理的问题,比如wearing以及坏块管理。
3.UBIFS filesystem
UBIFS 文件系统,工作于UBI之上。
 
     

整理一下linux 中常用的ubi 命令:

1 新建ubi 卷:

ubimkvol /dev/ubi0 -N new_volume -s 3000KiB

其中new_volume 是新建的卷的名字,3000KiB 为大小,也可以是MiB

2 删除ubi 卷:

ubirmvol /dev/ubi0 -n $volume_id

volume_id 是要删除的卷的编号,ubi为每个卷都分配一个index,从0 开始

3 重命名ubi 卷

ubirename /dev/ubi0 volume1 volume2 volume3 volume4

把volume1 重命名为volume2,volume3 重名名为volume4

4 用可读可写的方式挂载ubi 卷,卷名为rootfs

mount -o rw -t ubifs ubi0:rootfs /mnt

5 用以在运行的时候,把整个系统的内容,备份到另一个卷,并采用zlib格式进行压缩

mount -o rw -t ubifs ubi0:rootfs /media

mkfs.ubifs -r /media /dev/ubi0_2 -x zlib -y yes

先把当前的rootfs分区挂载到一个空目录下面,然后把改目录下的文件写到另一个ubi 分区里面

6 使用ubifs文件更新整个卷

ubiupdatevol /dev/ubi0_2 rootfs.ubifs

rootfs.ubifs 是要写入的那个文件

  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值