【全志A33】解决文件系统错误

2023-11-01

这个平板第一次开机就给我了一个惊喜,文件系统不可写,WTF,这还玩啥。但是查了一下内核日志,发现这事不简单~~~

内核日志

[    1.690765] EXT4-fs (nandd): barriers disabled
[    1.698331] EXT4-fs (nandd): mounted filesystem with ordered data mode. Opts: noauto_da_alloc,barrier=0,data=ordered
[    6.190083] EXT4-fs error (device nandd): ext4_init_inode_table:1116: comm ext4lazyinit: Something is wrong with group 0: used itable blocks: 427; itable unused count: 0
[    6.213432] EXT4-fs (nandd): Remounting filesystem read-only
[    6.219880] EXT4-fs error (device nandd) in ext4_init_inode_table:1160: IO failure

很明显,是ext4_init_inode_table这个函数报了错“comm ext4lazyinit: Something is wrong with group 0: used itable blocks: 427; itable unused count: 0”,然后内核强行把文件系统重新挂载成只读的了。因为我们是将文件系统做成镜像然后直接烧写进nand的,我首先怀疑是制作的文件系统镜像有问题。

文件系统制作过程

在执行./build.sh之后,文件系统编译流程如下,

Created with Raphaël 2.1.2 ./build.sh ./build.sh mkcommon.sh mkcommon.sh mkcmd.sh mkcmd.sh build.sh build.sh mkcommon.sh $@ buildroot/scripts/ mklichee mkrootfs buildroot/target/dragonboard/

所以最终的文件系统的制作过程发生在buildroot/target/dragonboard/build.sh里面。其中最核心的就是下面两行代码

make_ext4fs -l $NEW_NR_SIZE"M" $TARGET_IMAGE rootfs/
fsck.ext4 -y $TARGET_IMAGE > /dev/null
echo "success in generating rootfs"

熟悉安卓系统开发的人对make_ext4fs一定很熟悉,这是安卓用来制作根文件系统的工具,当然,它也可以用来制作linux的根文件系统,问题是这个根文件系统的制作过程看不出有什么错误。

一个不完美的解决方式

既然根文件系统镜像的制作没问题,假设烧写也没有问题,那么问题只可能出在nand flash本身了,如果nand flash有坏块,那么的确有可能出现这个问题。
那么回到问题本身,内核日志显示,是ext4_init_inode_table:1116这里报了问题,那么就去内核源码里看一下代码到底在做什么。

if ((used_blks < 0) || (used_blks > sbi->s_itb_per_group)) {
        ext4_error(sb, "Something is wrong with group %u: "
                   "used itable blocks: %d; "
                   "itable unused count: %u",
                   group, used_blks,
                   ext4_itable_unused_count(sb, gdp));
        ret = 1; 
        goto err_out;
}

结合日志,我们发现这里used_blks是427,因此是因为(used_blks > sbi->s_itb_per_group)这个条件进入分支的,那么这两个比较的值肯定有错误,由于sbi->s_itb_per_group是一个属性值,是在格式化的时候就确定了,因此可以大体判定used_blks是错误的,这里有一种可能性比较大的假设是nand flash本身存在坏块,但是烧录工具在烧写的时候并没有跳过这些坏块,因此系统启动后文件系统结构被损坏。

因为我不需要向根文件系统频繁写入大量数据,所以这里我选择接受这个错误,但要求内核不能将文件系统挂载为只读,解决方式就是把ext4_error这个函数注释掉。

重新编译内核,这时根文件系统已经是可写的了,我也尝试做了简单的压力测试,并没有出现宕机的情况,所以可以认为文件系统的结构的损坏程度完全处于可接受的状态。

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

【全志A33】解决文件系统错误 的相关文章

  • centos python 升级3.7 及pip

    centos 7 6 1810 python3 6升级3 7 查看系统版本 开始升级 1 下载Python 3 7 0 tgz软件包 2 解压编译 3 更改默认python版本 pip2消失的话 查看系统版本 cat etc redhat

随机推荐

  • OSI七层协议大白话解读

    互联网的本质就是一系列的网络协议 这个协议就叫OSI协议 一系列协议 按照功能不同 分工不同 人为的分层七层 实际上这个七层是不存在的 没有这七层的概念 只是人为的划分而已 区分出来的目的只是让你明白哪一层是干什么用的 每一层都运行不同的协
  • Python的学习记录

    Python The Zen of Python by Tim Peters Beautiful is better than ugly Explicit is better than implicit Simple is better t
  • Docker安装与配置阿里云镜像加速

    一 Docker简介 1 Docker是什么 产生背景 开发和运维之间因为环境不同而导致的矛盾 不同的操作系统 软件环境 应用配置等 DevOps 集群环境下每台服务器都配置相同的环境 太麻烦 解决 在我的机器上可以正常工作 的问题 Doc
  • Java IO流处理 面试题汇总

    说明 本节内容来源于网络汇总 输入输出流是相对于内存而言的 1 面试题汇总 1 java中有几种类型的流 2021 08 19更新 从编码方式上 分为字符流和字节流 如上图可知 字节流继承inputStream和OutputStream 字
  • 第二章:25+ Python 数据操作教程(第十三节NUMPY 教程与练习)持续更新

    NumPy Numerical Python 或 Numeric Python 的缩写 是 Python 中对数组和矩阵进行快速数学计算的最基本的软件包之一 在处理多维数据时它也非常有用 集成C C 和FORTRAN工具是一件幸事 它还提供
  • vue路由在使用keep-alive缓存之后第二次进入页面created和mounted不执行问题及解决

    一 keep alive介绍 1 什么是 keep alive Vue js 中 keep alive 是一个内置组件 可以在需要缓存的组件上添加keep alive 标签 使得这个组件被缓存起来 不会被多次渲染和销毁 keep alive
  • pytest 用例依赖

    应用场景 1 创建订单之前 需要先添加购物车 2 在执行订单接口用例之前 要保证添加购物车接口用例完成 并且是pass 应用办法 可以使用pytest插件 pytest插件介绍 1 官方插件地址介绍 https docs pytest or
  • 【Lua基础系列】rawset & rawget方法

    Lua基础系列 rawset rawget方法 大家好 我是Lampard 欢迎来到Lua基础系列的博客 前文再续 书接上一回 今天和大家讲解一下lua中的rawset rawget方法 Lua基础系列 index元方法 Lua基础系列 n
  • HTML表单学习之单选按钮却可以多选的问题及解决办法

    出现这种情况的原因是如图所示 按钮没有分组 通过在input元素中添加name属性可以将两个按钮设置为同一组 单选按钮正常使用的代码如下所示
  • Mybatis配置解析-03

    1 核心配置文件 JDBC中连接数据库的URL转义 jdbc mysql localhost 3306 mybatis useSSL true amp useUnicode true amp characterEncoding utf8 m
  • 传统@ServerEndpoint方式开发WebSocket应用和SpringBoot构建WebSocket应用程序

    小Hub领读 通过websocket的两种使用方式 让你更加深入理解用法 很多人不懂websocket怎么辨别是谁发送过来的 文中说到实现WebSocketConfigurer接口 定义拦截器可以绑定用户信息 还有其他很多 细细品 对比看比
  • IDEA maven报错To see the full stack trace of the errors, re-run Maven with the -e switch

    这里写自定义目录标题 报错内容 ERROR ERROR Some problems were encountered while processing the POMs FATAL Non resolvable parent POM for
  • managed unmanaged

    Enable function level control for compiling functions as managed or unmanaged pragma managed pragma unmanaged pragma man
  • 生日快乐,Bill

    12月15日 是Bill的生日 于是我用Easyx为他做了个生日礼物比较潦草 当然中间的 initgraph 680 420 EW NOCLOSE EW DBLCLKS EW NOMINIMIZE setbkmode TRANSPARENT
  • Springboot的拦截器功能实现:

    1 写拦截器类 代码如下 package com demo config import org springframework web servlet HandlerInterceptor import javax servlet http
  • CSDN 重新开放付费资源的上传了,但要求如下

    csdn上半年关闭了付费资源的上传功能 经过几个月的优化处理 现在又重新 开放了 优化后的上传功能 必须达到一定的级别才能实现 所以并不是向以前一样 都可以上传 虽然网站上已经公布了具体的要求说明 在这里我整理了一下给大家 也就是说 想上传
  • 设置elementUi无限滚动加载时的一些注意点

    1 overflow属性是一定要有的 可以加到父节点或者自身上 否则会报错 2 容器一定要被撑开并触底 这样才会触发v infinite scroll上绑定的方法 3 设置height calc 100vh 72px 72是header的高
  • [开发

    Java中比较两个对象的指定属性的值是否相等 可以使用Apache Commons Lang库中的EqualsBuilder类 EqualsBuilder提供了一种便捷的方法来比较两个对象的属性值是否相等 具体步骤如下 通过构造器创建一个E
  • 存储过程之用返回多条数据一

    要求 拼接数据 作为多条数据返回 1 创建类型 create or replace type bb ptyxztqk Type as object d index number d name varchar2 100 d this numb
  • 【全志A33】解决文件系统错误

    这个平板第一次开机就给我了一个惊喜 文件系统不可写 WTF 这还玩啥 但是查了一下内核日志 发现这事不简单 内核日志 1 690765 EXT4 fs nandd barriers disabled 1 698331 EXT4 fs nan