df -h
如何计算磁盘大小
df -h
(Disk Filesystem)是 Linux/Unix 系统上用于查看磁盘空间使用情况的命令,其中 -h
表示以人类可读的格式(如 KB、MB、GB)显示数据。它的计算逻辑主要基于文件系统的 statfs
或 statvfs
系统调用,获取以下关键信息:
1. df -h
显示的字段
字段 | 说明 |
---|---|
Filesystem | 磁盘设备或挂载点(如 /dev/sda1 ) |
Size | 文件系统总容量(计算方式见下文) |
Used | 已用空间 |
Avail | 剩余可用空间(普通用户可用的空间) |
Use% | 使用百分比(Used / Size × 100% ) |
Mounted on | 挂载目录(如 / 、/home ) |
2. df -h
的计算逻辑
(1)总容量(Size)
df
从文件系统的 超级块(superblock) 中读取以下信息:
-
f_blocks
:文件系统的总块数(block count)。 -
f_frsize
或 f_bsize
:每个块的大小(通常为 4KB)。
计算公式:
\text{Size} = \text{f\_blocks} \times \text{f\_frsize}
例如:
- 如果
f_blocks = 10,000,000
,f_frsize = 4096
(4KB),则:\text{Size} = 10,000,000 \times 4096 = 40,960,000,000 \text{ bytes} ≈ 38.15 \text{ GB}
(2)已用空间(Used)
\text{Used} = (\text{f\_blocks} - \text{f\_bfree}) \times \text{f\_frsize}
f_bfree
:剩余可用的块数(未被任何文件占用)。
(3)可用空间(Avail)
\text{Avail} = \text{f\_bavail} \times \text{f\_frsize}
f_bavail
:普通用户可用的剩余块数(某些系统会为 root 保留 5% 空间,这部分不算在内)。
(4)使用百分比(Use%)
\text{Use\%} = \frac{\text{Used}}{\text{Size}} \times 100\%
3. df -h
vs df -H
选项 | 计算方式 | 示例(1KB = ?) |
---|---|---|
df -h | 二进制(1024) | 1KB = 1024B |
df -H | 十进制(1000) | 1KB = 1000B |
例如:
- 40,960,000,000 bytes:
-h
显示为 38.15 GB(40,960,000,000 / 1024³
)。-H
显示为 40.96 GB(40,960,000,000 / 1000³
)。
4. 为什么 df
和 du
结果可能不同?
命令 | 计算方式 | 可能差异原因 |
---|---|---|
df | 基于文件系统超级块 | 包含元数据、保留空间、已删除但未释放的文件(如被进程占用) |
du | 递归统计文件大小 | 只计算当前可见的文件 |
常见情况:
- 文件被删除但仍有进程占用 →
df
显示空间未释放,du
不统计。 - 文件系统保留 5% 空间(ext4 默认)→
df
的Avail
比du
统计的少。
5. 如何手动计算 df
的值?
可以使用 statvfs
系统调用(C/Python)或 tune2fs
查看超级块信息:
tune2fs -l /dev/sda1 | grep "Block count"
或使用 Python:
import os
stat = os.statvfs("/")
total = stat.f_blocks * stat.f_frsize
print(f"Total: {total / (1024**3):.2f} GB")
6. 总结
关键点 | 说明 |
---|---|
df -h 计算方式 | Size = f_blocks × f_frsize |
Used 计算方式 | Used = (f_blocks - f_bfree) × f_frsize |
Avail 计算方式 | Avail = f_bavail × f_frsize |
Use% 计算方式 | Use% = Used / Size × 100% |
-h vs -H | -h 用 1024,-H 用 1000 |
df vs du | df 基于超级块,du 基于文件统计 |
最终答案:df -h
的 Size 是通过 f_blocks × f_frsize
计算得到的,表示文件系统的总容量。