Linux 磁盘满了别慌:用 du 和 df 一步步定位大文件
【摘要】 服务器上最常见的半夜报警之一就是磁盘满了:服务写不进日志、数据库拒绝写入、上传失败。别一上来就到处删文件,先花两分钟定位,再动手清理,顺序对了才不会误删。 第一步:先看整体,df 告诉你满的是哪块盘df -h看 Use% 最高的那一行,再看它挂载在哪个目录(/、/var、/data 各自独立的话,清理目标完全不同)。还有一个容易被忽略的指标:df -i这是 inode 使用率。小文件特别多时...
服务器上最常见的半夜报警之一就是磁盘满了:服务写不进日志、数据库拒绝写入、上传失败。别一上来就到处删文件,先花两分钟定位,再动手清理,顺序对了才不会误删。
第一步:先看整体,df 告诉你满的是哪块盘
df -h
看 Use% 最高的那一行,再看它挂载在哪个目录(/、/var、/data 各自独立的话,清理目标完全不同)。还有一个容易被忽略的指标:
df -i
这是 inode 使用率。小文件特别多时,磁盘空间明明还剩不少,inode 先用完了,照样写不进新文件。这时删大文件没用,得清掉成堆的小文件(比如过期的会话文件、缓存碎片)。
第二步:用 du 逐层往下钻
du -sh /*
du -h --max-depth=1 /var | sort -h
du -sh 看一级目录各占多少,sort -h 按人类可读的大小排好序,最大的自然沉到底部。再对最大的那个目录重复一次,两三层就能锁定到具体目录。两个小提醒:加 -x 可以不跨文件系统,避免把挂载进来的另一块盘也算进来;在 /proc、/sys 这类虚拟目录里钻没有意义,它们不占真实磁盘。
第三步:先查这几处常见大户
- 日志:
/var/log是重灾区。先看journalctl --disk-usage,再决定要不要用journalctl --vacuum-size=500M收紧。正在被写着的日志不要直接rm,用: > 文件名或truncate清空更稳,删了文件、进程还攥着句柄的话空间也不会释放。 - 已删但未释放的文件:
df显示满、du却算不出那么大,八成是它。用lsof | grep deleted找出来,重启对应进程或让它重新打开文件,空间才会真正回来。 - 临时与缓存:
/tmp里的旧文件、包管理器的缓存、容器镜像层,都值得看一眼。容器环境别上来就docker system prune -a,它会连没在跑的镜像一起清,生产机上先确认再动手。
清理的三条原则
- 先定位、后删除:不知道是什么文件之前不删,尤其不碰数据库目录和系统目录。
- 删前留一手:不确定的先移到别处放一天,确认服务正常再彻底删,比直接删多一道保险。
- 清完要复查:再跑一次
df -h,确认使用率真的降下来了;如果是日志失控长出来的,顺手把日志轮转(logrotate)配好,否则下周还会满。
小结
磁盘满的处理就四步:df -h 看哪块盘满、df -i 排除 inode 满、du 逐层定位、针对日志、已删未释放文件和缓存这几类大户清理。按这个顺序走,既快又不容易误删,比凭感觉删文件稳得多。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)