​​df如何计算磁盘大小​

​​df -h 如何计算磁盘大小​​

df -h(Disk Filesystem)是 Linux/Unix 系统上用于查看磁盘空间使用情况的命令,其中 -h 表示以人类可读的格式(如 KB、MB、GB)显示数据。它的计算逻辑主要基于文件系统的 ​​statfs 或 statvfs 系统调用​​,获取以下关键信息:

data-ad-format="fluid" data-ad-layout-key="-7k+ex-4a-9w+4a">

​​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)。

​​计算公式​​:

1
\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)​​

1
\text{Used} = (\text{f\_blocks} - \text{f\_bfree}) \times \text{f\_frsize}
  • f_bfree:剩余可用的块数(未被任何文件占用)。

​​(3)可用空间(Avail)​​

1
\text{Avail} = \text{f\_bavail} \times \text{f\_frsize}
  • f_bavail:普通用户可用的剩余块数(某些系统会为 root 保留 5% 空间,这部分不算在内)。

​​(4)使用百分比(Use%)​​

1
\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 查看超级块信息:

1
tune2fs -l /dev/sda1 | grep "Block count"

或使用 Python:

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

data-ad-format="auto" data-full-width-responsive="true">