
当你要排查磁盘已满的告警、在部署前确认可用空间、或者核查 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 核实路径,并用 mount 或 findmnt 查看当前生效的挂载。
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 对比一下,并检查是否有已被删除但仍被进程占用的文件。