【我悟了】异常断电导致的文件系统变为只读——案例分析

背景

        应领导要求,临时支持其他项目上遇到的一个问题。由于该问题属于未涉及的知识领域,从接触到最终给出方案,也花了我不少精力。在此进行分享,主要介绍在面对不熟悉的问题领域时,分析问题的思路。希望能够给年轻的同学一点参考意义。

思路

问题现象

        OTA 下载流程中,手动断开电源,再次重启,会发现OTA 程序运行异常,其原因是OTA 写文件的目录,变成了read_only。

经验一:切记!切记!切记! 一定要先与先前直接负责同事进行充分沟通,尽可能的了解背景以及听取他分析思路。

通过与夏工交流,得到以下信息:

  1. 文件系统的挂载是由系统执行。我们并没有修改权限操作。

  2. 下载过程中,会涉及到频繁的文件读写,且这些文件是在该文件系统中。

经验二:善于关联,比较。与之前的项目经验进行对比。

针对客户的异常测试用例"OTA 下载流程中,手动异常断电",其实很常见。因为我们其他项目中,基本都会有类似的测试用例,但一直没有出现过该问题。所以我在思考两者有什么不同

经过查找咨询。发现一个明显区别:以往项目中,OTA操作的文件系统,基本都是ext4类型,而出现该问题的文件系统是fat32类型。

综上所述,目前我比较怀疑两个点:

  1. ext4 和fat32文件系统有什么差别?

  2. 程序中对文件的操作是否有不合规的地方?

分析

一. 走读代码

通过与同事沟通和走读代码,OTA 流程中文件操作的流程大致如下:

由上图所示:

tree.xml文件的作用是记录OTA 流程中各个阶段信息。比如任务信息,下载阶段各文件的信息等。

OTA 流程中会记录当前阶段,用于下次继续任务。因此会涉及到频繁写入数据。本方案中采用的是tmp文件方式。

  1. 先读取tree.xml信息,获取当前OTA 上下文。

  2. 根据OTA 进程,修改上下文。

  3. 写入tree_bak.xml,再通过rename 替换 当前 tree.xml

该方式的优点:可以避免写文件时异常,导致OTA上下文丢失。因为rename 仅会修改文件node 信息,不会再对文件数据修改

因此读写文件的操作也属于常规操作,并没有什么不妥

二. fat文件系统和ext4文件系统区别

在I/O性能优化——这一篇就足够啦-CSDN博客文章中,我们知道,linux 支持不同的文件系统,而文件系统的实质就是帮助用户如何有效的利用磁盘上的空间以及文件管理。不同的文件系统其文件管理方式以及磁盘分配方式不同。这里不再赘述两者的异同。

Fat文件系统曾是windows 中主流文件系统,它最大的优点就是兼容性。大部分操作系统都支持。

ext4是在ext3基础上优化而来,具备很多优点。

  • 支持在线检查和碎片整理。提高文件系统的可用性和性能

  • 支持文件系统级别的加密和压缩功能。更好的保护数据安全性和存储效率

  • 能够在异常情况下,更快的恢复文件系统。具有很好的可靠性。

      由于客户的使用场景,该磁盘块需要被android 操作系统 和 QNX 操作系统挂载使用。因此只能选择fat32文件系统,(QNX不支持ext4)。

三.文件系统的临界区

我们知道文件系统对文件的管理分为两个部分文件数据+文件元数据。前者用于保存文件的原始数据内容,后者用于记录文件存储扇区,权限,大小,文件名等信息。若两者信息对不上或损坏则会出现异常。

  因此在真正写磁盘时,就会出现一个临界区:如何保证文件数据和文件元数据的完整性和统一性。比如:

当执行上述红色代码时,出现异常终止,正在执行的对象可能会丢失(rename 的原理,只是修改两个文件的inode)。黄色代码时,出现异常终止,则有可能出现以下情况。

  • 正在改写的文件数据被损坏,f_write

  • 添加的文件恢复到初始状态,f_open,f_close

  • 丢失新建的文件,f_open

  • 新创建的文件或者覆写的内容丢失,f_open,f_mkdir,f_close

  • 由于丢失簇链,磁盘性能下降,f_unlink

注:若以只读方式打开文件,则不会出现上述情况

因此为了减少临界区,可以牺牲一些效率,减少临界区的大小。如下:

f_sync的功能是确保文件fd所有已修改的内容已经正确同步到硬盘上,该调用会阻塞等待直到设备报告IO完成。

综上所述,即使减少了临界区的大小,还是会存在文件系统错误的情况。

文件系统损坏的根本原因在于写文件不是原子操作,因为写文件涉及的不仅仅是用户数据,还涉及元数据,其中任何一个步骤被打断,就会造成数据的不一致或损坏。

四.日志文件系统

日志文件系统就是为了解决上述问题而应运而生。它的原理就是:在进行写操作之前,把即将进行的各个步骤记录下来,保存在文件系统上单独开辟的一块空间上,这就是所谓的日志。日志保存成功之后,在进行上述真正的写文件操作,把文件数据和文件元数据写入磁盘。异常断电就会存在两个场景。

  1. 在写日志时,异常断电,导致日志不完整。解决方式:丢弃本条日志,文件数据区不会影响。

  2. 在写文件时,异常断电,导致文件系统相关数据异常。解决方式:将之前保存的日志,再执行一遍即可。

而ext4具备日志文件系统属性,fat32并不具备。

解决方式

        根据以上分析,建议客户进行以下途径尝试。

更换文件系统

        更换文件系统,相对于我们是比较简单的。基本不会涉及到应用修改的成本。对于客户有些困难。因为该磁盘不仅要被android系统挂载使用,并且还被被QNX系统挂载使用。而QNX 仅支持FAT32和qnx6文件系统(可能是客户版本问题,若要支持ext4文件系统,需要加钱)---- 需要增加成本,并且底层估计还要适配

开启磁盘修复

        设备启动时,首先对fat32文件系统进行修复,再进行挂载。该方案整体成本应该是最少的,但是对于文件系统出错的类型,是否一定能修复完成,并不能保证。需要用大量测试进行验证。--- 修改成本最低,但是存在隐患,需要持续关注

断电保护

        客户提供断电保护机制。出现异常时,进行资源回收,文件系统正常卸载等操作。---- 最为保险,但是成本和开发能力要求较高。

总结

        综上所述,希望通过该案例对大家有所帮助。遇到不熟悉的问题域时,不要慌张,静下心来,抓住每一个细节,进行回想,分析,讨论。

参考文献

深入解析Ext2/3/4文件系统

FatFs模块系统应用指南_fatfs f_sync-CSDN博客

日志文件系统工作原理_日志文件系统原理-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/131519.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

观点|周鸿祎:大模型真正的竞争在于使其与用户场景相结合

【网易科技11月9日报道】目前,人工智能技术尚未达到向手机一样的刚性、高频需求,各国和企业都在加大研发和应用力度,探索不同的技术路线和商业模式。 360集团创始人、董事长周鸿祎在2023世界互联网大会乌镇峰会上表示,目前人工智能…

AI批量剪辑矩阵托管系统----源码技术开发

AI批量剪辑矩阵托管系统----源码技术开发 抖音账号矩阵系统是基于抖音开放平台研发的用于管理和运营多个抖音账号的平台。它可以帮助用户管理账号、发布内容、营销推广、分析数据等多项任务,从而提高账号的曝光度和影响力。 具体来说,抖音账号矩阵系统可…

混沌系统在图像加密中的应用(基于哈密顿能量函数的混沌系统构造1.2)

混沌系统在图像加密中的应用(基于哈密顿能量函数的混沌系统构造1.2) 前言基于广义哈密顿系统的一类混沌系统构造1.基本动力学特性分析2.数值分析 总结python代码 前言 续接混沌系统在图像加密中的应用(基于哈密顿能量函数的混沌系统构造1.1&…

RT-Thread Env使用

Env用户手册 Env是RT-Thread推出的开发辅助工具,针对基于RT-Thread操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。 其内置的menuconfig提供了简单易用的配置裁剪工具,可对内核、组件和软件包进行自由裁剪&#xf…

运动耳机推荐,运动耳机哪个牌子好性价比高?哪个运动耳机好?

​无论你是喜欢户外跑步,还是喜欢室内健身,运动耳机都能为你提供强大的音乐动力,帮助你更好地享受运动的过程,边流汗边听歌太畅快了!因此。想了解哪个品牌的运动耳机更适合自己,就来看看我发布的这篇文章吧…

DevOps平台两种实现模式

我们需要一个DevOps平台 要讨论DevOps平台的实现模式,似乎就必须讨论它们的概念定义。然而,当大家要讨论它们的定义时,就像在讨论薛定谔的猫。 A公司认为它不过是自动化执行Shell脚本的平台,有些人认为它是一场运动,另…

4种最常用的LLM应用文本分块策略

在构建 LLM 应用程序时,分块(Chunking)是将大块文本分解成更小的片段的过程。 这是一项重要的技术,一旦我们使用LLM嵌入内容,它有助于优化我们从矢量数据库返回的内容的相关性。 在这篇博文中,我们将探讨它…

2023美团外卖商超药店月销量

数据包含:外卖商超、药店商品月销量、含商品skuid、规格spuid等内容 资源下载 ​​​​​​​https://download.csdn.net/download/WANJIAWEN1002/88444367?spm1001.2014.3001.5503

什么是网络中的服务质量 (QoS)?

什么是服务质量(QoS) 服务质量(QoS)是网络中用于管理质量并确定数据流量传输优先级的机制。它确保不同类型的数据流量,如语音、视频和数据,获得适当的服务水平。其主要目标是使网络和组织能够对流量进行优…

新发布的Java使用率均超Java8

Java 软件供应商 Azul 发布了首份年度 Java 现状调查报告,基于对全球 2062 名 Java 专业人士和基于 Java 的应用程序用户进行的调查。 Java 软件供应商 Azul 发布了首份年度 Java 现状调查报告,基于对全球 2062 名 Java 专业人士和基于 Java 的应用程序…

java命令行中文乱码原理和解决方式

今天发现用命令行javac编译文件时,若文件里有中文的话,可能会因为“源文件和javac编译使用的编码方式不同”导致乱码的产生,一般我的源文件用的是utf-8编码,但今天查资料发现javac默认使用系统的GBK编码方式,会出现乱码…

Error: “+“ and “-“ must be surrounded by whitespace in calculations.

加减之前一定要空格 改之前: 改之后: 然后就完美解决啦

Versal 自适应 SoC SelectMAP 启动检查表

Versal 自适应 SoC SelectMAP 启动检查表 本文档提供了有关 SelectMAP 启动设置的技巧和指南。在提交个案服务请求之前,应认真查看以下检查表。SelectMAP 启动模式的常规检查表: 是否已查看 SelectMAP 文档,了解连接和电源轨的用法&#…

vivado时序分析-3时序分析关键概念

1、时钟相移 时钟相移对应于延迟时钟波形 , 此波形与因时钟路径内的特殊硬件所导致的参考时钟相关。在 AMD FPGA 中 , 时钟相移通常是由 MMCM 或 PLL 原语引入的 , 前提是这些原语的输出时钟属性 CLKOUT*_PHASE 为非零值。 时序分析期间…

绝绝子神器!食品法规瞬间读懂,建议收藏上天在提醒你!

食品安全法律小助手 1、前言 从事食品相关工作,必须办理健康证,。现在粤省事app上可查看健康证,并且附带相关法律文件pdf,于是下载下来喂给GPT。让GPT学习,我不学习。 2、pdf转成txt文件 要使用Java将PDF文件转换为…

uniapp发行web页面在老版本浏览器打开一片空白

uniapp发行的web页面(菜单->发行->网站-PC Web或手机H5),对于一些老的浏览器(或内核),打开一片空白; 而在新版本的浏览器中打开却正常。这是因为那些版本较低的浏览器不支持ES6的语法和新…

个人前端编程技巧总结

目录 1. 让界面位于当前屏幕的中心(屏幕中心)css代码示例 2. 界面透明但是内部元素不透明(毛玻璃)css代码示例 3. 将当前界面的参数传递到跳转的目标页面(携参跳转)js代码 1. 让界面位于当前屏幕的中心&…

Azure 机器学习 - 使用 Jupyter Notebook 探索 Azure 机器学习

目录 一、前言二、创建跳转盒 (VM)为 VM 启用 Azure Bastion 三、创建工作区四、连接到 VM 桌面五、连接到机器学习工作室允许工作室访问存储 六、停止计算实例七、清理资源 本文介绍如何创建并连接到安全的 Azure 机器学习工作区。 本文中的步骤使用 Azure 机器学习托管虚拟网…

Linux进程状态

目录 书面上的进程状态 Linux系统中的进程状态 R状态 S状态 D状态 T状态 下面是kill命令的一些选项 t状态 X状态 Z状态 进程状态查看 书面上的进程状态 在课本上操作系统的进程状态分为三种 运行态,就绪态,阻塞态 运行态:占有CP…

Clickhouse学习笔记(3)—— Clickhouse表引擎

前言: 有关Clickhouse的前置知识详见: 1.ClickHouse的安装启动_clickhouse后台启动_THE WHY的博客-CSDN博客 2.ClickHouse目录结构_clickhouse 目录结构-CSDN博客 Cickhouse创建表时必须指定表引擎 表引擎(即表的类型)决定了&…