产品现象 : 设备(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”文件系统的超级块和快组信息 ,能给调试带来便利。
基本定位: 应该是格式化分区的工具用错了,导致日志没有开启,是该问题产生的原因