LittleFs文件系统

2023-10-30

小型文件系统(littlefs)

简介

LittleFs设计之初的重点特性是:
(1)低资源消耗;
(2)掉电保护;
(3)擦写均衡,
本章节重点讨论第(2)和(3)这两个特性,第(1)个特性则贯穿在整个设计过程中。后文把LittleFs简称为lfs。

1 具体功能介绍

1.1 掉电保护

最经典的掉电保护方法有两种,一种是使用日志,一种是通过COW方式。lfs结合了两种方法,并优化了两种方案的缺点,提供了一套掉电保护策略。

1.1.1 日志方式

在这里插入图片描述
具体步骤为:
(1) 写入数据之前,先在日志区存储开始标志,记录要写入的数据位置和大小;
(2) 待写入的数据写入日志区;
(3) 待写入的数据写入数据区;
(4) 写入完成之后,在日志区记录结束标志。
模拟掉电场景:
(1) 步骤1完成,步骤2没有完成;重启之后,保持原来的数据,日志无效;
(2) 步骤1,2完成了,步骤3没有完成,尝试把步骤2的数据写入到数据区;
(3) 步骤1,2,3完成了,步骤4没有完成,同样尝试把步骤2的数据写入到数据区;

1.1.2 Cow机制

在这里插入图片描述
具体步骤为:
(1) 想更新节点F的数据,先申请一个新的节点,把F的旧数据拷贝过去,然后更新新的数据;
(2) 把父节点的指针指向新的节点,去掉旧节点的指针。
模拟掉电场景:
(1)步骤(1)完成了,步骤(2)没有完成,则使用旧的数据,新的节点变成孤儿节点。

1.1.3 lfs掉电保护

lfs结合了日志方式和COW机制两种方式进行掉电保护,并且优化了两种方案。
前面谈过文件系统三要素,超级块,inode,以及数据。对应lfs来说,他把超级块以及inode通过日志的方式存储,两种采用统一的存储结构,后文称两者为元数据;普通数据则采用cow的方式存储,采用czt逆序链表的方式。
在这里插入图片描述

1.1.3.1 元数据的存储

在这里插入图片描述
元数据(对应root,dir)采用双block的方式存储,互为备份,每个block都有一个revision序号,值越大,表示block的数据越新,每个block默认可以存储最多0xff个文件的数据,如果超过这个值,则需要compact(压缩)。
Compact是干什么呢? 即当数据的大小大于某个值的时候,把数据整合,剔除同一个id的旧的数据,然后写入到备份block里面。
在compact的过程中,如果发现整合的数据还是大于某个值,怎么办呢?需要split(分片)。

1.1.3.2 普通数据的存储(CTZ)

Lfs的数据采用ctz链表的方式逆向管理,这与传统的文件系统有比较大的差别。具体对比见下图所示。
在这里插入图片描述
传统的方式添加数据,需要建立旧的数据到新的数据的索引。这样做有两个弊端:
(1) 当数据特别多的时候,这样一个个的索引过去查找,比较费时间。
(2) 当使用cow机制的时候,在文件后面每增加一次数据,需要把所有的索引都重新建立一个,这样带来的性能损耗特别大。
为了解决这两个问题,lfs采用了下面的管理方式。
在这里插入图片描述

(1) 采用逆向的指针,这样常规的追加数据,不需要额外的开销来重新建立所有的索引;
(2) 每个偶数block有多个指针,指向更远的数据,这样可以在检索的时候加快速度。
指针的建立采用了CTZ(二进制中最后一个不为0的位,其右边0的个数)的方式。大概原理就是,block N 如果是一个能被 2^X整除的数,那么他就存在指向N – 2^X的指针,指针的数目为ctz(N)+1。
在这里插入图片描述
从上表可以看出,block 2多一个指向0的指针,block 4多一个指向0,2的指针。
咱们已经知道了实际数据(对应file)采用czt list的方式存储,最新的数据block指向次新的数据block(这个是为了提高COW的效率)。
一次常规更新数据的过程大概为(实际比这个复杂很多,需要考虑cache、孤儿、crc等问题):
(1) 往file文件中写入数据;
(2) 申请一个新的block,并且把file文件最后一个block的数据复制到新的block,并追加要写入的数据;
(3) 更新新block的czt list(在block的头部会占用一定的4字节倍数的字节来记录索引,这个czt list只是用来fseek的加快速度);
(4) 文件fclose的时候,更新对应的元数据信息到父节点中。
掉电保护的具体场景:
步骤(1),(2),(3)完成了,但是(4)没有完成。因为索引还没有建立起来,数据虽然写入了,但是没有人知道,文件系统会丢失最新的数据,保留修改之前的数据。
步骤(4)过程中掉电了。步骤(4)是更新元数据,元数据采用了主备的方式,并且采取了如下的格式:
在这里插入图片描述
正常的提交流程为:
(1)提交tag;
(2)提交data;
(3)提交crc。
当tag和data提交了,但是CRC没有提交的时候,crc就会校验失败,这个时候前面crc校验通过的部分,就会被relocate到一个新的块,这样由于断电导致的数据异常,则回退成功。注意:crc校验的时机,在提交一个新的commit到对应的元数据的时候。

1.2 擦写均衡

了解擦写均衡之前,先需要知道littlefs是怎么管理物理block的,怎么才能申请到一个空闲的block。

1.2.1 Block管理

为了节省内容,Littlefs对空闲block的管理采用了滑窗方式,滑窗的大小是可以配置,默认是32bit,对应32个block的使用情况。
在这里插入图片描述

当文件系统需要申请一个空闲的block的时候,从lookahead中寻找没有置位的block,申请成功,则给对应的block位置1。当当前的窗口中的所有block都被占用的时候,就需要滑动窗口了,一次性滑动窗口大小的距离,即默认一次滑动32个block。

在这里插入图片描述

当窗口滑动了之后,lookahead中又有了新的空闲的block可以申请。
问题来了,怎么定义一个block是不是空闲的呢?
一片flash的总的block是有限的,假设其序号从0->N,lookahead对应的block范围是I->J,Littlefs会通过lfs_fs_traverse遍历所有使用到的block,如果这个block在I->J之间,则说明block被使用了,否则就是空闲的。

1.2.2 擦写均衡的实现

通过前面的滑窗机制,可以一定程度上的避免每次操作到的都是同一个片区的block。但是这还不够,因为每次启动的时候,滑窗都是从block0开始滑动的,这个会导致前面的block使用频率高于后面的block。所以,我们需要找到办法,让每次启动的时候,滑窗的位置都是随机的,极致的随机,就是平均了。
为此,littlefs使用了crc作为随机数,再通过简单的运算,得到了滑窗启动的时候的起始位置。
问题又来了,crc哪儿来的,干什么的?
Crc就是元数据提交的终结符号,用来校验提交是不是正确的,littlefs借用了crc之间相互异或带来的不确定性来作为滑窗的启动地址,一定程度上复用了现有的机制达到了随机的目的。

1.3 文件读写

写入流程:

在这里插入图片描述

读取流程:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LittleFs文件系统 的相关文章

随机推荐

  • 今天终于知道了如果用layero获取layer弹窗中的子元素了

    通过layer弹出的ifram 想要获取里面的元素并且绑定相应的事件 以前一直不知道layero是什么意思 可以通过下面的代码自己体会一下 layer open type 2 title 文件管理 shadeClose true shade
  • 基于XStream的JavaBean与XML相互转换

    相对于JAXB XStream更简洁一些 常用注解 XStreamAlias 定义xml节点名 1 引入XStream依赖
  • 数据清洗分析导出遇到的一些问题

    本文简单记录一个学习过程 无技术含量 勿喷 环境 ambari 2 6 1 spark 2 1 python 3 6 oracle 11 2 sqoop 1 4 最近一直在测试数据采集 清洗 分析 导出 展示的一系列的工作 主要数据流程如下
  • 服务器定时重启问题排查

    上周主要处理了 两个生产问题 工作电脑没带 主要简述一下 每天的20 13分linux服务器 centos7 4 重新启动 应用服务接口类交易 耗时20秒 频发 这里先说一下服务器重启的问题 此次重启共发生三天 第一次主要排查管控平台 发现
  • 压缩感知与磁共振成像

    01 压缩感知原理和建模 传统的数据采样和重构需要遵循Nyquist采样定律 即采样频率必须大于信号频率带宽的2倍 才能完整的重建信号 如果采样频率低于2倍的频率带宽 信号在频域频谱搬移后就会发生混叠 产生伪影 压缩感知 Compresse
  • 【千奇百怪】PHP代码质检工具PHPCS分析介绍与使用

    前两天 还是在对一个代码质量检测平台维护的时候 遇到了好几个关于PHP质检的需求 而老平台上支持的php在新平台还未实现 于是简单研究了一下php的质检工具 准备接入新平台 系列文章目录 java自定义spotbugs检测器 PHP代码质检
  • cutlass 第一节:下载 编译 运行 cutlass 的一些备忘信息 ubuntu docker

    v100 cutlass start web site https developer nvidia com blog cutlass linear algebra cuda https github com NVIDIA cutlass
  • Qt开发 之 QWidget 和 QtQuick(QML) 写网页

    文章目录 1 准备工作 1 1 环境配置 1 2 Emsdk配置 1 2 1 配置环境文件 1 2 2 配置Emsdk的编译器 2 写两个简单的QWidget和QtQuick示例 2 1 QWidget 2 2 QtQuick 3 编译运行
  • 【KEIL-MDK】系列——主题配色

    文章目录 前言 一 更改主题配色 1 备份默认主题 2 替换配置文件 二 主题一 Sublime Theme风格 三 主题二 亮色风格 四 自定义主题配色 字体 下载地址 总结 前言 好看的主题 好看的界面 可以潜移默化的帮助我们提高生产力
  • 测试总结:如何写接口测试用例

    目录 一 接口测试用例基础知识 1 接口测试要测的是什么 2 接口测试的意义 二 接口测试用例设计方法 1 功能 检查接口基础功能 是否完成了业务逻辑要求 2 数据 分析接口的输入参数 覆盖各种可能的场景 3 性能 接口是否造成性能瓶颈 能
  • ctf-ping命令执行

    GXYCTF2019 Ping Ping Ping 现在做一下关于常见的绕过ping执行其他命令的姿势 启动环境 连接并输入参数 查看当前目录下都有什么 ls命令没有被过滤 并且知道flag就在这个目录下面 用cat查看的flag的时候发现
  • 降维和特征选择的关键方法介绍及MATLAB实现

    目录 概念理解 降维 特征选择 降维的方法 主成分分析 Principle Component Analysis PCA 方法 偏最小二乘法 Partial Least Squares PLS MATLAB实现 重点函数解读 例 光谱数据主
  • 数字货币DCEP

    上周新闻提到了区块链技术 号召大家学习和利用区块链技术 然后数字货币DCEP就浮出了水面 那么这个DCEP是什么呢 我根据自己的经验介绍下 如有不对请指正 DCEP是什么 DCEP是Digital Currency Electronic P
  • 软文营销创造优质内容才能打开市场产生共鸣

    内容是有效软文营销的基石 可满足多种用途 一般企业宣传都会以内容展现在网络上 形式可能包含新闻媒体 自媒体 论坛 问答 视频和其他形式 这些内容形式可以帮助生成 促进你的品牌知名度提升并增加业务收入 内容为王 只有内容优质才能在营销中产生共
  • Java实现区块链 --- 原理篇

    什么是区块链 区块链是由一个个记录着各种信息的小区块链接起来组成的一串链条 和链表类似 是一种数据结构 应用于未来互联化的社会 区块链特性 去中心化 区块链是分布式存储的 不存在中心点 所有每个节点都可以是中心 在生活中像银行 支付宝就属于
  • FFmpeg中编码类型为rawvideo无须解码直接显示测试代码

    在 https blog csdn net fengbingchun article details 93975325 中介绍过通过FFmpeg可以直接获取usb视频流并解码显示的测试代码 当时通过usb获取到的视频流编码类型为AV COD
  • macos 环境下搭建 windbg 虚拟机双机调试环境

    求职 阿哈哈哈广告来了 博主本人 23届落魄web安全 在线求职 本科学历有一段大厂实习 有缺人的大佬么或者有内推的大佬给个机会吧 求求啦 可以微信联系我给您简历 ocean888 文章底下有二维码 本次使用将在 macos 环境下搭建 w
  • flask入门教程(7) - 会话

    会话 flask提供了session对象 即会话 允许你在不同请求之间储存信息 这个对象相当于用密钥签名加密的cookie 即用户可以查看你的cookie 但是如果没有密钥就无法修改它 这是我的网站词神上的cookie 大家可以打开我的网站
  • blender_(uv应用)................http://digitalman.blog.163.com/blog/static/23874605620174172058299/...

    轻松学习Blender基础入门之九 UV 1 2017 06 21 14 24 49 分类 Blender 举报 字号 订阅 下载LOFTER 我的照片书 前言
  • LittleFs文件系统

    小型文件系统 littlefs 简介 LittleFs设计之初的重点特性是 1 低资源消耗 2 掉电保护 3 擦写均衡 本章节重点讨论第 2 和 3 这两个特性 第 1 个特性则贯穿在整个设计过程中 后文把LittleFs简称为lfs 1