空间紧急急救:Linux 磁盘爆满后的 10 种安全清理法
服务器突然报警“No space left on device”?网站挂了,SSH 连不上,连 `ls` 都报错。别慌,这是运维老鸟最常见的翻车现场。主机选这篇 Linux 教程直接给你 10 条能立刻上手的清理命令,从排查到清盘,一步到位。

先定位:谁吃了你的磁盘空间?
用 `df -h` 快速确认磁盘使用率
df -h
看 Use% 列,如果 / 或 /home 接近 100%,就是它了。
用 `du -sh /*` 找到大目录
du -sh /* 2>/dev/null | sort -rh | head -20
2>/dev/null 过滤掉权限报错,sort -rh 按大小倒序排,只看前 20 个。
万一报错“Permission denied”,加上 sudo 再跑一次。
如果发现 `/var/log` 或 `/tmp` 占了几十 G,那多半是日志或缓存惹的祸。
10 种安全清理法:从轻到重
1. 清理系统日志文件
日志文件是磁盘爆满的头号元凶,尤其 `/var/log/journal/` 和 `/var/log/syslog`。
sudo journalctl –vacuum-time=7d
只保留最近 7 天的日志,不删系统,不伤筋骨。
sudo truncate -s 0 /var/log/syslog
直接清空 syslog 文件,比 rm 安全,不会让进程报错。
2. 清理 apt 缓存(Debian/Ubuntu)
sudo apt clean
删除 /var/cache/apt/archives/ 下的所有 .deb 包,能清出几百 MB 到几 G。
sudo apt autoremove –purge -y
卸载不再依赖的库和内核,顺便清理残留配置文件。
3. 清理 yum 缓存(CentOS/RHEL)
sudo yum clean all
删除 yum 的元数据和缓存,效果和 apt clean 类似。
sudo package-cleanup –oldkernels –count=2
只保留最近 2 个内核,老内核占几十 MB 一个,删了不亏。
4. 清理临时文件
sudo rm -rf /tmp/*
sudo rm -rf /var/tmp/*
重启后这些目录本来就会被清,手动删一次能应急。
5. 清理 Docker 无用数据(如果有 Docker)
docker system prune -a –volumes -f
删掉停止的容器、未使用的镜像和卷,docker 日志堆起来能到几十 G。
6. 清理 Nginx 日志
sudo truncate -s 0 /var/log/nginx/access.log
sudo truncate -s 0 /var/log/nginx/error.log
别用 rm,否则 Nginx 会写不了日志,重启才能恢复。
7. 清理 Apache 日志
sudo truncate -s 0 /var/log/apache2/access.log
sudo truncate -s 0 /var/log/apache2/error.log
8. 清理 Python 和 Node 依赖缓存
rm -rf ~/.cache/pip
rm -rf ~/.npm/_cacache
开发机上堆的缓存动辄几 G,生产环境一般没有,但万一有就顺手清掉。
9. 清理 core dump 文件
find / -type f -name “core.*” -size +1M -exec rm -f {} \;
core dump 是程序崩溃时生成的,一般没用,删了就行。
10. 检查并清理大文件(终极方案)
find / -type f -size +500M -exec ls -lh {} \; 2>/dev/null
找到所有大于 500MB 的文件,然后手动判断要不要删。
比如 /var/lib/mysql/ibdata1 是 MySQL 的表空间,不能乱删。
> **老鸟叮嘱**:千万别手贱删 `/var/lib/mysql/` 下的文件,除非你确认是备份或日志。删错 MySQL 数据文件,网站直接崩,恢复比登天还难。
常见排障:清完空间后还是报错?
重启服务释放文件句柄
有些进程删了文件但没释放句柄,空间不会立刻释放。
sudo systemctl restart rsyslog
重启日志服务,释放被占用的日志文件句柄。
sudo systemctl restart nginx
如果清的是 Nginx 日志,必须重启才能看到空间释放。
用 `lsof` 查看被删但未释放的文件
sudo lsof | grep “(deleted)”
找到所有已删除但还在被进程占用的文件,然后重启对应进程。
FAQ
Linux 磁盘爆满后网站打不开怎么办?
先执行 `df -h` 和 `du -sh /*` 定位大目录,然后按上面 10 条方法清理。最快见效的是清日志和 apt/yum 缓存。清完后重启 web 服务(如 `systemctl restart nginx`)。
VPS 上日志文件占几十 G,怎么自动清理?
配置 logrotate,按天或按大小轮转日志。例如 `/etc/logrotate.d/nginx` 里加 `rotate 7` 和 `compress`,只保留 7 天压缩日志。不想手动搞的,直接写个 cron 跑 `journalctl –vacuum-time=7d`。
用 `rm -rf /tmp/*` 安全吗?
大部分情况安全,但注意 `/tmp` 下可能有其他进程正在写入的临时文件,删了可能导致程序崩溃。建议先 `ls -la /tmp` 看看,确认没有重要锁文件或 socket 文件再删。
清理 Docker 缓存后,镜像还能用吗?
`docker system prune -a` 会删除所有未被使用的镜像。如果你要重新部署容器,它会重新拉取镜像,但不会影响运行中的容器。生产环境建议先 `docker image ls` 确认哪些镜像在用,别一股脑全删。
为什么清完磁盘空间后,`df -h` 显示没变化?
可能是进程没释放文件句柄。用 `sudo lsof | grep deleted` 查看,然后重启对应进程(如 rsyslog、nginx、apache)。或者直接重启服务器,这是最笨但最有效的办法。
Linux 小白可以直接用 root 账号清理磁盘吗?
不建议。用 `sudo` 执行清理命令,避免误删系统文件。比如 `sudo rm -rf /` 这种操作,一旦用 root 手滑了,服务器直接废。养成用普通用户加 sudo 的习惯,是 Linux 运维的第一课。
转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9408.html 商家投稿邮箱:zhujixuanblog@qq.com
