Linux 服务器磁盘满了:从定位到清理的排查手册
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
几个最常见的"空间大户":
- 日志目录
/var/log:服务日志没做轮转,几年下来能攒几十 GB。先看单个文件大小:ls -lh /var/log。 - 临时目录
/tmp:程序异常退出留下的临时文件、上传一半的大文件。 - Docker 数据目录
/var/lib/docker:镜像、容器日志、匿名卷,没清理过的话几十 GB 很常见。 - 数据库目录
/var/lib/mysql:除了数据文件,binlog没过期清理也会越攒越多。 - 备份目录:定时备份脚本只管生成不管删除,旧备份越积越多。
三、清理:先删能删的,别动在用的
定位到大户之后再动手清理,顺序是先易后删、先外后内:
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%,连登录、写日志都受影响,先做应急腾挪:
- 立刻清一块空间出来:先删一两个确定无用的大日志文件,让系统恢复写入能力,再慢慢排查。
- 别重启服务:重启时服务要写日志、写 PID 文件,磁盘满着可能起不来,先腾空间再重启。
- 临时挂一块盘:云服务器可以临时挂一块数据盘,把最大的目录(比如
/var/log或数据库目录)挪过去,先恢复业务,再做彻底清理。
五、预防:别让磁盘再悄悄满了
清理是一次性的,预防才是长期的:
- 磁盘用量告警:占用率到 80% 就告警,别等到 95% 才发现。云厂商的云监控一般自带磁盘告警,配一条就行。
- 日志轮转:所有自己写的服务都配
logrotate,按天轮转、保留 7 天或 14 天。 - 备份留存期:备份脚本里写死保留天数,生成新备份时顺手删过期备份,别只增不减。
- 定时巡检:每周跑一次
df -h,用量趋势心里有数;增长异常的目录,顺手du看一眼。
小结
磁盘满的排查就三步:df -h 看哪个分区满了,du -sh 逐层定位是谁占的,确认无用再清理。正在写的日志用清空不用删除,Docker 和旧内核是常被忽略的大户,inode 耗尽要按文件数量定位。清完之后把告警、轮转、备份留存期三件事配好,下次磁盘满之前就能提前收到提醒。
- 点赞
- 收藏
- 关注作者
评论(0)