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 计算得到的,表示文件系统的总容量。