在做项目的时候,发现flash芯片有异常现象,经过打印分析,发现是UBIFS方面设置有一些问题,经过查阅一部分资料,最终得到问题的答案。

在解决问题的过程中,发现打印信息比较重要,但网上并没有直接的相关资料,最后将自己总结的东西总结如下:

先看打印信息,打印信息如下:

UBI: attaching mtd3 to ubi3

UBI: physical eraseblock size:  131072 bytes (128 KiB)

UBI: logical eraseblock size:   126976 bytes

UBI: smallest flash I/O unit:   2048

UBI: VID header offset:         2048 (aligned 2048)

UBI: data offset:               4096

UBI: MTD device name:           "data"

UBI: MTD device size:           4 MiB

UBI: number of good PEBs:       30

UBI: number of bad PEBs:        2

UBI: max. allowed volumes:      128

UBI: wear-leveling threshold:   4096

UBI: number of internal volumes: 1

UBI: number of user volumes:    0

UBI: available PEBs:            24

UBI: total number of reserved PEBs: 6

UBI: number of PEBs reserved for bad PEB handling: 2

UBI: max/mean erase counter: 1/1

UBI: image sequence number: 0

UBI device number 3, total 30 LEBs (3809280 bytes, 3.6 MiB), available 24 LEBs (3047424 bytes, 2.9 MiB), LEB size 126976 bytes (124.0 KiB)

Junior create data volume

UBI error: ubi_create_volume: cannot create volume 0, error -28

ubimkvol: error!: cannot UBI create volume

error 28 (No space left on device)

可知,在UBIFS文件系统下由于申请空间过大导致文件挂载失败,进而出现这种现象。

问题分析:

在分析问题之前,需要先结合打印信息简单的了解一下UBIFS。UBIFS只工作于UBI volume之上。也可以说,UBIFS涉及了三个子系统:

MTD系统,提供对flash芯片的访问接口;

UBI系统,工作在MTD上,提供UBI volume;

UBIFS文件系统,工作在UBI之上。

基于这种层次结构,底层MTD的物理分区(PEB)和上层逻辑分区(LEB)有映射关系,这样做的好处是在上层读写数据时不会考虑底层坏块的影响。

先看物理分区(PEB),每个PEB上都会有两个64bytes的头,这俩头部分别是EC header和VID header,对一片flash芯片而言,如果没有sub-pages,那么EC header会存储于第一个page,VID header会存储于第二个page。因此LEB要比PEB要小一些,如打印所示:

UBI: physical eraseblock size:  131072 bytes (128 KiB)

UBI: logical eraseblock size:   126976 bytes

UBI: smallest flash I/O unit:   2048

UBI: VID header offset:         2048 (aligned 2048)

UBI: data offset:               4096

UBI: attached mtd3 to ubi3

UBI: MTD device name:           "data"

UBI: MTD device size:           4 MiB

UBI: number of good PEBs:       30

UBI: number of bad PEBs:        2

针对这个打印,我们可以看到,此flash芯片PEB为131072 bytes(128KiB),在4MiB的分区里共有32片PEB,其中2片PEB标记坏块。每块PEB,除去EC header和VID header所占的空间4096 bytes(可从VID header的偏移位置和data的偏移位置看出),LEB最终容量为126976 bytes(124KiB)。

另外,UBI系统运行时,其本身也会占用一部分flash空间,从而使得用户能使用的flash容量减少。这些flash空间包括:

2片PEB用于存储卷表(volume table)。卷表是一种数据结构,包含了UBI设备上每一卷的信息,它是一系列volume table record,其中每一个记录块上包含以下信息:卷大小(volume size)、卷名(volume name)、卷类型(volume type,dynamic or static)、volume alignment、更新标记(update marker,防止数据更新发生意外打断,可以恢复)、自重整大小旗标(auto-resize flags)、CRC-32 校验和等信息。之所以保留两份卷表,是为了提高稳定性和防止出现突然断电的状况。当访问MTD设备时,UBI需要确保两个卷表是一致的,如果由于掉电或意外重启导致任何一种不一致状况,需要用较旧的卷表覆盖较新的卷表,确保一致;一旦有一个卷表损坏,可以使用另一个卷表。这俩卷表对用户来说,是不可见和不可访问的。

1片PEB用于损耗平衡(wear-leaving)。UBI支持损耗平衡,这对有限次读写的flash来说可极大提高其使用寿命。在UBI模块中,会包含一个负责实现损耗平衡的独立损耗均衡单元,这个单元依据EC header和VID header来实现对每个物理擦除块所擦除的次数和所属逻辑单元的读取,利用红黑树法对每个擦除块进行保护和移动。

1片PEB用于atomic LEB change operation(不知道是干什么的)

还有一部分PEB用于保存坏块的句柄,针对这个型号的flash,有2片PEB用于保存坏块句柄(见打印信息)。

因此,对于这个型号的flash芯片,总共要分出6片PEB用于支持UBI系统的运行。

结论

了解到了这些信息,回归到问题上来。结合打印信息可知,这个分区总共有4MiB的空间,有30片PEB可用,其中要分出6片PEB以供UBI运行时使用,还剩24片PEB用来存储数据。每片PEB可用存储124KiB的数据,也就是最大能储存24*124KiB=2976KiB(约2.9MiB)的数据,如果申请3MiB的空间,势必会因分区空间不足而导致文件挂载失败。

为此,可以考虑缩小申请空间,使其不大于2.9MiB(UBIFS只识别整数形式的GiB、MiB、KiB,修改的时候需注意这一点),这样的话,文件挂载便不会失败,问题就可以解决了。

UBIFS学习笔记的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  4. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  7. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  8. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

随机推荐

  1. postman 断言学习

    请求 url :https://www.v2ex.com/api/nodes/show.json?name=python get请求 postman发起请求并做断言 断言: tests["B ...

  2. 【bzoj4006】[JLOI2015]管道连接 斯坦纳树+状压dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的无向图和 $p$ 个特殊点,每个特殊点有一个颜色.要求选出若干条边,使得颜色相同的特殊点在同一个连通块内.输出最小边权和. 输入 第一行包含三个整数 n ...

  3. 使用Runtime.getRuntime().exec()方法的几个陷阱

    Process 子类的一个实例,该实例可用来控制进程并获得相关信息.Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的退出状态以及销毁(杀掉)进程的方法. 创建进程的方法 ...

  4. JVM堆内存控制/分代垃圾回收

    JVM的堆的内存, 是通过下面面两个参数控制的 -Xms 最小堆的大小, 也就是当你的虚拟机启动后, 就会分配这么大的堆内存给你 -Xmx 是最大堆的大小 当最小堆占满后,会尝试进行GC,如果GC之后 ...

  5. Django文字教程

    user-----URL对应关系-------视图函数def func1()-------------- 函数给用户返回的实质上就是一个字符串,过程:通过open函数打开HTML,把HTML读到内存中 ...

  6. Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)

    A 每次可以换一个或不换,暴力枚举位置即可 B 模拟 C 二分答案.. 边界可以优化r=totb/(tota-p),二分可以直接(r-l>=EPS,EPS不要太小,合适就好),也可以直接限定二分 ...

  7. 【bzoj3173】最长上升子序列

    Portal --> bzoj3173 Solution 感觉自己需要智力康复qwq 首先题目给的这个序列肯定是一个\(1-n\)的排列,并且插入的顺序是从小到大 仔细思考一下会发现如果知道了最 ...

  8. 【数据结构】【平衡树】treap

    之前写treap的传送门 之前写的那个太毒瘤了,这次放一个更毒瘤的指针版上来 #include<cstdio> #include<iostream> #define rg re ...

  9. 网络协议之mDNS20170217

    DNS(Domain Name System,域名系统)因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串.通过主机名,最终得 ...

  10. 手把手教你如何玩转Activiti工作流

    手把手教你如何玩转Activiti工作流 置顶 2018年01月30日 19:51:36 Cs_hnu_scw 阅读数:24023   版权声明:本文为博主原创文章,未经博主允许不得转载. https ...