/dev/shm/目录下出现超大文件,未被清除问题分析
更新时间: 2026/06/02
在Gitcode上查看源码

问题背景

  • 单板类型:NA
  • 软件版本:openUBMC 25.09。
  • 涉及功能:目录监控。
  • 触发条件:dev/shm目录下有大文件且文件有执行权限,执行script目录下的partition_usage_monitor.sh。
  • 业务表现:预期执行script目录下的./partition_usage_monitor.sh,文件内存应被清空,变成1B,文件仍存在;实际不会清空,影响文件系统目录监控功能。

问题复现步骤

  1. /dev/shm目录写入个有执行权限的大于100M的文件aaa.txt。
  2. 执行script目录下的定时脚本,./partition_usage_monitor.sh。
  3. 查看文件大小没有变化。

关键日志信息

操作记录:

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模块依赖文件系统完整性)。

解决方案

  1. partition_usage_monitor.sh 脚本不能直接检测/dev/shm目录,因为业务运行过程中会对/dev/shm/xx目录执行 mount/umount 操作,若脚本在检测该目录时发生冲突,会导致mount/umount操作失败,影响业务功能;
  2. 当前partition_usage_monitor.sh脚本仅对/dev/shm下面某几个具体目录做检测,这些目录在运行过程中存在产生大文件的风险,业务在使用过程中必须包含具体的空间校验逻辑,以避免出现大文件占用空间的风险;
  3. 目前在固件缓存场景中已实施空间校验机制,比如要缓存一个新的固件包,会限制其占用空间并判断剩余空间大小,防止业务处理过度消耗 /dev/shm 空间,如果出现这种情况属于软件bug,不能依靠监控脚本去检测和删除。