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

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

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


​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,000f_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. 为什么 dfdu 结果可能不同?​

命令计算方式可能差异原因
df基于文件系统超级块包含元数据、保留空间、已删除但未释放的文件(如被进程占用)
du递归统计文件大小只计算当前可见的文件

​常见情况​​:

  • 文件被删除但仍有进程占用 → df 显示空间未释放,du 不统计。
  • 文件系统保留 5% 空间(ext4 默认)→ dfAvaildu 统计的少。

​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 dudf 基于超级块,du 基于文件统计

​最终答案​​:
df -h 的 ​​Size​​ 是通过 f_blocks × f_frsize 计算得到的,表示文件系统的总容量。

此条目发表在未分类分类目录。将固定链接加入收藏夹。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注