专栏首页程序手艺人[ Linux驱动炼成记 ] 15 - 存储器EMMC中Ext4文件系统 中 磁盘空间占用率100%

[ Linux驱动炼成记 ] 15 - 存储器EMMC中Ext4文件系统 中 磁盘空间占用率100%

**产品现象 : ** 设备(Linux 系统) 运行一段时间后,其中某一个分区 /et/config 突然占用率为100%,而实际空间可能1%都不到。 这种问题百思不得其解。谷歌/百度 所遇到的解决方案都是嵌入式系统中磁盘空间占用率100% , 针这种情况,完全没用。

继续寻找问题: 大量老化设备之后,其中有一台完全复现,只要应用程序S10进程启动之后,磁盘空间就100%。 起初怀疑是应用程序S10进程的问题,但是没有说法,应用程序中也没有频繁操作文件的情况。

继续探索: 开机禁止启动S10进程,发现系统正常,磁盘空间占用率也正常。但是往/etc/config 随便写一个文件,磁盘空间立马就100%

Filesystem                Size      Used Available Use% Mounted on
/dev/config              28.0M    844.0K     25.1M   100% /etc/config
/dev/info                 3.8M     54.0K      3.4M   2% /etc/info

这个时候发现一些报错打印

[  172.603143@2] EXT4-fs error (device mmcblk0p16): ext4_mb_generate_buddy:758: group 0, block bitmap and bg descriptor inconsistent: 4941 vs 4942 free clusters
[  172.611759@0] EXT4-fs (mmcblk0p16): Delayed block allocation failed for inode 12 at logical offset 0 with max blocks 1 with error 28
[  172.623793@0] EXT4-fs (mmcblk0p16): This should not happen!! Data will be lost
[  172.623793@0] 
[  172.632576@0] EXT4-fs (mmcblk0p16): Total free blocks count 0
[  172.638018@0] EXT4-fs (mmcblk0p16): Free/Dirty block details
[  172.643497@0] EXT4-fs (mmcblk0p16): free_blocks=1
[  172.648144@0] EXT4-fs (mmcblk0p16): dirty_blocks=1
[  172.652983@0] EXT4-fs (mmcblk0p16): Block reservation details
[  172.658696@0] EXT4-fs (mmcblk0p16): i_reserved_data_blocks=1

开机异常打印

[    3.455929] meson_uart ff803000.serial: ttyS0 use xtal(8M) 24000000 change 115200 to 115200
[    3.460932] Freeing unused kernel memory: 4480K
[    3.716471] EXT4-fs (mmcblk0p13): mounted filesystem with ordered data mode. Opts: (null)
[    3.862473] meson_uart ff803000.serial: ttyS0 use xtal(8M) 24000000 change 115200 to 115200
[    3.886295] EXT4-fs (mmcblk0p13): re-mounted. Opts: errors=remount-ro,data=ordered
[    4.040478] EXT4-fs (mmcblk0p15): mounted filesystem without journal. Opts: (null)
[    4.071872] EXT4-fs (mmcblk0p16): mounted filesystem without journal. Opts: (null)
[    4.155793] EXT4-fs (mmcblk0p14): mounted filesystem without journal. Opts: (null)
[    4.234014] EXT4-fs (mmcblk0p3): mounted filesystem without journal. Opts: (null)
[    5.156790] EXT4-fs (mmcblk0p17): mounted filesystem without journal. Opts: (null)
[    5.500780] EXT4-fs (mmcblk0p18): mounted filesystem without journal. Opts: (null)

通过这些异常打印,问题的矛头指向了启动 挂载分区的脚本

     mount -t ext4 /dev/config /etc/config
     if [ $? -ne 0 ]
     then
         //第一次烧录固件,启动的时候,先会调用mk2fs格式化分区
         mke2fs /dev/config
         //挂载分区
         mount -t ext4 /dev/config /etc/config
     fi

开机的时候这行打印:  mounted filesystem without journal. Opts: (null)

表示挂载文件系统的时候没有日志,这样系统出现问题之后,也不会调用系统修复工具的

正常的逻辑: 开启日志,系统分区出现异常,系统自动调用系统修复工具修复

那接下来的问题主要是如何开启挂载文件系统时候的日志,参考mounted filesystem without journal. Opts: (null) while mounting ext4 fs , 第二个回答

ext4 file system corrupted with ext4_mb_generate_buddy messages seen in the logs 指导了查找问题方向的回答

大概意思就是: 格式化分区的时候调用mkfs.ext4 /dev/config之后,挂载分区mount 就会出现日志, 然而mke2fs 需要配置一些参数才可以,但我实际尝试之后: mkfs.ext4格式分区之后,mount 确实会有日志,但是mk2fs配置相关参数之后还是不行

步骤:

mkfs.ext4 /dev/config 
mount -t ext4 /dev/config /etc/config
有日志的正常打印 :  mounted filesystem with ordered data mode. Opts: (null)

还发现一个系统潜在的问题: 测试过程中发现系统根本没有 mkfs.ext4,而有mk2fs很奇怪, 但是Emmc Ext4文件系统中mkfs.ext4 这个是标配的。 仔细排查之后:

mk2fs 是 busybox 提供的工具,而mkfs.ext4相关工具编译选项根本没有打开

mkfs.ext4相关工具 主要在 buildroot/package/e2fsprogs

e2fsprogs.mk 
E2FSPROGS_BINTARGETS_$(BR2_PACKAGE_E2FSPROGS_BADBLOCKS) += usr/sbin/badblocks
E2FSPROGS_BINTARGETS_$(BR2_PACKAGE_E2FSPROGS_CHATTR) += usr/bin/chattr
E2FSPROGS_BINTARGETS_$(BR2_PACKAGE_E2FSPROGS_DUMPE2FS) += usr/sbin/dumpe2fs
E2FSPROGS_BINTARGETS_$(BR2_PACKAGE_E2FSPROGS_E2FREEFRAG) += usr/sbin/e2freefrag
E2FSPROGS_BINTARGETS_$(BR2_PACKAGE_E2FSPROGS_E2FSCK) += usr/sbin/e2fsck
E2FSPROGS_BINTARGETS_$(BR2_PACKAGE_E2FSPROGS_E2LABEL) += usr/sbin/e2label
E2FSPROGS_BINTARGETS_$(BR2_PACKAGE_E2FSPROGS_E2UNDO) += usr/sbin/e2undo
E2FSPROGS_BINTARGETS_$(BR2_PACKAGE_E2FSPROGS_E4DEFRAG) += usr/sbin/e4defrag
E2FSPROGS_BINTARGETS_$(BR2_PACKAGE_E2FSPROGS_FILEFRAG) += usr/sbin/filefrag
E2FSPROGS_BINTARGETS_$(BR2_PACKAGE_E2FSPROGS_FSCK) += usr/sbin/fsck
E2FSPROGS_BINTARGETS_$(BR2_PACKAGE_E2FSPROGS_LOGSAVE) += usr/sbin/logsave
E2FSPROGS_BINTARGETS_$(BR2_PACKAGE_E2FSPROGS_LSATTR) += usr/bin/lsattr
E2FSPROGS_BINTARGETS_$(BR2_PACKAGE_E2FSPROGS_MKE2FS) += usr/sbin/mke2fs
E2FSPROGS_BINTARGETS_$(BR2_PACKAGE_E2FSPROGS_MKLOSTFOUND) += usr/sbin/mklost+found
E2FSPROGS_BINTARGETS_$(BR2_PACKAGE_E2FSPROGS_UUIDGEN) += usr/bin/uuidgen

打开对应的BR2_PACKAGE_E2FSPROGS_BADBLOCKS 相关宏控制就可以了

可以得出结论: busybox 中提供的mk2fs应该是裁剪版本,实际的版本应该是 e2fsprogs 编译出来的

实际调试过程中也发现 dumpe2fs命令用于打印“ext2/ext3”文件系统的超级块和快组信息 ,能给调试带来便利。

基本定位: 应该是格式化分区的工具用错了,导致日志没有开启,是该问题产生的原因

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • nghttp2 中的常用API

    int nghttp2_session_callbacks_new(nghttp2_session_callbacks* *callbacks_ptr)

    程序手艺人
  • 玩转「Wi-Fi」系列之wpa_supplicant - main分析(九)

    其中比较主要的是-c参数, 指定启动配置文件。配置文件的模板路径为 wpa_supplicant/wpa_supplicant.conf, 官网有对该文件参数的...

    程序手艺人
  • [ 后端篇 ] 08 - AWS DynamoDB batchGet() API 返回 Error

    意思是 : 如您请求超过100个项目,BatchGetItem将返回ValidationException,并显示消息“Too many items reque...

    程序手艺人
  • PhotoSynth:图像识别建模技术

    PhotoSynth是微软公司从华盛顿大学购买来的一项技术,主要作用是通过平面照片自动建立空间模型,目前已经接近即将发布的前夕。 举例来说,游客来到上海,外滩...

    ruanyf
  • 分享自制的C#和VB Code互转工具

    作为.NET程序员,往往习惯使用一种语言(据我观察,2006年后的程序员习惯用C#,之前的喜欢VB)。而对于另一种语言虽然能读懂但是写起来总是比较费事。尤其面对...

    葡萄城控件
  • Here Documents 结合expect的使用--(1)

    使用expect 命令来解决自动交互问题是非常广泛的,expect有自己独特的语法,可以写expect脚本来解决复杂的交互问题;但是很多时候,我们会需要在she...

    干点啥吧
  • vue编写的移动端条件搜索条组件

    super.x
  • salesforce lightning零基础学习(八) Aura Js 浅谈一: Component篇

    我们在开发lightning的时候,常常会在controller.js中写 component.get('v.label'), component.set('v...

    用户1169343
  • mb加载百度首页,input框不支持拖拽文字的研究

    后来发现原来是js里调用了preventDefaultMethodCallback,是jquey调用的:

    龙泉寺扫地僧
  • 深入解析 Python 中的上下文管理器

    但是,timeit.timeit函数仅接受字符串,如果要管理比较复杂的函数时会有局限性。以下示例向您展示如何使用timeit模块运行和管理函数。

    代码医生工作室

扫码关注云+社区

领取腾讯云代金券