Linux磁盘空间管理:df与du命令详解与实战技巧
在日常的 Linux 系统管理和运维工作中,磁盘空间管理是一个绕不开的话题。无论是服务器磁盘告警、应用部署失败,还是日常文件清理,我们都需要快速准确地了解磁盘使用情况。df 和 du 这两个命令就是 Linux 系统中最常用、最基础的磁盘空间分析工具。虽然它们看似简单,但许多开发者对其区别、使用技巧和常见误区并不完全清楚。本文将深入解析 df 和 du 命令,通过大量实战示例带你掌握从基础使用到高级技巧的全套技能。
本文适合 Linux 初学者、系统管理员、后端开发人员以及任何需要管理 Linux 服务器的技术人员。通过学习,你将能够熟练使用这两个命令快速定位磁盘空间问题,理解它们输出结果的含义差异,并掌握在生产环境中进行磁盘空间分析和清理的完整工作流。
1. 磁盘空间管理基础概念
1.1 为什么需要磁盘空间管理
在 Linux 系统中,磁盘空间不足会导致各种问题:应用程序无法写入日志、数据库无法正常操作、系统服务启动失败等。及时监控和管理磁盘空间是保证系统稳定运行的基本要求。df(disk free)和 du(disk usage)就是为此而生的工具,它们从不同角度帮助我们了解磁盘使用情况。
1.2 df 与 du 的根本区别
很多初学者容易混淆这两个命令,其实它们的关注点完全不同:
- df 命令:关注文件系统级别的磁盘空间使用情况。它显示每个挂载点的总空间、已用空间、可用空间等信息,基于文件系统的超级块数据,读取速度快。
- du 命令:关注文件和目录级别的磁盘使用情况。它通过递归统计目录中所有文件的大小来计算磁盘使用量,结果更精确但速度较慢。
简单来说,df 告诉你"磁盘还剩多少空间",而 du 告诉你"某个目录占用了多少空间"。
1.3 磁盘空间相关的重要概念
在深入学习命令之前,需要了解几个关键概念:
- inode:文件系统用于存储文件元数据的数据结构,每个文件或目录对应一个 inode。inode 耗尽会导致无法创建新文件,即使磁盘还有剩余空间。
- 块(Block):磁盘空间分配的基本单位,通常为 4KB。
- 挂载点(Mount Point):文件系统中目录与存储设备的关联点。
- 硬链接:多个文件名指向同一个 inode,会影响
du的统计结果。
2. 环境准备与命令基础
2.1 测试环境说明
本文示例基于以下环境,但命令在不同 Linux 发行版中基本通用:
- 操作系统:Ubuntu 20.04 LTS
- 内核版本:5.4.0-xx-generic
- Shell:Bash 5.0.17
如果你的系统环境不同,命令的基本用法相同,部分输出格式可能略有差异。
2.2 命令基本语法
两个命令的基本语法格式如下:
如果不指定文件或目录,df 显示所有挂载点的信息,du 显示当前目录的使用情况。
3. df 命令详解与实战
3.1 df 基础使用
最简单的用法是直接运行 df 命令:
输出示例:
各列含义:
- Filesystem:文件系统对应的设备路径
- 1K-blocks:总空间(1KB 为单位)
- Used:已用空间
- Available:可用空间
- Use%:使用百分比
- Mounted on:挂载点
3.2 df 常用选项详解
3.2.1 人性化显示(-h)
最常用的选项是 -h(human-readable),以易读的单位(K、M、G)显示大小:
输出示例:
3.2.2 显示文件系统类型(-T)
-T 选项显示文件系统类型:
输出示例:
常见的文件系统类型包括:ext4、xfs、ntfs、vfat、tmpfs 等。
3.2.3 显示 inode 信息(-i)
-i 选项显示 inode 使用情况,对于排查"No space left on device"但实际有空间的问题非常有用:
输出示例:
如果 IUse% 达到 100%,即使磁盘还有空间也无法创建新文件。
3.3 df 高级用法
3.3.1 排除特定文件系统
使用 -x 选项排除特定类型的文件系统:
3.3.2 显示特定目录所在文件系统
查看某个目录所在的文件系统空间情况:
4. du 命令详解与实战
4.1 du 基础使用
直接运行 du 命令显示当前目录下各子目录的磁盘使用情况:
输出示例:
默认以 KB 为单位显示每个目录的大小。
4.2 du 常用选项详解
4.2.1 人性化显示(-h)
与 df 一样,-h 选项使输出更易读:
输出示例:
4.2.2 显示总大小(-s)
-s(summarize)选项只显示总大小,不显示子目录详情:
输出示例:
4.2.3 设置最大深度(--max-depth)
控制显示目录的深度,非常实用:
4.3 du 高级用法与技巧
4.3.1 排序找出最大目录
结合 sort 命令找出占用空间最大的目录:
输出示例:
4.3.2 排除特定文件类型
使用 --exclude 选项排除特定模式的文件:
4.3.3 显示修改时间(--time)
显示目录大小及最后修改时间:
5. df 与 du 结果差异分析
5.1 为什么 df 和 du 的结果不一致
这是实际工作中经常遇到的问题,主要有以下几个原因:
5.1.1 已删除文件仍被进程占用
当文件被删除但仍有进程在使用时,df 显示的空间不会立即释放,而 du 不会统计已删除的文件:
5.1.2 文件系统预留空间
大多数文件系统会为 root 用户保留约 5% 的空间,这部分空间 du 不会统计,但 df 会显示为已用空间。
5.1.3 日志文件系统开销
如 ext4、xfs 等日志文件系统需要空间存储日志,这部分开销也会导致差异。
5.2 解决差异的实用方法
5.2.1 查找被占用已删除的文件
使用 lsof 命令查找被进程占用但已删除的文件:
5.2.2 重启相关进程释放空间
找到占用文件的进程后,可以重启该进程释放空间:
6. 实战案例:磁盘空间问题排查流程
6.1 案例背景
假设收到磁盘空间告警,/var 分区使用率超过 90%,需要快速定位问题并解决。
6.2 排查步骤
6.2.1 第一步:确认问题范围
6.2.2 第二步:分析大目录
输出示例:
6.2.3 第三步:深入分析问题目录
输出示例:
6.2.4 第四步:检查日志文件轮转配置
6.2.5 第五步:清理和优化
6.3 预防措施
6.3.1 设置日志轮转策略
编辑 /etc/logrotate.d/ 下的配置文件,确保日志及时轮转和清理。
6.3.2 监控告警设置
配置监控系统,在磁盘使用率达到 80% 时提前告警。
7. 高级技巧与脚本自动化
7.1 常用组合命令脚本
7.1.1 磁盘空间监控脚本
7.1.2 大文件查找脚本
7.2 定时任务自动化
设置 crontab 定期检查磁盘空间:
8. 常见问题与解决方案
8.1 df 和 du 显示结果差异大
问题现象:df 显示磁盘快满了,但 du 统计的大小小很多。
解决方案:
- 检查是否有进程占用了已删除的文件:
lsof | grep deleted - 重启相关进程或服务
- 检查文件系统是否需要清理(如 docker 的虚悬镜像)
8.2 磁盘空间不足但找不到大文件
问题现象:磁盘使用率高,但用 du 找不到占用空间的大文件。
解决方案:
- 检查隐藏文件和目录:
du -sh .[!.]* * 2>/dev/null - 检查是否有大量小文件:
find /path -type f | wc -l - 使用
ncdu工具进行交互式分析
8.3 无法删除文件但磁盘空间不足
问题现象:想要清理文件但提示权限不足或文件正在使用。
解决方案:
- 使用
sudo获取权限:sudo rm -f filename - 检查文件是否被进程占用:
lsof filename - 对于系统重要文件,先确认是否可以删除
8.4 inode 耗尽问题
问题现象:df -h 显示有空间,但创建文件失败,df -i 显示 inode 用尽。
解决方案:
- 查找包含大量小文件的目录:
find /path -type f | awk -F/ '{print $2}' | sort | uniq -c | sort -rn - 清理临时文件和小文件
- 考虑使用更大 inode 数量的文件系统
9. 最佳实践与工程建议
9.1 日常监控策略
- 建立基线:记录正常业务时段的磁盘使用情况,建立基准线
- 设置多级阈值:警告阈值(80%)、严重阈值(90%)、紧急阈值(95%)
- 关键目录监控:重点监控 /var、/home、/tmp 等易增长目录
9.2 清理操作规范
- 删除前备份:重要日志和文件删除前先备份
- 使用 truncate 而非 rm:对于正在写入的日志文件,用
truncate清空内容而非删除 - 确认文件重要性:不确定的文件先移动至临时目录观察一段时间
9.3 预防性维护
- 日志轮转配置:合理配置 logrotate,避免日志无限增长
- 定期归档:对历史数据定期归档到备份存储
- 容量规划:根据业务增长趋势提前规划磁盘扩容
9.4 工具推荐
- ncdu:交互式磁盘使用分析工具,比 du 更直观
- baobab:图形化磁盘分析工具(GNOME 环境)
- lsof:查看文件被进程占用情况
- logrotate:日志轮转管理工具
掌握 df 和 du 命令的熟练使用是每个 Linux 使用者的基本功。通过本文的详细讲解和实战案例,你应该能够应对大多数磁盘空间管理场景。在实际工作中,建议将磁盘空间监控纳入日常运维流程,建立自动化的告警和清理机制,防患于未然。