在使用 PVE 时我经常发现不同页面显示的磁盘大小相差甚远,并且购买磁盘时标称的大小、磁盘在系统内的实际大小、磁盘格式化后的大小也不尽相同。以前我权当作单位换算问题没有细究,今天突然想起这事研究了下,也再此记录一下我发现的规则吧。
为了避免混乱,本文所有的数据大小单位均区分十进制与二进制(如 MiB 与 MB).
1 厂商标称 和 系统显示
这个知识点想必有计算机基础的都已经知道了,储存厂商的标称大小均为十进制,而系统显示均为二进制。下面举例解释:
- 对于一块厂商标称的 2TB 硬盘,它使用十进制单位 TB,它能储存 2 × 10¹²B 的数据。
- 对于操作系统,它使用二进制单位 TiB,2TB = 2 × 10¹²B ≈ 1.82 × 2⁴⁰ = 1.82TiB,因此这块硬盘显示为 1.82TiB.
这个规律 Windows / Linux 通用,我们就用 Windows 进行验证:
但是,除此之外还有一个细节经常被忽略:即使是厂商标称的 2TB 也可能不同。厂商标称的 2TB 有时候指的是 2000GB,而有些时候指的是 2048GB。
这个没有什么具体的规律,不同厂商的标注习惯不同,甚至同一厂商的不同产品也会有区别。例如下面是致钛的 TiPlus7100 2T,它的实际大小是 2048GB,而上面樊想 S790 的 2TB 实际大小是 2000GB.
更加复杂的是,大家仔细观察上面的标称大小会发现它们都不是整数(2000.3GB, 2048.4GB),因为几乎所有厂商的硬盘都不是正好大小的,都多多少少有所余量,底层原因可能和主控的保留策略有关吧。
2 PVE 各页面
这一点挺让人不解的,在 PVE 的不同页面,磁盘大小使用的单位是不同的。在 PVE 里:
- 使用十进制单位的页面:储存监控图表,节点磁盘列表。
- 使用二进制单位的页面:与容器、虚拟机有关的任何页面。
但真要仔细看的话,你会发现实际上 PVE 页面的单位还挺规范的。不管是创建磁盘、扩容磁盘还是虚拟机监控,确实标的就是二进制单位 MiB, GiB 等,也没有混用单位。但是我仍然觉得在整个系统里统一使用一套单位会更好。
那么验算一下,我给虚拟机创建了一块 3TiB 的磁盘,这块磁盘会在储存页面里显示为多大?答案是 3.298 ≈ 3.30TB.(就是这点,当时让我很迷惑,还以为是什么 bug 呢)
3 磁盘大小和文件系统容量
平时我们还经常忽略一点,就是各种文件系统实际上都是会牺牲一点容量的,损失的容量一般在 1~5% 这个范围内。
例如,我给 NAS 虚拟机直通了一块标称 1T 实际 1024.2GB 的硬盘,经过计算应该是等于 931.5GiB,但是把 NAS 的 Samba 挂载到 Windows 上一看,怎么只有 915.8GiB 了?这个实际上就是文件系统损失的大小。我这块硬盘使用的 ext4 文件系统,根据计算损失了 1.69% 的空间,符合 ext4 的特性。
实际上每种文件系统都会损失空间,例如我用了 3 块标称 2T 实际 2000.4GB 的硬盘做 RAID-Z1,根据计算这个 zfs 储存池的可用大小应该是 (3 – 1) * 2000.4GB = 4000.8GB ≈ 4TB,但在 PVE 的储存页面却显示这个 zfs 池只可用 3.87TB,损失了 3.2% 的空间,这个就是 zfs 文件系统导致的。
4 总结
对于我这种用 PVE 平台做 NAS 的用户,还使用了 ZFS 做阵列,就会“惊喜”得发现每一层次的磁盘容量都不相同。最后来做一下总结:
- 硬盘硬件:记得做 GB 到 GiB 的转换,另外注意厂商的 TB 到底是 1000GB 还是 1024GB.
- ZFS 池:要注意到 zfs 文件系统会损失 1~5% 的容量。
- PVE 页面:要注意给 NAS 虚拟机加磁盘时用的是 GiB 单位,而磁盘监控页面用的 GB 单位。
- NAS 虚拟机:要注意把加进来的磁盘格式化为 ext4 文件系统还要损失 1~5% 的容量。
- Samba 挂载:这一步终于是一致了(但 Windows 的约等于用的是去尾法而不是四舍五入,这点可能会造成 1GB 的显示差异)
发表回复