Linux系统磁盘空间占用过高是运维过程中非常常见的问题,轻则导致应用写入失败,重则引发系统服务异常中断,需要及时排查处理。常见的诱因包括日志文件无限制增长、临时文件未清理、大文件残留、软件包缓存堆积等,不同诱因对应的处理方式存在差异。

常用排查命令介绍
df命令查看磁盘整体使用情况
df命令可以查看系统中所有挂载点的磁盘使用情况,常用参数-h可以以人类可读的格式展示容量单位,方便快速判断哪个分区空间不足。
# 查看所有挂载点的磁盘使用情况 df -h # 输出示例 # Filesystem Size Used Avail Use% Mounted on # /dev/sda1 50G 45G 2.5G 95% / # tmpfs 7.8G 0 7.8G 0% /dev/shm
du命令定位大文件和大目录
当确定某个分区空间不足后,可以使用du命令逐层排查占用空间较大的文件或目录,常用参数-h展示可读单位,-d指定排查深度,-s统计总大小。
# 查看根目录下一级目录的占用大小,按从大到小排序 du -h -d 1 / 2>/dev/null | sort -hr # 查看指定目录下大于100M的文件 find /var -type f -size +100M 2>/dev/null
常见场景及解决方案
日志文件堆积
Linux系统中/var/log目录存放各类服务日志,如果服务日志没有配置滚动策略,很容易出现单个日志文件体积过大或者日志目录整体占用过高的情况。
如果是临时清理,可以直接删除过期的日志文件,但是需要注意不要删除正在写入的日志,避免服务异常。如果是长期解决,需要配置日志滚动规则,以rsyslog服务为例,修改/etc/logrotate.d/syslog配置文件:
# 编辑rsyslog日志滚动配置
vim /etc/logrotate.d/syslog
# 配置内容示例
/var/log/messages {
daily # 每天滚动一次
rotate 7 # 保留7份历史日志
compress # 压缩历史日志
missingok # 日志不存在时不报错
notifempty # 日志为空时不滚动
create 0644 root root # 新建日志文件的权限和属主
}
软件包缓存过多
使用yum或者apt包管理器安装软件时,会默认缓存下载的安装包,长期不清理会占用大量磁盘空间。
如果是CentOS/RHEL系统,使用yum清理缓存:
# 清理所有yum缓存 yum clean all # 只清理过期的缓存 yum clean expire-cache
如果是Ubuntu/Debian系统,使用apt清理缓存:
# 清理已下载的安装包缓存 apt clean # 清理不再需要的依赖包 apt autoremove
已删除文件仍占用空间
有时候使用rm命令删除了大文件,但是磁盘空间没有释放,这是因为文件还在被进程占用,文件描述符没有关闭。可以通过lsof命令找到这类文件:
# 查找被删除但仍被进程占用的文件 lsof | grep deleted # 输出示例 # nginx 1234 root 10w REG 8,1 1073741824 123456 /var/log/nginx/access.log (deleted)
找到对应的进程ID后,可以通过重启进程或者向进程发送信号的方式释放空间,比如重启nginx服务:
systemctl restart nginx
临时文件残留
/tmp目录下的临时文件如果没有被程序自动清理,也会占用磁盘空间,可以定期清理超过指定时间的临时文件:
# 删除/tmp目录下7天前创建的文件 find /tmp -type f -mtime +7 -delete
日常预防建议
为了避免磁盘空间频繁出现过高的问题,可以做好以下几点预防措施:
- 为重要服务配置日志滚动策略,避免日志无限制增长
- 定期清理软件包缓存和临时文件,可以配置定时任务自动执行
- 监控磁盘使用率,当使用率超过80%时及时告警处理
- 部署应用时合理规划分区,避免单个分区空间分配不足