标称 256GB / 512GB / 1TB 的硬盘,为什么系统显示的容量更小?

2026-06-22 硬件装机

2026-10-03 更新:本文改用计量标准(SI 与二进制词头)、磁盘厂商与操作系统官方文档作为依据重写,删去了原先的本机测试数值,改为逐层给出可自行核对的官方来源。

买回来一块标称 1TB 的盘,装进系统里显示 931GB;一块 256GB 的 SSD,格式化后只剩 238GB 可用。这不是厂商在容量上做手脚,而是四层不同的口径叠在一起:词头口径差 6.87% → 分区表占用 → 文件系统元数据 → 厂商预留区。下面逐层拆开,每层都给出能自己核对的官方依据。

一、先看清"同一个数字的两种口径"

计量的定义在标准里写得很清楚。NIST 的 SI 词头表把 giga(符号 G)定义为 10^9;NIST 物理实验室关于二进制词头的页面同时给出两个数字:1 GiB = 2^30 B = 1,073,741,824 B,1 GB = 10^9 B = 1,000,000,000 B。

更关键的是 NIST SP 330 第 3 节那句规定:SI 词头严格表示 10 的幂,不应用来表示 2 的幂——"1 kilobit 表示 1000 bit,而不是 1024 bit"。二进制词头(kibi / mebi / gibi)是 IEC 在 1998 年单独批准的,后来并入 ISO/IEC 80000 系列,现行版 IEC 80000-13(2025)规定信息科技领域的量、单位与二进制词头。

于是有了那个恒定的系数:10^9 / 2^30 = 0.931323,也就是"缩水 6.87%"。

标称(十进制) 字节数 按 GiB 显示 差值
128 GB 128,000,000,000 119.2 6.87%
256 GB 256,000,000,000 238.4 6.87%
512 GB 512,000,000,000 476.8 6.87%
1 TB 1,000,000,000,000 931.3 6.87%
2 TB 2,000,000,000,000 1,862.6 6.87%
4 TB 4,000,000,000,000 3,725.3 6.87%

二、第一层:厂商数 1000,Windows 数 1024

厂商的口径在官方文档里是明写的。Seagate 的支持文档写:制造商以十进制标注容量,1 MB = 1,000,000 字节、1 GB = 1,000,000,000 字节、1 TB = 1,000,000,000,000 字节;而 FDISK、BIOS、Windows 与旧版 macOS 使用二进制的 1 GB = 1,073,741,824 字节。同一页给出换算公式 Decimal capacity / 1,073,741,824 = Binary GB capacity 与对照(1TB 显示 931GB、500GB 显示 465GB、2TB 显示 1.81TB)。另一篇 Seagate 官方说明更直接:存储行业标准就是用十进制显示容量,所有主要磁盘厂商讨论容量时都采用十进制。

其他厂商的官方口径一致:Samsung 的数据表写 1GB = 1,000,000,000 bytes,并说明"部分容量用于系统文件与维护,实际可用容量可能小于标称总容量";Apple 的支持文档写明包装标注采用 1GB = 1 billion bytes、1TB = 1 trillion bytes,并注明 actual formatted capacity less;Western Digital 的白皮书则说明可访问容量会因格式化、分区与操作系统等因素与标称不同。

操作系统的口径差异也各有官方说明:

  • Windows:Microsoft Learn 明确"Windows 中的存储数量以二进制(base-2)单位呈现",并举例:2 TB 的盘在 Windows 中显示为 1.82 TiB,128 TB 存储池显示为 116.41 TiB。
  • Apple:同一份支持文档指出,iOS 10 / OS X Leopard 及更早的系统用二进制报告容量,现行系统改用十进制——这就是同一块盘在 Windows 上"缩水"、在 Finder 里却接近标称的原因。

三、第二层:分区表和对齐,先吃掉一小块

进入系统之前,分区表本身就有固定占用。Microsoft 的分区文档给出:GPT 磁盘最多可有 128 个分区;Windows 要求 EFI 系统分区最小 200 MB(512n/512e 盘)或 300 MB(4Kn 盘),并建议每个 GPT 盘设一个 16 MB 的 Microsoft 保留分区(MSR)。GPT 转换工具文档还给出结构本身的占用:磁盘前端 16 KB + 2 个扇区、末端 16 KB + 1 个扇区,用于存放主/备分区表。

这些在 TB 级盘上是零头,在 128GB 级的小容量设备上才值得单独算。

四、第三层:文件系统自己的元数据

格式化不是"把裸盘贴上文件名",那一刻就有一批元数据结构占位:

  • NTFS:默认簇(分配单元)大小 4 KB,卷与文件的上限随簇大小变化;NTFS 会为 MFT 预留最多 12.5% 的卷空间,直到卷的其余部分被用满才让出来。chkdsk 的输出里能看到索引、system(含各种元文件)与日志文件的占用。
  • ext4:mke2fs 手册写明 -m 选项把文件系统块的百分比保留给超级用户,默认 5%;tune2fs -m 可对已有文件系统调整,保留块的用途是避免碎片化、并保证 root 守护进程在盘满时仍能工作。内核文档另有一条:ext4 驱动默认预留 2% 或 4096 个簇(取较小者)的空间,用于避免突发的 ENOSPC 与数据丢失。
  • XFS:元数据日志默认放在数据段内;未显式指定大小时,mkfs.xfs 会依文件系统大小自动选择日志空间,这部分不用于用户数据。
  • Btrfs:元数据块组的典型大小是 256 MiB(小于 50 GiB 的文件系统)或 1 GiB,数据块组 1 GiB;单设备默认对元数据做 DUP(存两份)。
  • APFS:容器内某卷的可用空间 = 容器总大小 − 容器内所有卷占用之和,多个卷动态共享容器的空闲空间。

五、第四层:SSD 里那块看不见的预留区

关于厂商预留(over-provisioning),官方口径只到"部分容量会用于系统文件与维护"这一层(Samsung 数据表即如此表述),并没有公布具体比例。所以网上那些"固定留 7%"的说法不必当依据,能引用的只有厂商的定性声明。

与容量相关的另一件事是扇区口径:Advanced Format 把物理扇区从 512 字节提高到 4096 字节(WD 白皮书,目标是减少每扇区开销、提升容量与纠错能力);Microsoft 的支持政策把 512e 定义为"逻辑扇区 512 字节、物理扇区 4 KB",4Kn 定义为"逻辑与物理都是 4 KB";512e 最初由 Seagate 与 Western Digital 提出,经 IDEMA 的委员会标准化后被 Microsoft 接受。这也是"分区要按 4KB 对齐"的由来——在 512e 盘上分区没对齐,每个物理扇区内部的读改写会付出性能代价。

六、各处的数字对照表

把前面几层叠起来看:

场景 1 TB 盘的典型值 依据
厂商标称 1,000,000,000,000 字节 SI 词头,GB = 10^9
Windows 显示 931.3 GiB(写作 931 GB) 二进制口径 ÷ 2^30
ext4 格式化后 df 可用 约 890~910 GiB 区间 扣除 5% 保留块与元数据
NTFS 格式化后 少约 1~2%(视簇大小与元文件) MFT 预留与元数据
RAID/存储池 再按冗余比例扣 镜像约 50%,raidz 约 (N−P)/N

阵列那一层的官方依据同样是现成的:OpenZFS 文档给出 N 块盘的镜像只提供 X 字节可用、raidz 组以 P 块冗余盘可容纳约 (N−P)×X;Microsoft 的存储池文档给出双向镜像效率 50%、三向镜像 33.3%;Linux 内核的 md 文档说明有冗余的阵列要求成员盘尺寸一致,尺寸不齐时按最小的对齐,多出来的容量会被浪费。

七、买盘之前的几条经验数

  1. 二进制显示 ≈ 标称 × 0.9313;块级设备在这种口径下"少了 6.87%",与品牌无关。
  2. ext4 默认把 5% 留给 root。服务器上可用 tune2fs -m 调低,但要知道代价是碎片化风险与"盘满时 root 也写不进去"。
  3. 组阵列先算冗余:镜像砍一半,raidz 按 (N−P)/N,且成员盘尺寸保持一致。
  4. "1TB 到底是 1000GB 还是 1024GB"取决于说话的人用哪套词头——厂商标称用十进制,很多系统显示用二进制,两者都没错,混用才是错。

八、自己动手核一遍

下面这些命令都出自官方文档(见文末来源),不是自造:

Windows(判断扇区口径与看元数据占用):

fsutil fsinfo ntfsinfo X:      :: 看 Bytes Per Sector / Bytes per Physical Sector,判断 512n / 512e / 4Kn
chkdsk X:                      :: 输出里含索引、system、日志文件的占用
format X: /l /a:64k            :: 官方示例:启用大文件记录段并把分配单元设为 64KB

Linux(文件系统保留块与日志):

mke2fs -m 1 /dev/sdX1                                  # 新建时把保留比例从默认 5% 调到 1%
tune2fs -m 1 /dev/sdX1                                 # 对已有文件系统调整保留比例
mkfs.xfs -l logdev=/dev/sdb1,size=10m /dev/sda1        # 官方示例:显式指定日志设备与大小

九、总结一句话

厂商按 SI 词头数 1000,Windows 按 2 的幂数 1024 却沿用 GB 的写法,两个口径差 6.87%;再叠加分区表、文件系统元数据与厂商预留,"缩水"就这样出现了。记住 0.9313 这个系数、ext4 的 5% 保留、以及阵列的冗余开销,基本就不会被容量问题绕进去。

参考来源