VPS磁盘满了最常见的表现:网站打不开(MySQL写不进去)、Docker容器启动失败(没空间写日志)、SSH登录巨慢。本文用du和ncdu两个命令找到谁在吃空间,再针对Docker日志、系统日志和旧备份三类大户下手清理。
第一步:确认磁盘使用情况
df -h
# 看Use%列。如果根分区/的Use%超过90%,就是危险了
# 超过95%,MySQL和Docker随时可能挂如果显示用了90%以上但你觉得不应该有这么多数据——进入第二步找元凶。
第二步:du定位大目录
# 从根目录开始,看每个一级目录各占多少
cd /
du -sh * 2>/dev/null | sort -hr | head -20
# 这样会输出占用最大的20个目录,类似:
# 12G var
# 8.2G home
# 3.1G usr
# ...然后对最大的目录逐层深入——cd /var、du -sh * | sort -hr | head -10——一层一层找到具体是哪个子目录在吃空间。
第三步:ncdu可视化更直观
du的输出是数字列表,ncdu提供交互式界面:
apt install ncdu -y
ncdu /
# 方向键上下移动,回车进入子目录,d删除文件
# 按?看所有快捷键ncdu扫描整个磁盘后会用树状结构展示每个目录的大小,一眼看到最大的几个是哪些。比du一层层查快得多。按d直接删除目录——但要确认好了再删。
常见吃空间大户和处理方法
Docker容器日志:/var/lib/docker/containers/ 下每个容器的xxxx-json.log可能占到几个G。Docker默认不限制日志大小。
# 查看各容器日志大小
docker ps -q | xargs -I {} sh -c 'echo {}; docker inspect --format='"{{.LogPath}}"' {} | xargs ls -lh'
# 限制日志大小(在docker run或compose里加)
--log-opt max-size=10m --log-opt max-file=3
# 意思是每个日志文件最大10MB,最多保留3个系统日志:/var/log/journal/ 可能大到几个G。限制大小:nano /etc/systemd/journald.conf,设SystemMaxUse=500M,systemctl restart systemd-journald。
旧内核:每次更新系统可能留下旧内核,占用/boot空间。apt autoremove –purge自动清理旧内核。
备份文件:之前写的备份脚本如果没加删除旧文件的逻辑——/backup或/tmp目录里可能堆了一堆过期备份。find /backup -name “*.tar.gz” -mtime +7 -delete删除7天前的。
雨云VPS入门套餐硬盘20GB起步,日常注意清理Docker日志和旧备份基本够用。优惠码 admin01 首月五折。
清理完了加个监控
清完不等于不用管了。加个简单的磁盘监控脚本,磁盘超过85%自动告警:
#!/bin/bash
USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $USAGE -gt 85 ]; then
echo "VPS磁盘使用率${USAGE}%!" | mail -s "磁盘告警" your@email.com
fi
# 加到crontab,每天检查一次
0 8 * * * /root/scripts/check_disk.sh常见问题
删了大文件但df -h显示空间没释放?
文件被某个进程占着(文件句柄没释放)。lsof | grep deleted找到占着已删除文件的进程,restart那个进程空间就释放了。常见凶手:nginx的access.log被删了但nginx还在往旧句柄写。
du显示占了10G但df显示占了20G?
差额通常是:du不统计已经被删但没释放的文件(上面说的句柄问题)、不统计挂载点下的内容、不统计某些隐藏的metadata。先解决句柄问题再重新对比。
能不能直接把整个/var/log删了?
不能。日志目录本身有权限和上下文设置,直接删目录可能导致服务找不到日志路径启动失败。正确做法是清空文件内容不删文件——echo “” > /var/log/syslog把文件内容置空但保留文件本身。






