/dev/shm/目录下出现超大文件,未被清除问题分析
更新时间: 2026/06/02
在Gitcode上查看源码问题背景
- 单板类型:NA
- 软件版本:openUBMC 25.09。
- 涉及功能:目录监控。
- 触发条件:dev/shm目录下有大文件且文件有执行权限,执行script目录下的partition_usage_monitor.sh。
- 业务表现:预期执行script目录下的./partition_usage_monitor.sh,文件内存应被清空,变成1B,文件仍存在;实际不会清空,影响文件系统目录监控功能。
问题复现步骤
- /dev/shm目录写入个有执行权限的大于100M的文件aaa.txt。
- 执行script目录下的定时脚本,./partition_usage_monitor.sh。
- 查看文件大小没有变化。
关键日志信息
操作记录:
bash
[~]# sh /opt/bmc/script/partition_usage_monitor.sh
[~]#
[~]# ls -lh /dev/shm/aaa.txt
-rwxrwxrwx 1 root root 100M Jun 2 11:11 /dev/shm/aaa.txt
[~]#
[~]# cat /opt/bmc/script/partition_usage_monitor.sh |grep rm_if_exceed_limit
rm_if_exceed_limit "/dev/shm/log" 102400
rm_if_exceed_limit "/dev/shm/persistence.local" 102400
rm_if_exceed_limit "/dev/shm/tallylog" 102400
rm_if_exceed_limit "/var/log" 102400
rm_if_exceed_limit "/data" 102400定位过程
对比 iBMC V2 与 openUBMC V3 的 partition_usage_monitor.sh 脚本中 rm_if_exceed_limit 函数调用差异如下:
- iBMC V2
bash
rm_if_exceed_limit “/dev/shm” 102400
rm_if_exceed_limit “/data” 102400
rm_if_exceed_limit “/opt/pme/pram” 3072- openUBMC V3
bash
rm_if_exceed_limit “/dev/shm/log” 102400
rm_if_exceed_limit “/dev/shm/persistence.local” 102400
rm_if_exceed_limit “/dev/shm/tallylog” 102400
rm_if_exceed_limit “/var/log” 102400
rm_if_exceed_limit “/data” 102400关键变化: openUBMC V3 将
/dev/shm拆分为三个子目录精细监控,新增/var/log目录监控,移除了/opt/pme/pram目录监控。
因此,放置于 /dev/shm 根目录下的大文件(如 aaa.txt)不再被脚本识别和处理,导致无法触发清理机制。
问题原因
当前设计未涵盖/dev/shm 根目录下的任意文件监控,若在此生成大文件(例如调试输出、临时上传等),将逃过自动清理机制,可能导致:
- 磁盘空间耗尽
- 升级失败(因空间不足)
- 影响后续固件激活(Valid模块依赖文件系统完整性)。
解决方案
- partition_usage_monitor.sh 脚本不能直接检测/dev/shm目录,因为业务运行过程中会对/dev/shm/xx目录执行 mount/umount 操作,若脚本在检测该目录时发生冲突,会导致mount/umount操作失败,影响业务功能;
- 当前partition_usage_monitor.sh脚本仅对/dev/shm下面某几个具体目录做检测,这些目录在运行过程中存在产生大文件的风险,业务在使用过程中必须包含具体的空间校验逻辑,以避免出现大文件占用空间的风险;
- 目前在固件缓存场景中已实施空间校验机制,比如要缓存一个新的固件包,会限制其占用空间并判断剩余空间大小,防止业务处理过度消耗 /dev/shm 空间,如果出现这种情况属于软件bug,不能依靠监控脚本去检测和删除。