UBIFS学习笔记
在做项目的时候,发现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学习笔记的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
随机推荐
- mysql 、慢查询、到底如何玩
在项目开发中,那些开发大佬经常会写出一些SQL语句,一条糟糕的SQL语句可能让你测试的整个程序都非常慢,超过10秒的话,我觉得一般用户就会选择关闭网页,如何优化SQL语句将那些运行时间 比较长的SQL ...
- 动画中的id与class使用css3的优先级问题
今天在做一个项目,用zepto给元素增加一个class,class里面有transform的效果.开始的时候,元素的样式是用id选择器写的,但是增加class之后,发现动画效果出不来,当时头好晕没想出 ...
- BZOJ 2957 楼房重建(线段树区间合并)
一个显而易见的结论是,这种数字的值是单调递增的.我们修改一个数只会对这个数后面的数造成影响.考虑线段树划分出来的若干线段. 这里有两种情况: 1.某个线段中的最大值小于等于修改的数,那么这个线段的贡献 ...
- [一]SpringBoot 之 HelloWorld
(1)新建一个Maven Java工程 (2)在pom.xml文件中添加Spring BootMaven依赖 2.1在pom.xml中引入spring-boot-start-parent spring ...
- 【BZOJ1443】游戏(二分图匹配,博弈论)
[BZOJ1443]游戏(二分图匹配,博弈论) 题面 BZOJ 题解 很明显的二分图博弈问题. 发现每次移动一定是从一个黑点到达一个白点,或者反过来. 所以可以对于棋盘进行染色然后连边. 考虑一下必胜 ...
- excel换行
在excel的单元格中换行 1. windows alt + enter 2. mac command + alt + enter
- HDU4625 JZPTREE——第二类斯特林数
复杂度大概O(nk) 一些尝试:1.对每个点推出1,2,3,,,到k次方的值.但是临项递推二项式展开也要考虑到具体每个点的dist 2.相邻k次方递推呢?递推还是不能避免k次方的展开 k次方比较讨厌, ...
- LOJ #6035.「雅礼集训 2017 Day4」洗衣服 贪心
这道题的贪心好迷啊~我们对于两个过程进行单独贪心,然后再翻转一个,把这两个拼起来.先说一下单独贪心,单独贪心的话就是用一个堆,每次取出最小的,并且把这个最小的加上他单次的,再放进去.这样,我们得到的结 ...
- selenium - 查看selenium版本信息
1. pip list 2. pip show selenium 3. cmd>>python >>> import selenium>>> help( ...
- JSP 脚本中的 9 个内置对象
JSP 脚本中包含了 9 个内置对象,这 9 个内置对象都是 Servlet API 接口的实例,只是 JSP 规范对它们进行了默认初始化. 这 9 个内置对象如下: 1.application:ja ...