df 命令详解与参数实测(Ubuntu 22.04)
df 命令逐参数实测详解:默认输出、-h 人类可读、-T 文件系统类型(附 ext4/xfs/btrfs/f2fs 对比)、-i inode 使用率、-x 排除类型、--output 自定义列与 /dev/shm 内存盘统计实测,全部回显在 Ubuntu 22.04(GNU coreutils 8.32)实测通过。
df 命令详解与参数实测(Ubuntu 22.04)
目标:全面掌握 GNU df 的每一个参数——默认输出、
-h人类可读、-T文件系统类型、-iinode 使用率、-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 为单位显示)。
六、参考链接
- GNU coreutils 官方手册(df 章节):https://www.gnu.org/software/coreutils/manual/html_node/df-invocation.html
- 在线文档:https://www.gnu.org/software/coreutils/df
- 本机帮助:
df --help、man df(Ubuntu 22.04 内置)