第 9 章 · 磁盘、挂载与空间排查
本章目标:用 df/du 判断「盘满了还是 inode 满了」;找到 shop-demo / 日志里的大文件;理解 logrotate 为何防止日志撑爆磁盘;为 ch10 读日志、ch04 超大 api.log .cleanup 打基础。
学时建议:3~4 小时(含 2 小时跟练)
前置:完成 linux-shell ch08(可选:已在远端有 shop-demo)。
9.1 场景说明:服务突然不能写日志也不能建表
测试环境 api-go-demo 一夜告警沉默。SSH 上去:
systemctl status api-go-demo可能仍显示 running- 但
curl healthz超时或 500 - 开发
touch /tmp/test报No space left on device
运维老手第一反应不是重启,而是:
df -h
df -i
本章教你区分 容量满(GB) 与 inode 满(小文件太多),并在 ~/dev-workspace 里模拟排查。
9.2 学完你能
| 能力 | 验收 |
|---|---|
| df | 读出 Use%、Mounted on |
| du | 找出 dev-workspace 下最大子目录 |
| inode | 解释 df -i 100% 时 du 还有空间 |
| find | 找 >10M 大文件 |
| logrotate | 读一条配置,知日志为何会 .1 .gz |
| 应急 | 知删日志后仍满要 truncate / 重启进程 |
9.3 df:看分区「还剩多少 GB」
步骤 1
df -h
你应该看到类似:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 40G 12G 26G 32% /
读懂列:
| 列 | 含义 |
|---|---|
| Size / Used / Avail | 总 / 已用 / 可用(人类可读 -h) |
| Use% | 超过 90% 要警惕 |
| Mounted on | 挂载点;/ 是根分区 |
步骤 2 — 只看根分区
df -h /
步骤 3 — WSL 用户
WSL 的 df 有时显示 ext4.vhdx,满的是虚拟磁盘——仍用 du 找大目录清理。
9.4 df -i:inode 满(新手大坑)
步骤 1
df -i
df -ih /
你应该看到 IUse% 列。若 100%,即使 df -h 还有 GB 空闲,也无法创建新文件。
为什么:ext4 为每个文件分配一个 inode;百万小文件(缓存、session、错误日志碎片)会耗尽 inode。
典型症状:
- 报错
No space left on device - 但
du -sh /*加起来远小于磁盘 Size
步骤 2 — 谁 inode 多(选修,可能慢)
sudo find /var/spool /tmp ~/dev-workspace -xdev -type f 2>/dev/null | wc -l
9.5 du:谁占用了空间
步骤 1 — 家目录总占用
du -sh ~
du -sh ~/dev-workspace
步骤 2 — 分解 dev-workspace
du -h --max-depth=1 ~/dev-workspace | sort -hr
你应该看到类似:
120M shop-demo
45M logs
2.1M linux-notes
读懂:sort -hr 按人类可读大小降序——最大的是谁一眼看出。
步骤 3 — 跟练:故意制造大日志(教学)
mkdir -p ~/dev-workspace/logs
# 追加 50MB(约 1 分钟,可 Ctrl+C 提前停)
dd if=/dev/zero of=~/dev-workspace/logs/big-teaching.log bs=1M count=50 status=progress
du -sh ~/dev-workspace/logs
df -h /
步骤 4 — 清理练习
rm ~/dev-workspace/logs/big-teaching.log
du -sh ~/dev-workspace/logs
为什么 先 du 再 rm:生产禁止 rm -rf /;删前 pwd、路径写全。