Linux 服务器磁盘满了:从定位到清理的排查手册

举报
yd_282937315 发表于 2026/11/10 08:55:24 2026/11/10
【摘要】 Linux 服务器磁盘满了:从定位到清理的排查手册磁盘空间满了,是服务器上最常见也最容易被忽视的故障。写日志写不进去、数据库起不来、上传文件失败,根因往往就是根分区 100%。磁盘满的排查同样有固定顺序:先看哪里满了,再看是什么占的,最后才是清理和预防。 一、先看整体:哪个分区满了第一步永远是看整体用量,别一上来就到处翻目录:df -hdf -h 会列出每个挂载点的总容量、已用、可用和占用...

Linux 服务器磁盘满了:从定位到清理的排查手册

磁盘空间满了,是服务器上最常见也最容易被忽视的故障。写日志写不进去、数据库起不来、上传文件失败,根因往往就是根分区 100%。磁盘满的排查同样有固定顺序:先看哪里满了,再看是什么占的,最后才是清理和预防。

一、先看整体:哪个分区满了

第一步永远是看整体用量,别一上来就到处翻目录:

df -h

df -h 会列出每个挂载点的总容量、已用、可用和占用率。重点关注两处:

  • 根分区 / 占用率接近 100%:系统盘满了,影响最大,服务、日志、临时文件都可能写不进去。
  • 数据盘(如 /data)满了:一般是业务数据或备份文件占的,定位范围小得多。

顺带看一眼 inode 用量,小文件太多时磁盘空间没满、inode 先耗尽了,表现同样是"写不进去":

df -i

df -i 里某个分区的 IUse% 到 100%,就是 inode 耗尽,多半是某个目录下堆了几十万个小文件。

二、再看局部:是谁占了空间

确认是哪个分区满了之后,用 du 逐层定位大目录:

du -sh /var/* | sort -rh | head -10

这条命令列出 /var 下各子目录的占用,按大小倒序取前 10。顺着最大的目录一层层往下钻:

du -sh /var/log/* | sort -rh | head -10

几个最常见的"空间大户":

  1. 日志目录 /var/log:服务日志没做轮转,几年下来能攒几十 GB。先看单个文件大小:ls -lh /var/log。
  2. 临时目录 /tmp:程序异常退出留下的临时文件、上传一半的大文件。
  3. Docker 数据目录 /var/lib/docker:镜像、容器日志、匿名卷,没清理过的话几十 GB 很常见。
  4. 数据库目录 /var/lib/mysql:除了数据文件,binlog 没过期清理也会越攒越多。
  5. 备份目录:定时备份脚本只管生成不管删除,旧备份越积越多。

三、清理:先删能删的,别动在用的

定位到大户之后再动手清理,顺序是先易后删、先外后内:

1. 清理日志:最安全、见效最快

先看日志文件是不是还在被进程写着。正在写的文件不能直接 rm,删了文件、进程还拿着句柄,空间不会释放,反而看不见文件、空间还占着。正确做法是清空内容:

# 对仍在写的日志文件:清空而不是删除
> /var/log/xxx.log

已经轮转过的旧日志(.gz、.1 这种)可以直接删:

rm /var/log/xxx.log.*.gz

长远看要配好 logrotate,让日志按天或按大小自动轮转、过期自动删除,别再靠人手工清。

2. 清理 Docker:镜像、容器、卷一起算

Docker 占空间常常是三部分叠加,先看各占多少:

docker system df

再按需清理。只清悬空镜像和已停容器相对安全:

docker system prune

加上 -a 会连没在用的镜像一起清,加上 --volumes 会清匿名卷——卷里可能有数据,执行前先确认哪些卷还在用,别一股脑全清了。

3. 清理包管理缓存和旧内核

系统自带的缓存也常被忽略:

# Debian/Ubuntu
apt clean

# RHEL/CentOS
yum clean all

旧内核也会占地方,留当前在用的和上一个版本,其余的可删:

# 先确认当前内核版本,别删错
uname -r

4. inode 耗尽:删小文件,不是删大文件

inode 满了、空间还有,du 找大文件那套就不管用了。先定位小文件扎堆的目录:

find /var/spool -type f | wc -l

常见元凶是邮件队列、会话文件、缓存碎片。确认无用后批量删:

find /path/to/dir -type f -mtime +30 -delete

-mtime +30 只删 30 天前的文件,删之前先不加 -delete 跑一遍、核对数量再动手。

四、应急:磁盘满到服务都起不来

如果根分区已经 100%,连登录、写日志都受影响,先做应急腾挪:

  1. 立刻清一块空间出来:先删一两个确定无用的大日志文件,让系统恢复写入能力,再慢慢排查。
  2. 别重启服务:重启时服务要写日志、写 PID 文件,磁盘满着可能起不来,先腾空间再重启。
  3. 临时挂一块盘:云服务器可以临时挂一块数据盘,把最大的目录(比如 /var/log 或数据库目录)挪过去,先恢复业务,再做彻底清理。

五、预防:别让磁盘再悄悄满了

清理是一次性的,预防才是长期的:

  1. 磁盘用量告警:占用率到 80% 就告警,别等到 95% 才发现。云厂商的云监控一般自带磁盘告警,配一条就行。
  2. 日志轮转:所有自己写的服务都配 logrotate,按天轮转、保留 7 天或 14 天。
  3. 备份留存期:备份脚本里写死保留天数,生成新备份时顺手删过期备份,别只增不减。
  4. 定时巡检:每周跑一次 df -h,用量趋势心里有数;增长异常的目录,顺手 du 看一眼。

小结

磁盘满的排查就三步:df -h 看哪个分区满了,du -sh 逐层定位是谁占的,确认无用再清理。正在写的日志用清空不用删除,Docker 和旧内核是常被忽略的大户,inode 耗尽要按文件数量定位。清完之后把告警、轮转、备份留存期三件事配好,下次磁盘满之前就能提前收到提醒。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。