从 TrueNAS 迁移的 ZFS 池在飞牛 OS 中容量显示错误(如显示 120MB/1TB,实际为 20TB/29TB),本文分析原因并提供解决方案。
问题现象
飞牛 OS 存储空间管理页面中,ZFS 池显示的容量与实际不符:
| 项目 |
飞牛 UI 显示 |
实际值 |
| 总容量 |
1.01 TB ❌ |
29.1 TB ✅ |
| 使用量 |
120.25 MB ❌ |
20.1 TB ✅ |
| 剩余 |
随 UI |
1.01 TB ✅ |
但命令行查看完全正常:
/sbin/zpool list
# NAME SIZE ALLOC FREE HEALTH
# HC320 29.1T 27.5T 1.56T ONLINE
原因分析
数据集结构差异
从 TrueNAS 迁移过来的 ZFS 池通常有嵌套数据集结构:
HC320 (REFER=120M, USED=20.1T, AVAIL=1.01T)
**─ HC320/HC (USED=20.1T, REFER=20.1T) ← 实际数据都在这里
飞牛 OS 的存储管理 UI 读取的是**根数据集(HC320)**的以下字段:
- 总容量 =
AVAIL(1.01TB)
- 已使用 =
REFER(120MB)
但实际上:
- 根数据集
HC320 的 REFER 仅为 120M(自身挂载点占用的元数据)
- 全部 20.1TB 数据存储在子数据集
HC320/HC 中
- ZFS 的
AVAIL 是整池的可用空间,与根数据集本身无关
这是飞牛 OS 对嵌套数据集(从 TrueNAS 迁移的场景)兼容性不足导致的 UI 显示问题。
还是希望官方支持,这样就无需迁移了
解决方法
方法一:设置 Quota(临时,不影响数据)
让根数据集的总容量显示看起来正常:
sudo /sbin/zfs set quota=29T HC320
设置后 zfs list 会有配额信息,但飞牛 UI 的已使用量仍读取 REFER 字段,不会完全修复。
方法二:数据提升到根数据集(彻底解决)
将子数据集 HC320/HC 的数据直接放到根数据集 HC320 下:
# 1. 停用占用 /vol2 的服务
# 2. 查看子数据集挂载点
/sbin/zfs get mountpoint HC320/HC
3. 将子数据集改为 legacy 挂载
sudo /sbin/zfs set mountpoint=legacy HC320/HC
4. 创建一个临时挂载点
mkdir -p /tmp/migrate sudo mount -t zfs HC320/HC /tmp/migrate
5. 将数据复制到根数据集的挂载点(/vol2)
sudo rsync -av /tmp/migrate/ /vol2/
6. 验证数据完整性
ls /vol2
确认所有数据都在
7. 清理临时挂载
sudo umount /tmp/migrate
8. 删除子数据集
sudo /sbin/zfs destroy HC320/HC
code
code
code
code
code
code