SMB挂载TrueNAS数据集后的容量显示问题

之前使用TrueNAS时遇到SMB挂载数据集容量显示不正确的问题,终于找到了原因和解决方法,特此记录

# 现象

在Windows中使用SMB挂载TrueNAS中的数据集后,在Windows文件管理器中显示的总可用空间和总容量与理论上的总可用空间总是相差一定数量。

例如:我使用了两块4TB规格的硬盘,在TrueNAS中使用这两块硬盘组建RAID0的镜像存储池。TrueNAS中显示这两块硬盘总容量为3.64TB,Windows挂载后的空硬盘显示容量为3.51TB。但是使用一段时间存入一些数据后,Windows文件管理器中显示的总可用空间少于我存入的数据总量,显示的存储总容量也少于3.51TB。这让我百思不得其解,多次尝试解决也没有成功。

# 碰巧解决与猜想

在机缘巧合之下,我在使用过程中对硬盘结构进行了变更,总容量居然神奇的变成了正常的3.51TB。我回想我的操作内容是将所有子数据集删除,并移动到了顶层数据集中。因此我猜想TrueNAS这个挂载显示的是“当前数据集目前的可用空间”。如果在同一个存储池中创建了多个数据集,他们的可用空间和容量显示会互相影响。

# 验证

为了验证我的猜想,我进行了一些测试验证。

# 初始状态

我在Windows中正在使用的存储池storage_mirror,状态为已使用585GB,可用空间2.94TB,总空间3.51TB。Windows资源管理器的显示状态与TrueNAS面板中相同

资源管理器-状态1

TrueNAS显示-状态1

# 测试数据

添加测试数据步骤如下:

  1. 在TrueNAS管理面板中,storage_mirror存储池中再创建一个data数据集的子数据集名为test_save
  2. 新数据集路径为storage_mirror/data/test_save,在对应的Windows目录中显示为处于目前我使用的data文件夹内部的子文件夹
  3. 给test_save文件夹内复制3个大小约为12GB的测试文件

测试数据文件夹

现在,新的自数据集test_save中拥有大约36GB的数据文件夹。这个数据集是data数据集的子数据集。一般的想法来说,test_save文件夹中的数据应该也属于data数据集。因此data数据集的状态应为:已使用622GB,可用空间2.90TB,总空间3.51TB

# 实际上的状态2

加入测试数据后,在Windows中正在使用的存储池storage_mirror,状态为已使用585GB,可用空间2.90TB,总空间3.47TB。Windows资源管理器的显示状态与TrueNAS面板中的显示数据出现了偏差

资源管理器-状态2

TrueNAS显示-状态2

现在这个状态中,TrueNAS管理面板中显示的数据状态正确。但Windows资源管理器中显示的数据集已使用、可用、总空间都比实际上少了36GB左右。缺失的这部分空间大小正好与我们的测试数据集相同。

# 合理的猜想与总结

根据上面实验中状态1和状态2的对比,我们可以得知:虽然TrueNAS中的管理面板可以正确显示数据集及其子数据集占用的已使用空间和剩余的可用空间,但Windows资源管理器只显示了data文件夹已使用的空间减去test_save文件夹已使用的空间。剩余的可用空间也是整个存储池容量减去test_save文件夹已使用的空间

为什么会发生这种情况,我猜想是TrueNAS或zfs或SMB中的某个设计有意为之。但我尝试着搜索了中文和英文资料都没有找到对应的内容讨论,为什么这么设计也不得而知了。但无论如何,我经过实验得知了为何资源管理器会无法正确显示容量,总算解决了我的强迫症。之后我会减少这种使用子数据集的方式来避免显示错误。

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计