df 命令详解与参数实测(Ubuntu 22.04)

df 命令逐参数实测详解:默认输出、-h 人类可读、-T 文件系统类型(附 ext4/xfs/btrfs/f2fs 对比)、-i inode 使用率、-x 排除类型、--output 自定义列与 /dev/shm 内存盘统计实测,全部回显在 Ubuntu 22.04(GNU coreutils 8.32)实测通过。

Linux命令Linux系统UbuntuUbuntu 22.04命令行文件管理2026/10/15

df 命令详解与参数实测(Ubuntu 22.04)

目标:全面掌握 GNU df 的每一个参数——默认输出、-h 人类可读、-T 文件系统类型、-i inode 使用率、-x 按类型排除、--output 自定义列,并实测 /dev/shm 内存盘的统计变化,附 ext4/xfs/btrfs/f2fs 主流文件系统对比,全部命令与回显已在 Ubuntu 22.04(GNU coreutils 8.32)实测通过。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • df 版本:GNU coreutils 8.32(df --version 实测)
  • df 属于 coreutils 基础工具集,Ubuntu 22.04 默认预装,无需额外安装
  • 根分区实测文件系统:ext4(df -T 回显中 /dev/sda3 一行可见)
  • 演示目录:/dev/shm/(tmpfs 内存文件系统,实测容量 64M)、/tmp

二、命令概览

2.1 语法与测试数据准备

df(disk free)的基本语法是 df [OPTION]... [FILE]...:不给参数时列出所有已挂载文件系统的容量、已用、可用与使用率;给 FILE 时只显示 FILE 所在文件系统那一行。df 的数据来自文件系统元数据而非目录树扫描,因此它与逐文件统计的 du(见《du 命令详解与参数实测(Ubuntu 22.04)》)口径不同。

df 不依赖目录结构,准备一段写入 /dev/shm 的演示数据即可观察统计变化:

dd if=/dev/zero of=/dev/shm/dfdemo.bin bs=1M count=16 status=none

2.2 --help 全量回显

df --help 输出全部参数清单(实测原样保留,可作为参数速查):

Usage: df [OPTION]... [FILE]...
Show information about the file system on which each FILE resides,
or all file systems by default.

Mandatory arguments to long options are mandatory for short options too.
  -a, --all             include pseudo, duplicate, inaccessible file systems
  -B, --block-size=SIZE  scale sizes by SIZE before printing them; e.g.,
                           '-BM' prints sizes in units of 1,048,576 bytes;
                           see SIZE format below
  -h, --human-readable  print sizes in powers of 1024 (e.g., 1023M)
  -H, --si              print sizes in powers of 1000 (e.g., 1.1G)
  -i, --inodes          list inode information instead of block usage
  -k                    like --block-size=1K
  -l, --local           limit listing to local file systems
      --no-sync         do not invoke sync before getting usage info (default)
      --output[=FIELD_LIST]  use the output format defined by FIELD_LIST,
                               or print all fields if FIELD_LIST is omitted.
  -P, --portability     use the POSIX output format
      --sync            invoke sync before getting usage info
      --total           elide all entries insignificant to available space,
                          and produce a grand total
  -t, --type=TYPE       limit listing to file systems of type TYPE
  -T, --print-type      print file system type
  -x, --exclude-type=TYPE   limit listing to file systems not of type TYPE
  -v                    (ignored)
      --help     display this help and exit
      --version  output version information and exit

Display values are in units of the first available SIZE from --block-size,
and the DF_BLOCK_SIZE, BLOCK_SIZE and BLOCKSIZE environment variables.
Otherwise, units default to 1024 bytes (or 512 if POSIXLY_CORRECT is set).

The SIZE argument is an integer and optional unit (example: 10K is 10*1024).
Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).
Binary prefixes can be used, too: KiB=K, MiB=M, and so on.

FIELD_LIST is a comma-separated list of columns to be included.  Valid
field names are: 'source', 'fstype', 'itotal', 'iused', 'iavail', 'ipcent',
'size', 'used', 'avail', 'pcent', 'file' and 'target' (see info page).

GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report any translation bugs to <https://translationproject.org/team/>
Full documentation <https://www.gnu.org/software/coreutils/df>
or available locally via: info '(coreutils) df invocation'

💡 说明:df 的参数分三类——视角切换(块用量默认 / -i 看 inode)、显示控制(-h、-H、-B、-P、--output)、条目过滤(-t 按类型保留、-x 按类型排除、-l 仅本地、-a 含伪文件系统)。帮助尾段给出了 --output 可用的全部 12 个字段名,本文 3.6 实测其中 7 个。

2.3 版本确认

$ df --version | head -1
df (GNU coreutils) 8.32

三、参数逐项实测

3.1 默认输出

不带任何参数,df 列出当前所有已挂载文件系统的块用量,单位默认 1K 块:

$ df
Filesystem     1K-blocks      Used Available Use% Mounted on
overlay        824057128 462402968 324964724  59% /
tmpfs              65536         0     65536   0% /dev
shm                65536         0     65536   0% /dev/shm
/dev/sda3      824057128 462402968 324964724  59% /etc/hosts
tmpfs                  4         0         4   0% /proc/acpi

六列含义:Filesystem(设备或文件系统名)、1K-blocks(总容量,单位 1K)、Used(已用)、Available(可用)、Use%(使用率)、Mounted on(挂载点)。同一块磁盘上的不同挂载点各自成行——/ 与 /etc/hosts 两行的容量、已用、可用完全相同(824057128/462402968/324964724),说明它们落在同一物理文件系统上,只是挂载点不同。

💡 提示:默认输出不含伪文件系统中的少数条目(需 -a 才全部列出,帮助原文:include pseudo, duplicate, inaccessible file systems)。日常看磁盘水位,直接跳到 3.2 的 -h。

3.2 -h:人类可读单位

-h(--human-readable)把 1K 块数换算成 G/M/K 自动选单位,以 1024 为底:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay         786G  441G  310G  59% /
tmpfs            64M     0   64M   0% /dev
shm              64M     0   64M   0% /dev/shm
/dev/sda3       786G  441G  310G  59% /etc/hosts
tmpfs           4.0K     0  4.0K   0% /proc/acpi

与 3.1 逐行对应:824057128 个 1K 块换算为 786G,65536K 换算为 64M。列名也随之变成 Size/Used/Avail。日常巡检写 df -h 即可。

💡 提示:-h 按 1024 进位,-H(--si)按 1000 进位(帮助原文:print sizes in powers of 1000 (e.g., 1.1G));同 3.1 的默认值对照即可看出 824057128K 在两种口径下的差异。运维口径建议统一用 -h。

3.3 -T:显示文件系统类型

-T(--print-type)在 Filesystem 之后插入 Type 列:

$ df -T
Filesystem     Type    1K-blocks      Used Available Use% Mounted on
overlay        overlay 824057128 462402968 324964724  59% /
tmpfs          tmpfs       65536         0     65536   0% /dev
shm            tmpfs       65536         0     65536   0% /dev/shm
/dev/sda3      ext4    824057128 462402968 324964724  59% /etc/hosts
tmpfs          tmpfs           4         0         4   0% /proc/acpi

$ df -hT /root
Filesystem     Type     Size  Used Avail Use% Mounted on
overlay        overlay  786G  441G  310G  59% /

第一段输出里 /dev/sda3 的 Type 为 ext4——实际数据落盘的物理文件系统;shm 一行的 Type 是 tmpfs(内存文件系统)。df -hT /root 演示了「指定路径 + 类型列」的组合:只输出该路径所在文件系统的一行。

💡 技术拓展:Linux 主流文件系统不止 ext4 一种,选型时通常在以下几者之间权衡——

文件系统日志机制单文件上限快照能力适用场景
ext4日志式(元数据日志,可选数据日志)16 TiB(4K 块)无原生快照通用默认选择,Ubuntu/Debian 根分区传统默认
xfs元数据日志(崩溃恢复极快)8 EiB无原生快照大文件、高并发顺序 IO,RHEL/CentOS 默认
btrfs写时复制(COW)+ 数据校验和16 EiB原生快照/子卷需要快照回滚、透明压缩的场景
f2fs闪存友好的日志结构(append-only)约 3.94 TiB(4K 块)无原生快照SSD/eMMC/UFS 闪存介质,移动设备与闪存主机

不确定就选 ext4(稳定且是 Ubuntu 默认);海量大文件与高吞吐选 xfs;需要快照、回滚、压缩选 btrfs;纯闪存介质再考虑 f2fs。本机实测根分区数据盘为 ext4(见上方 /dev/sda3 ext4 回显)。

3.4 -i:inode 使用率

-i(--inodes)把块用量换成 inode 用量:Inodes(总数)、IUsed(已用)、IFree(空闲)、IUse%(使用率):

$ df -i
Filesystem       Inodes   IUsed    IFree IUse% Mounted on
overlay        52396032 5620882 46775150   11% /
tmpfs           5128499      16  5128483    1% /dev
shm             5128499       1  5128498    1% /dev/shm
/dev/sda3      52396032 5620882 46775150   11% /etc/hosts
tmpfs                 1       1        0  100% /proc/acpi

$ df -ih /root
Filesystem     Inodes IUsed IFree IUse% Mounted on
overlay           50M  5.4M   45M   11% /

根分区有 52396032 个 inode,已用 5620882(11%)。inode 是文件的元数据节点——每个文件/目录都要占一个,小文件极多的场景下可能出现块还有大量剩余、inode 却先耗尽的情况,所以巡检时 -i 与 -h 要配合看。

💡 提示:df -ih 是 -i 与 -h 的组合,Inodes 数值同样做人类可读换算(52396032 显示为 50M)。

3.5 -x:按类型排除文件系统

-x TYPE(--exclude-type)从输出中排除指定类型的文件系统,可与 -h 组合:

$ df -h -x tmpfs
Filesystem      Size  Used Avail Use% Mounted on
overlay         786G  441G  310G  59% /
/dev/sda3       786G  441G  310G  59% /etc/hosts

与 3.2 对比:三行 tmpfs(/dev、/dev/shm、/proc/acpi)被整体排除,只剩真实数据文件系统。写巡检脚本时用它滤掉内存盘与伪文件系统,避免误报。

💡 提示:对应的 -t TYPE(--type)是只保留指定类型,例如 df -h -t ext4 只看 ext4。-t 与 -x 可理解为正反两个方向。

3.6 --output:自定义输出列

--output=FIELD_LIST 按逗号分隔的字段列表精确控制输出列(可用字段见 2.2 帮助尾段):

$ df --output=source,fstype,size,used,avail,pcent,target
Filesystem     Type    1K-blocks      Used     Avail Use% Mounted on
overlay        overlay 824057128 462402968 324964724  59% /
tmpfs          tmpfs       65536         0     65536   0% /dev
shm            tmpfs       65536         0     65536   0% /dev/shm
/dev/sda3      ext4    824057128 462402968 324964724  59% /etc/hosts
tmpfs          tmpfs           4         0         4   0% /proc/acpi

$ df -h --output=source,fstype,size,used,avail,pcent,target /root
Filesystem     Type     Size  Used Avail Use% Mounted on
overlay        overlay  786G  441G  310G  59% /

第一个示例不带 -h,size/used/avail 仍以 1K 块显示,列顺序完全按 FIELD_LIST 指定(source 设备、fstype 类型、size 容量、used 已用、avail 可用、pcent 使用率、target 挂载点);第二个示例加 -h 换算成人类可读,并只针对 /root 所在文件系统输出一行。脚本化采集磁盘数据时,--output 比 awk 切默认列更稳。

💡 提示:--output 不带 FIELD_LIST 时输出全部 12 个字段(帮助原文:or print all fields if FIELD_LIST is omitted);inode 相关字段为 itotal/iused/iavail/ipcent,可按需混排。

3.7 实测 /dev/shm:内存盘的统计变化

/dev/shm 是 tmpfs 内存文件系统,容量实测 64M。写入一个 16M 文件后 df 立即反映已用变化,删除后回落:

$ df -h /dev/shm
Filesystem      Size  Used Avail Use% Mounted on
shm              64M   16M   48M  25% /dev/shm

$ ls -lh /dev/shm/dfdemo.bin
-rw-r--r-- 1 root root 16M Oct 15 06:28 /dev/shm/dfdemo.bin

$ rm /dev/shm/dfdemo.bin

$ df -h /dev/shm
Filesystem      Size  Used Avail Use% Mounted on
shm              64M     0   64M   0% /dev/shm

写入 16M 后 Used 从 0 变为 16M、Use% 到 25%;rm 后立即回到 0——tmpfs 的数据存放在内存中,落盘的 df 数字随文件增删实时变化,重启后清空。

💡 提示:/dev/shm 默认容量为物理内存的一半(本机显示 64M 为实测环境配额),把大文件塞进 /dev/shm 会直接挤占内存,用完务必删除。

3.8 指定文件定位所在文件系统

给 df 传任意文件路径,它只输出该文件所在文件系统的一行,用于快速判断「这个路径还能写多少」:

$ df -h /root/demo
Filesystem      Size  Used Avail Use% Mounted on
overlay         786G  441G  310G  59% /

$ df -h /etc/hostname
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       786G  441G  310G  59% /etc/hostname

/root/demo 与 / 同属一个文件系统;而 /etc/hostname 是单独挂载的文件,df 专门为它输出一行(Filesystem 列直接显示 /dev/sda3,挂载点显示为该文件路径本身)。

四、实战示例

4.1 磁盘巡检:容量与类型一眼清

巡检脚本的基础动作:-h 看水位、-T 辨类型,两者组合为 -hT 并指定根路径:

$ df -hT /root
Filesystem     Type     Size  Used Avail Use% Mounted on
overlay        overlay  786G  441G  310G  59% /

Use% 达到 80% 以上就应触发清理或扩容流程。

4.2 脚本取数:--output 精确取列

给监控/报表脚本喂数据时,用 --output 固定列序,避免解析默认表格的列位漂移:

$ df -h --output=source,fstype,size,used,avail,pcent,target /root
Filesystem     Type     Size  Used Avail Use% Mounted on
overlay        overlay  786G  441G  310G  59% /

4.3 inode 水位巡检

与容量巡检并行的一路:小文件风暴(如会话文件、缓存碎片)会先打爆 inode:

$ df -ih /root
Filesystem     Inodes IUsed IFree IUse% Mounted on
overlay           50M  5.4M   45M   11% /

IUse% 超过 80% 时应排查目录里的小文件堆积。

4.4 排除内存盘看真实数据盘

巡检报表只关心落盘数据时,用 -x 滤掉 tmpfs:

$ df -h -x tmpfs
Filesystem      Size  Used Avail Use% Mounted on
overlay         786G  441G  310G  59% /
/dev/sda3       786G  441G  310G  59% /etc/hosts

五、注意事项与常见问题

Q1:Used + Avail 不等于 Size,差的去哪了? 文件系统会预留一部分块不分配给普通用户:ext4 默认预留约 5%(供 root 与关键服务在磁盘满时仍能写入),再加文件系统自身的元数据开销。因此 Used + Avail 通常略小于 Size,这是正常现象而非统计错误。

Q2:删了文件,df 显示的空间怎么没释放? 文件被删除时若仍有进程持有它的文件描述符,块不会归还文件系统,df 的 Used 不下降、du 却已经看不到该文件。定位方法与完整实测过程见《du 命令详解与参数实测(Ubuntu 22.04)》注意事项 Q1(deleted-but-open 场景):用 lsof | grep deleted 找到持有进程,重启或等其退出即可释放。

Q3:df -h 明明有空间,写入却报 No space left on device? 大概率是 inode 耗尽而非块耗尽。用 df -i 查看 IUse%(见 3.4 实测),若接近 100%,说明海量小文件把 inode 用光了;清理小文件或重新格式化时调大 inode 密度才能恢复。

Q4:/dev/shm 是磁盘吗?为什么 64M? 不是磁盘,是 tmpfs 内存文件系统(Type 列实测为 tmpfs,见 3.3),数据只存内存。64M 是本机实测配额(tmpfs 默认为物理内存的一半,本环境为 64M);3.7 实测了写入 16M 后 Used 变 16M、删除后归零。注意写入 /dev/shm 的内容重启即失,且直接占用物理内存。

Q5:为什么同一块磁盘在 df 里出现两行? df 以挂载点为单位输出。同一文件系统可以被挂到多个位置(bind mount),或其上的部分路径被单独挂载其他文件系统——每处挂载各占一行。实测输出中 /(overlay)与 /etc/hosts(/dev/sda3 ext4)两行容量、已用、可用完全相同(见 3.1),即同一份数据的两个挂载视图;根目录的 overlay 行来自联合文件系统挂载,实际数据仍落在 /dev/sda3 这块 ext4 磁盘上。

Q6:df 默认单位到底是多少?K、KB 有区别吗? 默认 1K 块(1024 字节,帮助原文:units default to 1024 bytes (or 512 if POSIXLY_CORRECT is set))。帮助尾段说明了 K/M/G 系列为 1024 进位、KB/MB 系列为 1000 进位,-B 可指定任意块大小(如 -BM 以 1M 为单位显示)。

六、参考链接