Linux df -h 命令详解:从基础到高级应用

在 Linux 系统管理中,磁盘空间监控是日常运维的基础任务之一。无论是普通用户检查个人目录占用,还是系统管理员排查磁盘爆满问题,df 命令都是不可或缺的工具。其中,df -h 更是最常用的组合之一,因其输出“人类可读”(Human-Readable)的磁盘空间信息而广受欢迎。

本文将从 df 命令的基础原理出发,详细解析 df -h 的用法、输出含义、常见场景及高级技巧,帮助读者全面掌握这一核心工具,提升磁盘管理效率。

目录#

  1. df 命令简介
  2. df -h:人类可读的磁盘空间查看
  3. 基本语法与常用选项
  4. 输出结果详解
  5. 常见用法示例
  6. 高级选项与场景
  7. 日常使用习惯
  8. 最佳实践
  9. 常见问题与排查
  10. 参考资料

1. df 命令简介#

df(Disk Free 的缩写)是 Linux/Unix 系统中用于报告文件系统磁盘空间使用情况的命令行工具,属于 GNU Coreutils 软件包,几乎所有 Linux 发行版默认预装。其核心功能是显示已挂载文件系统的总容量、已用空间、可用空间及挂载点等信息。

df 命令的历史可追溯至 Unix 早期版本,如今已成为 POSIX 标准的一部分,确保了在不同类 Unix 系统(如 Linux、macOS、FreeBSD)中的兼容性。

2. df -h:人类可读的磁盘空间查看#

默认情况下,df 命令输出的磁盘大小以字节(Bytes) 为单位,数值庞大且难以直观理解(例如 1073741824 字节)。而 -h 选项(--human-readable 的缩写)的作用是将字节转换为人类易读的单位(如 KB、MB、GB、TB),并自动选择最合适的单位(例如 1G 代替 1024M)。

对比示例

  • 默认输出(字节):
    Filesystem     512-blocks    Used Available Capacity Mounted on
    /dev/sda1       209715200 52428800 157286400     25% /
  • df -h 输出(人类可读):
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda1       200G   50G  150G  25% /

显然,df -h 的输出更直观,因此成为日常使用的首选。

3. 基本语法与常用选项#

3.1 基本语法#

df 命令的基本格式为:

df [选项]... [文件系统/挂载点]...
  • 选项:控制输出格式、过滤文件系统等(如 -h-T-i)。
  • 文件系统/挂载点:可选参数,指定要查询的文件系统(如 /dev/sda1)或挂载点(如 /home),不指定则显示所有已挂载文件系统。

3.2 与 -h 搭配的常用选项#

df -h 可结合其他选项实现更灵活的查询,以下是最常用的搭配:

选项全称作用
-a--all显示所有文件系统(包括大小为 0 的伪文件系统,如 /proc
-T--print-type输出中增加“文件系统类型”列(如 ext4、tmpfs、xfs)
-i--inodes显示 inode 使用情况(替代默认的块使用情况)
-t--type=类型仅显示指定类型的文件系统(如 -t ext4
-x--exclude-type=类型排除指定类型的文件系统(如 -x tmpfs
-l--local仅显示本地文件系统(排除网络文件系统如 NFS)
-P--portable输出格式标准化(适合脚本解析,列宽固定)

4. 输出结果详解#

执行 df -h 后,输出通常包含 6 列,每列含义如下:

4.1 输出列说明#

列名含义示例
Filesystem文件系统标识/dev/sda1(设备名)、tmpfs(临时文件系统)、UUID=xxx(UUID 标识)
Size文件系统总容量200G(总大小为 200GB)
Used已使用空间50G(已用 50GB)
Avail可用空间(非 root 用户)145G(普通用户可使用 145GB)
Use%使用率百分比25%(已用 25%)
Mounted on挂载点/(根目录)、/home(用户目录)

4.2 关键注意点#

  • Avail 与“Size - Used”的差异
    Avail 通常小于 Size - Used,因为 Linux 会默认保留 5% 的空间给 root 用户(防止普通用户占满磁盘导致系统不可用)。可通过 tune2fs -l /dev/sda1 | grep "Reserved block count" 查看保留空间。

  • Filesystem 的多种形式
    可能显示设备路径(如 /dev/sda1)、UUID(如 UUID=8a3...)或标签(如 LABEL=ROOT),具体取决于 /etc/fstab 配置。

  • 虚拟文件系统
    tmpfs(临时内存文件系统)、devtmpfs(设备文件系统)等,其 Size 通常基于物理内存,重启后数据会丢失。

5. 常见用法示例#

以下是 df -h 结合不同选项的实战场景,覆盖日常 90% 的使用需求。

5.1 基础用法:查看所有已挂载文件系统#

df -h

输出

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       200G   50G  145G  26% /
tmpfs           7.8G     0  7.8G   0% /dev/shm
/dev/sdb1       500G  200G  275G  43% /data

5.2 查看指定挂载点的磁盘使用#

如需单独检查 /home 目录的空间:

df -h /home

输出

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       100G   30G   65G  32% /home

5.3 显示文件系统类型(-T)#

排查“某目录为何占用异常”时,文件系统类型是重要线索(如 tmpfs 基于内存,空间满了需清理临时文件):

df -hT

输出

Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda1      ext4      200G   50G  145G  26% /
tmpfs          tmpfs     7.8G     0  7.8G   0% /dev/shm
/dev/sdb1      xfs       500G  200G  275G  43% /data

5.4 查看 inode 使用情况(-i)#

磁盘爆满不一定是“空间不足”,也可能是“inode 耗尽”(每个文件/目录需占用 1 个 inode)。通过 -i 选项可查看 inode 状态:

df -hi

输出

Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/sda1       12.5M  1.2M  11.3M   10% /
tmpfs           2.0M    64  2.0M    1% /dev/shm

注意:若 IUse% 接近 100%,即使 Use% 较低,也会提示“无空间可用”。

5.5 过滤特定类型的文件系统(-t/-x)#

  • 仅显示 ext4 类型
    df -ht ext4
  • 排除 tmpfs 和 devtmpfs(虚拟文件系统)
    df -hx tmpfs -x devtmpfs

5.6 查看所有文件系统(包括伪文件系统,-a)#

默认 df -h 会忽略伪文件系统(如 /proc/sys),-a 选项可显示所有文件系统(常用于调试):

df -ha

输出

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       200G   50G  145G  26% /
proc               0     0     0    - /proc
sysfs              0     0     0    - /sys
tmpfs           7.8G     0  7.8G   0% /dev/shm

6. 高级选项与场景#

6.1 自定义输出列(--output)#

通过 --output 选项可指定需要显示的列,减少冗余信息(适合脚本解析)。例如,仅显示“挂载点、使用率、类型”:

df -h --output=source,fstype,pcent,target

输出

Filesystem     Type Use% Mounted on
/dev/sda1      ext4  26% /
/dev/sdb1      xfs   43% /data

6.2 计算磁盘总占用(--total)#

--total 选项会在输出末尾增加一行“总计”,方便统计所有文件系统的总空间:

df -h --total

输出

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       200G   50G  145G  26% /
/dev/sdb1       500G  200G  275G  43% /data
total           700G  250G  420G  38% -

6.3 排查网络文件系统(NFS/CIFS)#

通过 -l 选项排除本地文件系统,仅显示网络文件系统(如 NFS):

df -hl --exclude-type=ext4 --exclude-type=xfs

7. 日常使用习惯#

以下是结合 df -h 的常见操作场景,帮助形成高效的磁盘管理习惯:

7.1 定期检查磁盘使用率#

普通用户可通过 df -h 快速了解个人目录(如 /home/用户名)的空间占用,避免因下载大文件导致磁盘爆满。

7.2 安装软件前确认空间#

安装大型软件(如 Docker、数据库)前,用 df -h /var 检查 /var 目录(软件安装默认路径)是否有足够空间。

7.3 清理日志/缓存后验证效果#

删除 /var/log 下的大日志文件后,通过 df -h /var 确认空间是否释放(注意:若日志文件被进程占用,需重启进程才能释放空间)。

7.4 脚本中解析磁盘使用率#

结合 -P 选项(标准化输出)和 awk 提取使用率,用于监控告警脚本:

# 检查根目录使用率是否超过 80%
root_usage=$(df -hP / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $root_usage -gt 80 ]; then
  echo "根目录使用率超过 80%!"
fi

8. 最佳实践#

8.1 始终使用 -h 提高可读性#

除非脚本需要原始字节数据,否则优先使用 df -h,避免因数字冗长导致误判。

8.2 结合 -T 识别文件系统类型#

排查磁盘问题时,df -hT 可快速区分“本地磁盘”(ext4/xfs)、“内存文件系统”(tmpfs)和“网络磁盘”(nfs),针对性处理(如 tmpfs 满了需清理 /tmp)。

8.3 定期监控 inode 使用(df -hi#

inode 耗尽是隐性问题,建议与磁盘空间监控同步进行(如每周执行 df -hi 检查)。

8.4 排除无关虚拟文件系统#

日常检查时,用 -x tmpfs -x devtmpfs 排除内存文件系统,聚焦真实磁盘:

df -hx tmpfs -x devtmpfs

8.5 避免频繁查询不存在的挂载点#

若指定的挂载点未挂载(如 df -h /mnt/usb),df 会报错并显示所有文件系统,建议先通过 mount | grep /mnt/usb 确认挂载状态。

9. 常见问题与排查#

9.1 问题:删除文件后磁盘空间未释放#

现象:执行 rm bigfile.log 后,df -h 显示空间未减少。
原因:文件被进程占用(如日志文件被 rsyslog 进程锁定),删除后仅目录项被移除,实际空间需进程释放后才释放。
解决

  1. lsof +L1 查找“已删除但仍被占用的文件”:
    lsof +L1 | grep bigfile.log
  2. 重启占用进程(如 systemctl restart rsyslog)或通过 kill -HUP 进程ID 刷新文件句柄。

9.2 问题:Avail 显示为负数#

现象df -hAvail 列出现负数(如 -10G)。
原因:root 预留的 5% 空间也被用尽,通常是异常程序占用大量磁盘(如日志无限增长)。
解决

  1. 紧急清理大文件(如 du -sh /var/log/* 定位大日志)。
  2. 临时调整预留空间(仅临时生效):
    tune2fs -m 1 /dev/sda1  # 将预留空间改为 1%

9.3 问题:网络文件系统(NFS)显示大小异常#

现象df -h 显示 NFS 挂载点大小与服务器实际不符。
原因:NFS 客户端缓存或服务器端配置问题。
解决

  1. 清除客户端缓存:mount -o remount /mnt/nfs
  2. 检查服务器端 df -h 确认实际空间。

10. 参考资料#

通过本文,相信你已全面掌握 df -h 的用法。从基础查询到高级过滤,从日常监控到问题排查,这一命令将成为你 Linux 系统管理的得力助手。记住:磁盘空间管理的核心是“预防为主”,定期执行 df -hdf -hi,让磁盘问题无处遁形!