1. 首页 > 技术教程 > 正文

空间紧急急救:Linux 磁盘爆满后的 10 种安全清理法

空间紧急急救:Linux 磁盘爆满后的 10 种安全清理法

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

空间紧急急救: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