前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[ Linux驱动炼成记 ] 15 - 存储器EMMC中Ext4文件系统 中 磁盘空间占用率100%

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

作者头像
程序手艺人
发布2019-02-20 17:18:15
4.8K0
发布2019-02-20 17:18:15
举报
文章被收录于专栏:程序手艺人程序手艺人

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

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

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
[  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

开机异常打印

代码语言:javascript
复制
[    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)

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

代码语言:javascript
复制
     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配置相关参数之后还是不行

步骤:

代码语言:javascript
复制
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

代码语言:javascript
复制
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”文件系统的超级块和快组信息 ,能给调试带来便利。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年01月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档