云主机磁盘快满时,用 df 和 du 先定位再清理
登录云主机,第一眼看到的告警经常是磁盘使用率。很多人下一步就去删日志,删完发现使用率几乎没动,因为大头根本不在 /var/log。df 和 du 是两把尺子:df 看每个挂载点还剩多少,du 看某个目录下面谁占得最多。顺序反了,就会在错误的盘上忙活。
先看挂载点,不要只看根分区
执行:
df -hT
-h 把字节换成 G、M,T 带上文件系统类型。输出里每一行是一个挂载点。关注两列:Size 和 Use%。云主机上常见的情况是根分区 / 已经 90% 以上,而数据盘 /data 还很空,或者正好相反。先确认告警打在哪一块盘上,再进入对应的挂载点。
有一行 tmpfs 或 overlay 占用看起来很高,多半是内存盘或容器层,不要把它当成要清理的业务盘。只对真实的 ext4、xfs 挂载点做下一步。
再用 du 从挂载点往下拆
进入告警所在的目录,例如根分区:
sudo du -xh --max-depth=1 / | sort -h
-x 不跨文件系统,避免把另一块盘的数字算进来。–max-depth=1 只列一层,sort -h 按大小排序。输出最后一行通常是总计,倒数第二行就是当前最大的子目录。
假设 /var 最大,就再执行一次:
sudo du -xh --max-depth=1 /var | sort -h
这样一层一层往下走,比在满屏数字里肉眼找大户更稳。常见的大头有:/var/log 里没有轮转的日志,/var/lib/docker 里没清理的镜像和容器层,/tmp 里残留的安装包,以及。某个用户家目录下的数据集。
看文件而不是只看目录
目录收到一层之后,再找出具体文件:
sudo find /var/log -type f -size +100M -printf '%s %p\n' | sort -n
-size +100M 只列出超过 100MB 的文件。先列出,再决定删不删。正在被进程写着的日志,直接 rm 之后空间不一定马上回来,因为进程还握着已经删除的文件描述符。这种情况要先让服务重新打开日志,或者用 truncate 把文件截成空文件,而不是在服务还在写的时候把文件删掉就以为空间回来了。
清理前的三条界线
第一,不删看不懂的目录。/var/lib 下面有数据库和包管理器的数据,只因为数字大就删,服务会起不来。
第二,docker 目录大,优先用 docker system df 看镜像、容器、卷各占多少,再用 docker image prune 清理悬空镜像。不要直接 rm -rf /var/lib/docker,那会把还在跑的容器一起毁掉。
第三,df 和 du 对不上时,先想是不是有文件已经删除但仍被占用。可以执行:
sudo lsof +L1
它列出链接数为 0、仍被进程打开的文件。确认进程后,重启对应服务,空间才会还给文件系统。
小结
磁盘告警的处理顺序是:df -hT 确认是哪一块盘,du -xh --max-depth=1 一层层找出目录,find 找出超大文件,最后再按目录的用途清理。先定位、再动手,比对着根目录一顿删除更安全,也更快。
- 点赞
- 收藏
- 关注作者
评论(0)