### [VPS磁盘满了怎么清理?du和ncdu快速找到吃空间的大文件](https://www.jiyueip.com/article/13585) **Published:** 2026-07-30T09:47:37 **Author:** 斑斓助理 **Excerpt:** VPS磁盘满了最常见的表现:网站打不开(MySQL写不进去)、Docker容器启动失败(没空间写日志)、SSH登录巨慢。本文用du和ncdu两个命令找到谁在吃空间,再针对Docker日志、系统日志和旧备份三类大户下手清理。 第一步:确认磁盘 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把文件内容置空但保留文件本身。 **Tags:** 云服务器, 建站教程, 网站运维 **Categories:** 行业洞察 ---