Linux 磁盘空间异常占用排查:被删除文件仍被进程占用导致空间未释放

Linux 中被删除文件因进程占用导致磁盘空间未释放问题

一、问题现象 / 发现

  1. 磁盘占用告警:执行 df -h 命令显示根分区(/dev/sda1)总容量 4.9G,已 100% 占用,可用空间为 0,导致系统无法写入新文件。

    1
    2
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda1 4.9G 4.9G 0 100% /
  2. 磁盘统计矛盾:执行 du -h / --max-depth=1 统计根目录总占用仅 1.3G,与 df 显示的 4.9G 占用严重不符,存在 “隐藏占用”。

  3. 关键日志文件异常:通过手动排查进程文件描述符,发现 /var/log 下的多个核心日志文件(messagessyslogauth.log 等)已被删除,但仍被进程占用,状态标记为 (deleted)

    1
    2
    l-wx------ 1 root root 64 Aug  9 22:03 10 -> /var/log/messages (deleted)
    l-wx------ 1 root root 64 Aug 9 22:03 7 -> /var/log/syslog (deleted)

二、问题分析

  1. 被删除文件的进程占用机制
    Linux 系统中,当文件被 rm 命令删除后,若仍有进程持有该文件的文件描述符(如日志服务正在写入),内核不会立即释放磁盘空间,df 仍会统计为 “已占用”,但 du 无法检测到(因文件已从目录树中移除),导致两者数据矛盾。
  2. 日志服务的角色
    被占用的文件均为系统日志文件,由 rsyslog 服务(系统日志守护进程)管理。rsyslog 持续写入这些日志文件,即使文件被手动删除,进程仍保持对其的引用,导致空间无法释放。
  3. 磁盘满的直接原因
    被删除的日志文件实际占用了大量空间(推测为几百 MB),但因进程占用未释放,导致根分区被 “虚占” 至 100%。

三、问题解决

1. 定位问题根源

通过排查进程文件描述符,确认被删除但仍被占用的日志文件:

1
2
3
4
5
6
# 手动遍历进程文件描述符(无 lsof 时)
for pid in $(ls /proc); do
if [ -d "/proc/$pid/fd" ]; then
ls -l /proc/$pid/fd 2>/dev/null | grep -i deleted
fi
done
1
2
# 如果有安装lsof,可以用:
lsof | grep deleted

查询结果:

1
2
3
4
5
6
7
l-wx------ 1 root root 64 Aug  9 22:03 10 -> /var/log/messages (deleted)
l-wx------ 1 root root 64 Aug 9 22:03 11 -> /var/log/daemon.log (deleted)
l-wx------ 1 root root 64 Aug 9 22:03 12 -> /var/log/auth.log (deleted)
l-wx------ 1 root root 64 Aug 9 22:03 7 -> /var/log/syslog (deleted)
l-wx------ 1 root root 64 Aug 9 22:03 8 -> /var/log/kern.log (deleted)
l-wx------ 1 root root 64 Aug 9 22:03 9 -> /var/log/debug (deleted)

2. 释放被占用空间

重启 rsyslog 服务,使其释放对已删除日志文件的引用,内核随即回收磁盘空间:

1
systemctl restart rsyslog

3. 验证解决效果

执行 df -h 确认根分区使用率下降,可用空间恢复:

1
2
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1 4.9G 1.2G 3.5G 26% / # 示例结果,实际视释放空间而定

四、总结

  • 核心原因:被删除的日志文件因 rsyslog 进程持续占用,导致磁盘空间未释放。
  • 解决关键:重启持有文件描述符的进程(此处为 rsyslog),强制释放被占用空间。
  • 预防建议:
    1. 避免手动删除正在写入的日志文件,改用 logrotate 工具自动轮转日志。
    2. 定期执行 lsof | grep deleted 检查隐藏占用,及时释放无效文件。