Linux查看文件系统硬盘使用情况(df命令)完全指南
在Linux系统中,磁盘空间管理是运维和开发人员的核心技能之一。当系统出现“磁盘空间不足”错误、应用响应缓慢或日志写入失败时,首先需要确认的就是文件系统的磁盘使用情况。df命令(全称“Disk Free”)是Linux中最常用的磁盘空间查看工具,它能快速报告所有挂载的文件系统的总容量、已用空间、可用空间及挂载点等关键信息。
无论是日常巡检、故障排查还是容量规划,df命令都是不可或缺的利器。本文将从基础语法到高级实战,全面解析df命令的使用方法,帮助你轻松掌握磁盘空间监控技巧。
目录#
- 简介
- df命令基础
- 常用选项详解
- 输出结果深度解读
- 实战场景与示例
- 5.1 快速查看整体磁盘使用情况
- 5.2 检查特定分区/挂载点
- 5.3 排查inode耗尽问题
- 5.4 筛选物理磁盘分区
- 5.5 监控远程文件系统(如NFS/Samba)
- 最佳实践与注意事项
- 6.1 始终使用-h提高可读性
- 6.2 定期监控与告警
- 6.3 inode使用与磁盘空间同等重要
- 6.4 避免被虚拟文件系统干扰
- 6.5 结合其他命令增强分析能力
- 常见问题与解决方案
- 7.1 df与du结果不一致?
- 7.2 文件已删除但磁盘空间未释放?
- 总结
- 参考资料
2. df命令基础#
2.1 什么是df命令#
df命令是Linux/Unix系统自带的工具,用于显示文件系统的磁盘空间使用情况。它通过读取/proc/mounts(或/etc/mtab)获取挂载信息,并查询文件系统的超级块(Super Block)来计算空间使用数据。与关注文件级空间使用的du命令不同,df专注于文件系统级的整体状态。
2.2 基本语法#
df命令的基本格式如下:
df [选项] [文件/目录]- 选项:控制输出格式、筛选内容等(详见第3节)。
- 文件/目录(可选):指定要查询的文件或目录所在的文件系统。如果省略,则默认显示所有挂载的文件系统。
3. 常用选项详解#
df命令的功能通过选项扩展,以下是最常用且实用的选项:
3.1 -h (--human-readable):人类可读格式#
作用:将字节数转换为KB、MB、GB等易读单位(1K=1024字节,1M=1024K,1G=1024M)。
场景:日常查看时必用,避免直接面对冗长的字节数字。
示例:
df -h输出:
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 20G 8.5G 11G 45% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
/dev/sdb1 100G 30G 70G 30% /data
解读:/dev/sda1(系统盘)总容量20G,已用8.5G,可用11G,使用率45%,挂载在根目录/。
3.2 -T (--print-type):显示文件系统类型#
作用:在输出中增加“文件系统类型”列(如ext4、xfs、tmpfs、nfs等)。
场景:需要区分本地磁盘、虚拟文件系统或远程文件系统时使用。
示例:
df -hT输出:
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda1 ext4 20G 8.5G 11G 45% /
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
/dev/sdb1 xfs 100G 30G 70G 30% /data
192.168.1.100:/nfs_share nfs4 50G 20G 30G 40% /mnt/nfs
解读:新增的“类型”列清晰显示:/dev/sda1是ext4格式,/mnt/nfs是NFS远程文件系统。
3.3 -i (--inodes):查看inode使用情况#
作用:显示inode的使用情况(而非磁盘空间),包括总inode数、已用数、可用数及使用率。
场景:排查“磁盘空间未用尽但无法创建文件”问题(通常因inode耗尽导致)。
示例:
df -i输出:
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sda1 1048576 123456 925120 12% /
tmpfs 1000000 1 999999 1% /dev/shm
/dev/sdb1 5242880 500000 4742880 9% /data
解读:/dev/sda1总inode数为1048576(约100万),已用12万,使用率12%,远未耗尽。若“已用(I)%”接近100%,即使磁盘空间充足,也无法创建新文件。
3.4 -a (--all):显示所有文件系统#
作用:默认情况下,df会排除一些特殊文件系统(如/proc、/sys、tmpfs等虚拟文件系统),-a选项会强制显示所有文件系统,包括这些“零容量”的虚拟系统。
注意:输出会包含大量无实际意义的虚拟文件系统,需结合筛选工具使用。
示例:
df -ah | grep -vE 'tmpfs|udev|proc|sysfs' # 排除虚拟文件系统,只保留有实际存储的输出:
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 20G 8.5G 11G 45% /
/dev/sdb1 100G 30G 70G 30% /data
192.168.1.100:/nfs_share 50G 20G 30G 40% /mnt/nfs
3.5 -x (--exclude-type):排除指定类型文件系统#
作用:排除指定类型的文件系统(如tmpfs、devtmpfs、nfs等),常用于只关注本地物理磁盘。
语法:df -x 类型1 -x 类型2 ...(可多次使用排除多种类型)。
示例:只显示物理磁盘(排除tmpfs、devtmpfs、nfs):
df -hT -x tmpfs -x devtmpfs -x nfs输出:
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda1 ext4 20G 8.5G 11G 45% /
/dev/sdb1 xfs 100G 30G 70G 30% /data
3.6 --output:自定义输出列#
作用:默认输出列固定,--output允许自定义需要显示的列(如只显示挂载点、容量、使用率),灵活满足个性化需求。
常用列参数:source(文件系统源)、fstype(类型)、size(容量)、used(已用)、avail(可用)、pcent(使用率)、target(挂载点)。
示例:只显示“挂载点、容量、已用、使用率”:
df -h --output=target,size,used,pcent输出:
挂载点 容量 已用 已用%
/ 20G 8.5G 45%
/dev/shm 3.9G 0 0%
/data 100G 30G 30%
/mnt/nfs 50G 20G 40%
4. 输出结果深度解读#
4.1 默认输出列含义#
以df -hT的输出为例,各列含义如下:
| 列名(中文) | 列名(英文) | 含义 |
|---|---|---|
| 文件系统 | Filesystem | 文件系统的设备名(如/dev/sda1)或远程挂载路径(如192.168.1.100:/nfs_share)。 |
| 类型 | Type | 文件系统格式(如ext4、xfs、nfs4)。 |
| 容量 | Size | 文件系统总容量。 |
| 已用 | Used | 已使用的磁盘空间(包含系统保留空间,默认约5%)。 |
| 可用 | Avail | 实际可用于普通用户的空间(总容量 - 已用 - 保留空间)。 |
| 已用% | Use% | 已用空间占总容量的百分比(包含保留空间)。 |
| 挂载点 | Mounted on | 文件系统在Linux目录树中的挂载路径(如/、/data)。 |
注意:可用列的值通常小于“总容量 - 已用”,因为Linux会为root用户预留约5%的空间(防止普通用户占满磁盘导致系统崩溃)。可通过tune2fs -m 2 /dev/sda1调整保留比例(如改为2%)。
4.2 特殊文件系统说明#
输出中常见的特殊文件系统及其特点:
| 文件系统类型 | 特点 | 示例挂载点 |
|---|---|---|
| tmpfs | 基于内存的临时文件系统,重启后数据丢失,用于临时文件(如/tmp)。 | /dev/shm、/tmp |
| devtmpfs | 存储设备节点(如/dev/sda),内核自动管理,大小固定。 | /dev |
| proc | 虚拟文件系统,提供内核和进程信息(如/proc/cpuinfo),无实际大小。 | /proc |
| sysfs | 虚拟文件系统,用于内核设备驱动管理,无实际大小。 | /sys |
| nfs/smbfs | 远程文件系统,数据存储在网络中的其他服务器,容量取决于远程服务器。 | /mnt/nfs |
5. 实战场景与示例#
5.1 快速查看整体磁盘使用情况#
需求:快速了解服务器所有挂载点的磁盘使用概况。
命令:
df -hT输出:直观展示各挂载点的容量、已用、可用及文件系统类型,适合日常巡检。
5.2 检查特定分区/挂载点#
需求:只关注/data分区的使用情况(如判断是否需要扩容)。
命令:
df -h /data # 或 df -hT /data输出:
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 100G 30G 70G 30% /data
5.3 排查inode耗尽问题#
症状:磁盘空间充足(df -h显示可用空间>10%),但创建文件时提示“设备上没有空间”(No space left on device)。
排查命令:
df -i # 检查inode使用率解决方案:删除大量小文件(如日志、缓存文件)释放inode。例如清理/var/log下的旧日志:
find /var/log -name "*.log" -mtime +30 -delete # 删除30天前的日志文件5.4 筛选物理磁盘分区#
需求:排除虚拟文件系统(tmpfs、proc等),只显示物理磁盘(如/dev/sda、/dev/sdb)。
命令:
df -hT -x tmpfs -x devtmpfs -x proc -x sysfs输出:仅包含物理磁盘分区和远程文件系统,减少干扰信息。
5.5 监控远程文件系统(如NFS/Samba)#
需求:检查挂载的NFS共享是否正常,以及远程磁盘使用情况。
命令:
df -hT | grep -E 'nfs|cifs' # 筛选NFS或Samba(cifs)文件系统输出:
192.168.1.100:/nfs_share nfs4 50G 20G 30G 40% /mnt/nfs
//192.168.1.200/share cifs 200G 50G 150G 25% /mnt/smb
6. 最佳实践与注意事项#
6.1 始终使用-h提高可读性#
原始输出(无-h)以字节为单位,数值冗长(如20971520表示20GB),难以直观理解。日常使用务必添加-h选项。
6.2 定期监控与告警#
通过脚本或监控工具(如Prometheus+Grafana、Zabbix)定期执行df -h,当使用率超过阈值(如85%)时触发告警,避免磁盘空间耗尽。
示例脚本(检查并告警):
#!/bin/bash
THRESHOLD=85 # 使用率阈值
df -h | awk 'NR>1 && $5+0 > '"$THRESHOLD"' {print "警告:"$0}' | mail -s "磁盘空间告警" [email protected]6.3 inode使用与磁盘空间同等重要#
新手常忽略inode监控,导致“空间充足却无法创建文件”的问题。定期执行df -i检查inode使用率,尤其是存储大量小文件的服务器(如日志服务器、数据库服务器)。
6.4 避免被虚拟文件系统干扰#
使用-x选项排除tmpfs、devtmpfs等虚拟文件系统,或通过grep筛选物理磁盘:
df -hT | grep -E 'ext4|xfs|btrfs' # 只显示常见物理文件系统类型6.5 结合其他命令增强分析能力#
- 排序:按使用率从高到低排序,快速定位最满的分区:
df -h | sort -k5nr # -k5:按第5列(已用%)排序,-nr:数字倒序 - 查找大文件:结合
du命令定位占用空间的大文件:df -h /data # 发现/data使用率高 du -sh /data/* | sort -hr # 查找/data下的大目录/文件
7. 常见问题与解决方案#
7.1 df与du结果不一致?#
现象:df -h /显示/分区已用80%,但du -sh /*统计的总大小仅占50%。
原因:df统计的是文件系统的块使用情况,而du统计的是文件实际大小,差异可能来自:
- 已删除但未关闭的文件:进程打开的文件被删除后,df仍视为“已用”,直到进程关闭文件。
- 文件系统保留空间:Linux为root预留的5%空间,
du无法统计。 - 隐藏文件/目录:
du /*未包含/proc、/sys等虚拟文件系统或隐藏文件(如.bash_history)。
解决方案:
- 检查已删除但未关闭的文件:
lsof | grep deleted,重启对应进程释放空间。 - 统计所有文件(包括隐藏文件):
du -sh / 2>/dev/null(2>/dev/null忽略错误)。
7.2 文件已删除但磁盘空间未释放?#
原因:文件被删除,但有进程仍在打开该文件(如日志文件被删除后,服务未重启),此时文件句柄未释放,空间不会被回收。
验证:通过lsof查找已删除的打开文件:
lsof | grep deleted | grep -E '/var/log|/tmp' # 重点检查日志和临时文件目录解决:重启持有文件句柄的进程,或通过echo > /path/to/deleted/file清空文件(无需重启进程)。
8. 总结#
df命令是Linux磁盘空间监控的基石,通过灵活运用-h(可读格式)、-T(文件系统类型)、-i(inode监控)等选项,可快速掌握文件系统状态。结合du、lsof等工具,能深入排查磁盘空间问题。记住以下核心要点:
- 日常巡检用
df -hT,关注“已用%”和“类型”列; - 排查inode问题用
df -i; - 筛选物理磁盘用
-x排除虚拟文件系统; - 结合
sort、grep等命令提升效率。
掌握df命令,让磁盘空间管理不再盲目!
9. 参考资料#
希望本文能帮助你全面掌握df命令的使用!如有疑问或补充,欢迎在评论区交流。