Linux服务器磁盘空间不足是运维场景中非常常见的问题,当磁盘使用率达到阈值时,会引发程序写入失败、服务崩溃等一系列故障,需要快速定位原因并完成清理。

第一步:确认磁盘整体使用情况
首先需要通过df命令查看所有挂载点的磁盘使用情况,快速定位哪个分区空间不足。常用参数-h可以以人类可读的格式展示容量大小。
# 查看所有挂载点的磁盘使用情况 df -h # 输出示例 # Filesystem Size Used Avail Use% Mounted on # /dev/sda1 50G 48G 2.0G 96% / # tmpfs 7.8G 0 7.8G 0% /dev/shm # /dev/sdb1 200G 50G 150G 25% /data
从输出结果可以看到根分区/的使用率已经达到96%,需要优先处理这个分区的问题。
第二步:定位占用空间大的目录和文件
确认分区后,需要使用du命令逐层排查该分区下占用空间较大的目录,找到具体的冗余文件。常用参数-sh可以查看目录总大小,--max-depth可以限制排查深度。
# 查看根目录下一级目录的大小,按从大到小排序 du -sh /* 2>/dev/null | sort -rh # 输出示例 # 30G /var # 10G /home # 5G /usr # 2G /opt
从结果可以看到/var目录占用了30G空间,继续向下排查/var下的子目录:
# 查看/var目录下一级子目录的大小 du -sh /var/* 2>/dev/null | sort -rh # 输出示例 # 25G /var/log # 3G /var/lib # 2G /var/cache
可以看到/var/log目录占用了25G空间,是主要的问题来源。
第三步:针对性清理冗余内容
清理过期日志文件
日志文件是磁盘空间占用的常见原因,尤其是没有配置日志轮转的服务,日志会持续累积。可以先查看大日志文件:
# 查找/var/log目录下大于1G的文件 find /var/log -type f -size +1G 2>/dev/null
对于确认无用的历史日志,可以直接删除,正在写入的日志不要直接删除,而是清空内容:
# 清空正在写入的nginx访问日志,而不是直接删除 echo "" > /var/log/nginx/access.log # 删除30天前的所有.log结尾的日志文件 find /var/log -name "*.log" -type f -mtime +30 -delete
清理系统缓存和无用安装包
如果是基于Debian或Ubuntu的系统,可以清理apt缓存:
# 清理已下载的安装包缓存 apt clean # 删除不再需要的依赖包 apt autoremove -y
如果是基于CentOS或RHEL的系统,可以清理yum缓存:
# 清理yum缓存 yum clean all # 删除不再需要的依赖包 yum autoremove -y
查找并删除大文件
如果日志清理后空间仍然不足,可以查找整个分区下的大文件:
# 查找根分区下大于5G的文件 find / -type f -size +5G 2>/dev/null
确认文件无用后再删除,比如旧的备份文件、临时下载的安装包等。
第四步:验证清理效果
清理完成后,再次使用df -h命令查看磁盘使用情况,确认空间已经释放:
df -h # 输出示例 # Filesystem Size Used Avail Use% Mounted on # /dev/sda1 50G 20G 30G 40% /
如果清理后空间没有明显变化,可能是有进程仍然占用已删除的文件,可以通过lsof命令查找这类进程,重启对应进程即可释放空间:
# 查找占用已删除文件的进程 lsof | grep deleted # 重启对应进程,比如重启nginx systemctl restart nginx
长期预防建议
为了避免磁盘空间不足问题反复出现,可以做好以下配置:
- 为常用服务配置日志轮转,比如使用
logrotate工具定期切割、压缩、删除旧日志 - 设置磁盘使用率监控告警,当使用率超过80%时及时通知运维人员
- 定期清理临时目录
/tmp下的过期文件,避免临时文件累积 - 重要数据尽量存储到单独的数据盘,不要和系统盘放在同一个分区