Linux 入门:用 df 和 du 定位磁盘被谁占满
磁盘突然写满时,服务会开始报 No space left on device,登录都可能变慢。先分清两件事:文件系统还剩多少空间,以及这些空间到底被哪个目录吃掉。df 看的是挂载点总量,du 看的是目录占用,两者配合就能在几分钟内把范围缩到一个目录。
先看每个挂载点还剩多少。-h 把字节换成易读单位,-T 带上文件系统类型,避免把 tmpfs 这种内存盘误当成数据盘。
df -hT
重点看 Use% 接近 100% 的挂载点,以及 Available 已经是 0 的行。如果根分区满了,再继续往下钻;如果只是数据盘或 /var 满了,就只在那个挂载点里查,不要在整台机器上漫无目的地搜索。
df 的已用空间和 du 加总有时对不上。常见原因有三个:一是还有进程占着已删除的文件,目录里看不见,空间却没释放;二是权限不够,du 跳过了别人的目录;三是把不同挂载点算进了同一个父目录。查已删除但仍被打开的文件可以用:
sudo lsof +L1
输出里体积很大、并且名字带 deleted 的行,就是还没释放的空间。处理方式是重启对应进程,或让进程自己关闭文件句柄,不要直接去删系统目录里看不懂的文件。
确认是哪个挂载点之后,用 du 从该挂载点往下看一层,并且不跨文件系统。-x 避免把别的盘算进来,–max-depth=1 只展开一层,sort 把大的放在最后,方便从底向上读。
sudo du -xh --max-depth=1 /var | sort -h
看到日志目录或容器数据目录特别大,就再对那一层重复同样的命令,一层层缩小范围。日志目录常见的是某个服务把调试日志打满;容器场景则经常是旧镜像和已经退出的容器。清理前先确认业务不再需要这些文件,必要时先把关键日志拷到别的磁盘。
如果 df 显示空间还够,但创建文件仍然失败,就改查 inode。inode 用尽时,系统同样会报空间不足,新手很容易在这里绕圈。
df -ih
IUse% 到 100% 时,多半是某个目录里堆了海量小文件,例如邮件队列、会话文件或缓存碎片。这时 du 看到的体积不一定大,要用 find 统计文件个数,再决定从哪一层下手。
sudo find /var -xdev -type f | wc -l
定位到目录后,优先清理明确可以再生成的缓存和已经轮转完成的旧压缩日志。不要用递归删除去扫系统目录。对还在写入的日志,把文件截断成空文件比直接删除更安全,因为进程仍握着原来的文件描述符,删除只会让空间继续被占住。
sudo truncate -s 0 /var/log/app/app.log
日常可以留一个只读检查习惯:每天看一次 df -hT 里的使用率,超过八成就按上面的步骤再钻一层。命令放进巡检笔记就够用,不必先上监控平台,也能先挡住磁盘半夜写满这类故障。把结论记成“哪个挂载点、哪个目录、哪类文件”,下次同类告警就能直接跳到同一层,而不是从头把整台机器再扫一遍。
- 点赞
- 收藏
- 关注作者
评论(0)