三步法解决linux小磁盘服务器磁盘满的痼疾

三步法解决linux小磁盘服务器磁盘满的痼疾

V+变量
2026-11-07 / 0 评论 / 1 阅读 / 正在检测是否收录...

0 背景

博主用的阿里云VPS只有30G磁盘空间,之前把博客、图库放到阿里云上,加上部署的统计、监控、测试的docker程序,经常出现服务器磁盘已满,导致无法继续写入磁盘,很多网站程序和进程都报错,所以有必要进行清理。
但是,先别急着删 /tmp。​ 空间满的真凶通常不是它,而是这几处:/var/log 与 journald 日志、Docker 镜像/构建缓存、包管理器缓存,以及「已删除但仍被进程占用」的文件(df 显示满、du 却对不上)。盲删 /tmp/* 还可能删掉运行中的 socket、锁文件和正在使用的临时文件,把服务搞挂。

1 排查问题

排查占用问题

df -hT                                 # 哪个分区满了
df -i                                  # 是否 inode 耗尽(有空间却写不进)
sudo du -xhd1 / 2>/dev/null | sort -rh | head -20    # 根目录各层占用
sudo lsof +L1 2>/dev/null | head -30                 # 删了但没释放的文件
sudo du -xhd1 /var 2>/dev/null | sort -rh | head -15
sudo journalctl --disk-usage
sudo docker system df 2>/dev/null

2 清理磁盘

2.1 清理包缓存

sudo apt clean(Debian/Ubuntu)

或

sudo dnf clean all(RHEL 系)

优点是随时可重新下载,最安全。

2.2 清理journal 日志

sudo journalctl --vacuum-size=200M 

只裁旧日志,不动服务。

2.3 清理系统临时文件:优先

sudo systemd-tmpfiles --clean

按 tmpfiles.d 规则清理,比手工 rm 安全得多。

2.4 清理tmp

确需手工清 /tmp:先预览清单,确认后再删,只处理 7 天未访问的普通文件:

sudo find /tmp /var/tmp -xdev -type f -atime +7 -print | head -100   #只看,不删

清单确认无误后,把 -print 换成 -delete。不要碰 /run、/dev/shm:

sudo find /tmp /var/tmp -xdev -type f -atime +7 -delete | head -100

2.5 清理内存

若 lsof +L1 有输出:重启对应服务释放句柄,别 kill -9 盲杀;也不要直接 rm 正在写的
大日志,用 truncate 或 logrotate。

2.6 清理docker

docker system prune 

会删停止的容器、未被引用的镜像和网络,必须单独确认。

3 系统加固-减少垃圾文件产生

给增长封顶,让系统自己约束,避免过几个月又堆满。都是一次配置、长期生效,且不删除现有数据。

3.1 给系统日志封顶(最常见的大头)

bashsudo mkdir -p /etc/systemd/journald.conf.d && printf '[Journal]\nSystemMaxUse=200M\nMaxRetentionSec=2week\n' | sudo tee /etc/systemd/journald.conf.d/10-limit.conf && sudo systemctl restart systemd-journald

journal 日志总量硬上限 200M、只保留两周,超出自动轮转丢弃。用 drop-in 文件不改动原配置,删掉 10-limit.conf 即可回滚;重启 journald 不会中断业务。

3.2 让包管理器不再囤积安装包

bashprintf 'APT::Keep-Downloaded-Packages "false";\n' | sudo tee /etc/apt/apt.conf.d/99-no-keep-downloads

Debian/Ubuntu:apt install 完即删 .deb,/var/cache/apt/archives 不再越攒越大。RHEL/CentOS 系改成在 /etc/dnf/dnf.conf(或 /etc/yum.conf)的 [main] 段设 keepcache=0。这条纯配置、无需重启服务。

3.3 开启临时文件自动回收

bashsudo systemctl enable --now systemd-tmpfiles-clean.timer

每天自动跑一次 systemd-tmpfiles --clean,按系统默认规则清掉 /tmp 中超过 10 天、/var/tmp 中超过 30 天的文件。多数发行版默认已启用,这条是确认并强制生效。想更激进可加 printf 'd /tmp 1777 root root 7d\n' | sudo tee /etc/tmpfiles.d/10-tmp.conf。注意:启用后系统会自动删除旧临时文件,如果你有长期搁在 /tmp 里的数据,先挪到 /home 下的目录。
验证是否生效:

bashsystemctl list-timers systemd-tmpfiles-clean* --no-pager
sudo journalctl --disk-usage
df -h

3.4 docker优化建议

如果这台机器跑 Docker,容器日志往往是比 /tmp 更凶的隐形杀手。建议在 /etc/docker/daemon.json 里配置 log-opts 的 max-size(如 10m)和 max-file(如 3)——但不要直接覆盖已有 daemon.json(先备份、合并字段),且 systemctl restart docker 会中断正在运行的容器,需要单独安排窗口。新配置也只对新建容器生效,已有容器要重建。

0

评论 (0)

取消