在 Linux 系统管理与运维中,磁盘空间监控与管理是保障系统稳定、高效运行的核心任务。无论是日志暴增、应用异常写入,还是存储规划不足,都会触发磁盘告急的警报。本文将从实用命令出发,逐步深入到自动化监控、排错技巧与优化策略,助你全面掌控 Linux 存储资源。
一、 基础核心:df 与 du 命令详解
1. df:文件系统宏观概览
`df` 命令是快速获取磁盘使用率的首选工具。其核心在于展示已挂载文件系统的整体容量、使用量与剩余空间。
关键参数解析:
`-h`(Human-readable):将字节转换为 KB、MB、GB 单位(强烈推荐日常使用)
`-T`:显示文件系统类型(如 ext4, xfs, tmpfs)
`-i`:显示 inode 使用情况(文件数量限制,对小文件场景至关重要)
`-x TYPE`:排除指定类型的文件系统
`output=field1,field2`:定制输出字段(如 `source,fstype,size,used,avail,pcent,target`)
经典应用示例:
bash
df -hT /home 查看 /home 分区的空间与文件系统类型
df -hi 查看所有分区的 inode 使用率(警惕 100% 情况)
df -h output=source,size,used,avail,pcent 精简输出关键信息
2. du:目录与文件微观分析
当 `df` 显示空间不足,但无法定位具体“大文件”时,`du` 命令是深入挖掘的利器。它统计目录或文件的磁盘实际占用。
关键参数解析:
`-h`:人性化显示大小
`-s`(Summarize):仅显示总大小(常用于快速获取目录总占用量)
`max-depth=N`:限制递归目录深度(排查大文件的黄金参数)
`-a`:显示所有文件的占用(默认只显示目录)
`-c`:最后显示总计
`time`:显示文件修改时间(辅助判断新旧文件)
高效排查技巧:
bash
du -sh /var/log/ 快速查看 /var/log 下各子目录总大小
du -h max-depth=1 /home | sort -h 找出 /home 下占用最大的顶级目录
du -ah /var | sort -hr | head -n 20 列出 /var 中最大的前20个文件/目录
二、 进阶工具:定位空间消耗的利器
1. ncdu:交互式可视化分析
`ncdu` (NCurses Disk Usage) 提供类图形化的终端界面,直观导航文件系统并排序目录大小。
安装与使用:
bash
sudo apt install ncdu Debian/Ubuntu
sudo yum install ncdu CentOS/RHEL
ncdu /path/to/scan 扫描指定目录
进入界面后,使用方向键导航,`d` 删除文件(需权限),`r` 刷新统计。
2. 定位占用空间进程:lsof
当文件被进程占用时,即使删除文件,空间也可能不会立即释放(直到进程关闭文件句柄)。`lsof` 可列出此类文件:
bash
lsof +L1 显示所有链接计数为0(已删除)但仍被打开的文件
lsof /var/log/syslog 查看谁在使用 syslog 文件
3. 工具对比与选择建议
| 工具 | 适用场景 | 优势 | 局限 |
| df | 快速查看分区整体使用率 | 简洁高效,宏观概览 | 无法定位具体目录/文件 |
| du | 分析目录/文件大小,定位大对象 | 灵活,可深度扫描,结合排序强大 | 递归扫描大目录可能较慢 |
| ncdu | 交互式探索目录结构,可视化空间分布 | 用户体验极佳,操作直观 | 需要额外安装 |
| lsof | 查找被进程占用导致空间未释放的文件 | 解决“幽灵”空间问题 | 输出信息较复杂 |
三、 实战排错:典型磁盘空间问题解决
案例1:根分区 `/` 即将用满
1. 宏观定位: `df -h /`
2. 微观分析:
bash
cd /
sudo du -h max-depth=1 2>/dev/null | sort -h 找出根下最大目录
3. 常见罪魁祸首:
`/var/log`:日志文件暴增(使用 `journalctl vacuum-size` 清理)
`/var/cache`:软件包缓存(`apt clean` 或 `yum clean all`)
Docker:镜像/容器/卷占用(`docker system prune -a volumes` 谨慎使用)
用户目录:大文件堆积(结合 `find /home -type f -size +500M` 搜索)
案例2:inode 耗尽导致磁盘有空间却无法写入
现象:`df -h` 显示空间充足,但 `df -i` 显示 inode 使用率 100%。
原因: 文件系统 inode 数量固定(通常在格式化时设定),海量小文件耗尽 inode。
解决:
bash
df -i 确认 inode 耗尽的分区
find /mount-point -type f | wc -l 统计文件总数(验证)
find /mount-point -xdev -printf '%h
' | sort | uniq -c | sort -nr 找出文件数最多的目录
根治: 清理无用小文件,或备份后重新格式化并增加 inode 数量(需谨慎操作)。
四、 深入理解:文件系统与空间管理的本质
1. 空间分配机制: Linux 文件系统(如 ext4, XFS)采用 inode 管理文件元数据,数据块存储实际内容。`df` 报告的是数据块的使用情况,`df -i` 报告 inode 使用情况。
2. “已删除”文件的空间释放: 文件被删除(`rm`)后,其数据块仅被标记为“空闲”,空间不会立即被新数据覆盖。若文件正被进程打开(`lsof` 可见),数据块仍被占用,直到进程关闭文件句柄。
3. `du` vs `df` 差异来源:
元数据差异: `df` 统计文件系统元数据(superblock)信息,反映整体分配。`du` 统计目录树中文件实际使用的块数。
挂载点影响: 子目录挂载了其他文件系统时,`du` 默认不跨越挂载点统计。
稀疏文件 (Sparse Files): `du` 报告实际分配的块,`df` 报告文件逻辑大小(可能大很多)。
已删除未释放文件: 导致 `df` 显示已用空间高,但 `du` 扫描不到该文件。
五、 高级策略:自动化监控与空间优化
1. 自动化监控脚本:
使用 Shell/Python 编写定期任务,结合 `df` 和 `du` 监控关键分区:
bash
!/bin/bash
CRITICAL=90
partition="/
usage=$(df -h "$partition" | awk 'NR==2 {print $5}' | tr -d '%')
if [[ $usage -ge $CRITICAL ]]; then
echo "WARNING: Partition $partition usage is ${usage}%!" | mail -s "Disk Space Alert"
可触发清理脚本或更高级通知
fi
2. LVM 弹性扩展:
使用逻辑卷管理(LVM)可在线扩展分区,无需停机:
bash
pvcreate /dev/sdb1 创建物理卷
vgextend vg_data /dev/sdb1 扩展卷组
lvextend -l +100%FREE /dev/vg_data/lv_home 扩展逻辑卷
resize2fs /dev/vg_data/lv_home 调整文件系统大小(ext)
xfs_growfs /mount-point 调整 XFS 文件系统
3. 日志管理与轮转:
配置 `logrotate`(`/etc/logrotate.conf` 及 `/etc/logrotate.d/`),按时间或大小轮转日志。
对于 systemd 系统:`journalctl vacuum-size=100M` 限制 journal 日志大小。
4. Docker 存储优化:
定期清理:`docker system prune -f`
更改存储驱动或存储路径(修改 `/etc/docker/daemon.json`)。
使用 `docker builder prune` 清理构建缓存。
5. 考虑现代文件系统特性:
Btrfs/ZFS: 提供透明压缩(`compress=zstd`)、写时复制(COW)、快照、内置配额等功能,节省空间并提升管理灵活性。
六、 最佳实践
1. 定期检查: 将 `df -h` 和 `df -i` 纳入日常巡检流程,尤其关注 `/`, `/var`, `/tmp` 等关键分区。
2. 精准定位: 空间告警时,先用 `df` 定位分区,再用 `du` 或 `ncdu` 定位具体目录/文件。
3. 预防为主: 实施日志轮转、配置缓存清理策略、规划好存储(尤其是 LVM)。
4. 理解工具差异: 掌握 `df` 与 `du` 结果不同的原因,避免误判。
5. 善用高级特性: 在合适场景采用 LVM、Btrfs/ZFS 等提升管理效率和空间利用率。
6. 自动化响应: 配置监控脚本,在空间达到阈值时自动告警或触发清理任务。
> 深入建议: 面对容器化部署,尤其要警惕日志和镜像存储的失控增长。建议将容器日志输出到外部集中式日志系统(如 Loki, ELK),并为 Docker 配置合理的存储驱动与定期清理策略。对于大型存储池,ZFS 或 Btrfs 的压缩与去重功能可带来显著的存储效率提升,但其复杂度也需评估。
延伸阅读资源:
`man df`, `man du`, `man ncdu`, `man lsof` (最权威的文档)
Linux 文件系统标准 (Filesystem Hierarchy Standard
LVM 官方文档 (`man lvm`)
Btrfs Wiki:
ZFS 文档:
通过掌握这些核心命令、理解底层原理并运用优化策略,你将能游刃有余地应对 Linux 系统中的任何磁盘空间挑战,确保系统高效稳定运行。