Linux df 命令详解:查看磁盘空间、inode 与文件系统类型

当你要排查磁盘已满的告警、在部署前确认可用空间、或者核查 inode 使用情况时,df 命令通常都是第一个要跑的工具。

df 命令(取自 disk free,即「可用磁盘空间」)用于报告已挂载文件系统上已用和可用的磁盘空间,是 Linux 系统上监控存储状况的必备工具之一。

本文将通过实用示例,讲解 df 命令的用法,并覆盖它的所有常用选项。

df 命令语法

df 命令的通用语法如下:

df [OPTIONS] [FILESYSTEM...]

不带任何参数执行时,df 会显示所有已挂载文件系统的信息:

df
Filesystem     1K-blocks      Used Available Use% Mounted on
dev              8172848         0   8172848   0% /dev
run              8218640      1696   8216944   1% /run
/dev/nvme0n1p3 222284728 183057872  27865672  87% /
tmpfs            8218640    150256   8068384   2% /dev/shm
tmpfs            8218640         0   8218640   0% /sys/fs/cgroup
tmpfs            8218640        24   8218616   1% /tmp
/dev/nvme0n1p1    523248    107912    415336  21% /boot
/dev/sda1      480588496 172832632 283320260  38% /data
tmpfs            1643728        40   1643688   1% /run/user/1000

每一行包含以下各列:

  • Filesystem — 文件系统的名称。
  • 1K-blocks — 文件系统的总大小,以 1K 块为单位。
  • Used — 已用空间,以 1K 块为单位。
  • Available — 可用空间,以 1K 块为单位。
  • Use% — 已用空间的百分比。
  • Mounted on — 该文件系统的挂载目录。

要查看某个特定文件系统的信息,把它的设备名或挂载点传给 df 即可:

df /
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/nvme0n1p3 222284728 183057872  27865672  87% /

人类可读的输出

默认情况下,df 以 1K 块为单位显示容量。想以人类可读的格式(KB、MB、GB)显示,请使用 -h 选项:

df -h
Filesystem      Size  Used Avail Use% Mounted on
dev             7.8G     0  7.8G   0% /dev
run             7.9G  1.7M  7.9G   1% /run
/dev/nvme0n1p3  212G  175G   27G  87% /
tmpfs           7.9G  147M  7.7G   2% /dev/shm
tmpfs           7.9G     0  7.9G   0% /sys/fs/cgroup
tmpfs           7.9G   24K  7.9G   1% /tmp
/dev/nvme0n1p1  511M  106M  406M  21% /boot
/dev/sda1       459G  165G  271G  38% /data
tmpfs           1.6G   40K  1.6G   1% /run/user/1000

这是 df 命令最常用的用法。

块大小选项

-h 选项在终端里很方便,但容量报表和脚本通常需要固定的单位。-k 选项强制以 1K 块为单位,这也是大多数系统上的默认行为:

df -k /
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/nvme0n1p3 222284728 183057872  27865672  87% /

要换成其它单位,可使用 -B--block-size)后跟一个单位字母。下面的命令以 gibibyte(GiB)为单位报告容量:

df -BG /
Filesystem     1G-blocks  Used Available Use% Mounted on
/dev/nvme0n1p3      212G  175G       27G  87% /

单独一个单位字母(例如 G)会在每个数值后面附上单位;如果写成前面带数字的形式(如 -B1G),则单位相同,但只打印纯数字、不带后缀。-BM(mebibyte)和 -BT(tebibyte)也是同样的规则。

-h 选项以及 -BG-BM-BT 这类裸后缀都采用 1024 进制。在后缀后加一个 B 即可改用十进制单位,例如 -BGB 表示以 1,000,000,000 字节为一个块。硬盘厂商宣传容量时用的是 1000 进制,这就是为什么标称 240 GB 的硬盘用 df -h 查看时会变成一个更小的数字。-H--si)选项就是切换到这套进制:

df -H /
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p3  228G  188G   29G  87% /

分区本身没有任何变化,变的是除数——所以同一个文件系统用 -h 显示为 212G,用 -H 则显示为 228G。

有一个在 Linux 上并不存在的选项是 -m。它属于 macOS 附带的 BSD 版 df,而 Linux 上的 GNU df 会拒绝该选项。想以 mebibyte 为单位时请使用 -BM

显示文件系统类型

-T 选项会增加一列「Type」,显示每个分区的文件系统类型:

df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
dev            devtmpfs  7.8G     0  7.8G   0% /dev
run            tmpfs     7.9G  1.7M  7.9G   1% /run
/dev/nvme0n1p3 ext4      212G  175G   27G  87% /
tmpfs          tmpfs     7.9G  147M  7.7G   2% /dev/shm
/dev/nvme0n1p1 vfat      511M  106M  406M  21% /boot
/dev/sda1      ext4      459G  165G  271G  38% /data

按文件系统类型过滤

要只显示某一类型的文件系统,使用 -t 选项后跟类型名。例如只列出 ext4 分区:

df -h -t ext4
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p3  212G  175G   27G  87% /
/dev/sda1       459G  165G  271G  38% /data

要排除某一类型的文件系统,使用 -x 选项。下面的命令会隐藏所有 tmpfs 文件系统:

df -h -x tmpfs
Filesystem      Size  Used Avail Use% Mounted on
dev             7.8G     0  7.8G   0% /dev
/dev/nvme0n1p3  212G  175G   27G  87% /
/dev/nvme0n1p1  511M  106M  406M  21% /boot
/dev/sda1       459G  165G  271G  38% /data

当你只想关注物理磁盘和分区时,排除 tmpfs 会很有用。

过滤也可以反过来用。默认情况下 df 会隐藏那些自身不占存储的伪文件系统,而 -a--all)选项会把它们重新显示出来:

df -h -a

对于挂载了网络存储的服务器,-l--local)选项会把输出限定为本地文件系统,跳过 NFS 或 CIFS 共享。同时它还能避免远程服务器无响应时 df 卡住:

df -h -l

显示磁盘总容量

--total 选项会在底部追加一行,对显示出来的所有文件系统求和。把它与 -t 组合使用,就能只对关心的分区做汇总:

df -h --total -t ext4
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p3  212G  175G   27G  87% /
/dev/sda1       459G  165G  271G  38% /data
total           671G  340G  297G  54% -

汇总行的挂载点位置是一个短横线,因为它并不属于任何单个文件系统。注意 340G 已用加上 297G 可用,要小于 671G 的总容量。这中间的差额是这些 ext4 文件系统为特权进程预留的空间——df 把它计入总容量,但不计入普通用户可用的部分。

显示 inode 使用情况

inode 是 Linux 文件系统中用于存储文件或目录元数据的数据结构,元数据包括文件大小、属主、权限和时间戳等。每个文件占用一个 inode,而一个文件系统的 inode 总数是固定的。

要显示 inode 使用情况而不是块使用情况,使用 -i 选项:

df -ih /
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/nvme0n1p3    14M  1.9M   12M   14% /

输出包含以下各列:

  • Inodes — 文件系统上的 inode 总数。
  • IUsed — 已使用的 inode 数量。
  • IFree — 空闲(未使用)的 inode 数量。
  • IUse% — 已使用 inode 的百分比。

inode 耗尽后,即使磁盘还有剩余空间,也无法再创建新文件。这种情况常出现在存放了大量小文件的文件系统上。关于如何定位哪些目录在消耗 inode,我们在「什么是 inode」一文中有详细介绍。

自定义输出格式

--output 选项可以让你自行选择要显示哪些列,只需指定一个以逗号分隔的字段名列表:

df -h -t ext4 --output=source,size,used,avail,pcent
Filesystem      Size  Used Avail Use%
/dev/nvme0n1p3  212G  175G   27G  87%
/dev/sda1       459G  165G  271G  38%

可用的字段名如下:

  • source — 文件系统来源(设备名)。
  • fstype — 文件系统类型。
  • file — 当传入文件参数时的文件名。
  • size — 磁盘总容量。
  • used — 已用磁盘空间。
  • avail — 可用磁盘空间。
  • pcent — 已用空间的百分比。
  • itotal — inode 总数。
  • iused — 已使用的 inode 数。
  • iavail — 可用的 inode 数。
  • ipcent — 已使用 inode 的百分比。
  • target — 挂载点。

面向脚本的 POSIX 输出

在 Shell 脚本中解析 df 输出时,默认格式可能把过长的设备名折成两行,这会让 awk 之类的工具解析失败。-P--portability)选项强制每个文件系统只占一行:

df -P /
Filesystem     1024-blocks      Used Available Capacity Mounted on
/dev/nvme0n1p3   222284728 183057872  27865672      87% /

例如,提取根文件系统的已用百分比:

df -P / | awk 'NR==2 {print $5}'
87%

加上 --sync 可在读取前强制执行一次文件系统同步,这样在大批量写入之后立即查看能得到更准确的结果。

df 与 du 的对比

df 通过读取文件系统元数据,在文件系统层面报告使用情况;而 du 命令则遍历目录树,把可见文件的大小累加起来。

两者的结果经常对不上。当 df 显示磁盘已满、而 du 报告的用量更少时,通常是有进程仍持有某个已被删除的文件。用下面的命令找出这些文件:

sudo lsof +L1

重启或停止持有该文件的进程,即可释放这部分空间。

速查表

下面的速查表汇总了 df 的常用命令,建议收藏备查。

命令说明
df显示所有已挂载的文件系统
df /显示指定文件系统
df -h以 1024 进制显示人类可读容量
df -H以 1000 进制显示人类可读容量
df -k以 1K 块为单位显示
df -BG以 1G 块为单位显示
df -T显示文件系统类型
df -t ext4只显示 ext4 文件系统
df -x tmpfs排除 tmpfs 文件系统
df -a包含伪文件系统
df -h -l只显示本地文件系统
df -h --total显示所有文件系统的汇总
df -i显示 inode 使用情况
df -ih /以人类可读格式显示 inode 使用情况
df --output=source,size,pcent自定义输出列
df -P /面向脚本的 POSIX 单行输出
df --sync -h读取容量前强制同步

常见问题排查

df: no file systems processed — 这通常表示你提供的路径无效,或该路径已经不再处于挂载状态。可用 ls 核实路径,并用 mountfindmnt 查看当前生效的挂载。

df: invalid option – 'm' — GNU df 并没有 -m 选项,尽管 macOS 上的 BSD 版本支持它。请改用 -BM 以 1 MiB 块为单位报告容量。

磁盘显示已满,却看不到任何大文件 — 可能是某个进程仍持有已删除的文件。用 sudo lsof +L1 列出这些「已删除但仍被打开」的文件,然后重启或停止相应进程以释放空间。

inode 已用满 100%,但空间还有剩余 — 说明该文件系统上的小文件过多。先用 df -ih 确认,再用 find 定位文件数量异常多的目录,清理或归档其中的旧文件。

常见问题

df 和 du 有什么区别? df 报告整个文件系统的可用与已用空间;du 报告各个文件和目录所占的磁盘空间。用 df 看总体概况,用 du 定位到底是哪些文件在占用空间。

为什么 df 显示的可用空间比预期少? 因为 ext2、ext3、ext4 文件系统会为特权进程预留一部分块,默认情况下通常是 5%。这部分预留空间不计入普通用户的「可用」空间。可以用 tune2fs -m 调整这些文件系统上的预留比例。

为什么 df -h 报告的容量比我买的小? 因为 df -h 按 1024 进制换算,而硬盘厂商宣传容量时用的是 1000 进制。执行 df -H 即可按厂商所用的同一进制查看容量。

inode 用满意味着什么? 当一个文件系统的 inode 耗尽时,即使磁盘还有剩余空间,你也无法再创建新文件。这通常发生在存放了大量极小文件的文件系统上。可用 df -ih 查看 inode 使用情况。

如何查看远程服务器的磁盘空间? 通过 SSH 连接后执行 df -h 即可。也可以直接运行 ssh user@host df -h,无需进入交互式会话。

小结

df 命令是 Linux 系统上监控磁盘空间的必备工具:用 df -h 快速查看人类可读的概览,用 -T 查看文件系统类型,用 -i 检查 inode 使用情况,用 --total 生成汇总。当文件系统总量与目录可见用量对不上时,用 du 对比一下,并检查是否有已被删除但仍被进程占用的文件。