在 ZFS 上设置系统范围的配额

在 ZFS 上设置系统范围的配额

通常建议不要将 ZFS 卷的容量填满超过 70-80%,以防止出现碎片。然而,我发现我过去已经超出了这一范围(“我只需要多一点,我稍后会清除它”综合症)。我很快会将我的一些卷迁移到新的卷上,这样它们就会再次“干净”,并且我想对所述卷实施限制。本质上是一个全用户配额,以防止我跨越这个障碍。

那么,是否只需设置以下内容就这么简单(假设在这种情况下是 3TB 的磁盘)?

zfs set quota=2000G storage/data

如果是这样,这里可以用百分比来代替吗?

最后,考虑到更大的容量,建议仍然是 70-80%,还是应该通过将要存储/复制的最大文件数量乘以 x 数量来计算更合理的数量(就像人们不会设置监控来对 10EB 卷的 90% 发出严重警报,但会计算平均数据增长并设置更现实的值)?

我想我可以通过谷歌搜索发现前两个问题,但最后一个问题是针对专家的。

答案1

我不知道为什么,但我的第一反应是使用预留,而不是配额。我(错误地)认为超级用户也许能够规避配额,但快速测试表明我的直觉是错误的。

但是,仅仅为了启发,请考虑使用预留而不是配额:

zfs create \
    -o reservation=500G \
    -o canmount=off \
    -o mountpoint=none storage/unusable

请注意,配额和预留使用互补数字。在您的示例中,2000GB 的大小数字是可用的您想要的空间。在上面的预订示例中,500GB 是无法使用将从池的总空间中保留的空间。根据喜好进行调整。

差异很小,因此我建议这只是一种替代解决方案,而不是“更好的方法”。但是,有一个小小的优势,可能要到未来的某一天才会显现出来。

有了配额,您永远无法使用该保留空间,即使是超级用户也不行。但是有了保留,超级用户就可以访问该空间:

zfs set canmount=noauto,mountpoint=/root/temporary storage/unusable
zfs mount /root/temporary

并可以紧急访问池中原本无法使用的部分。使用配额,我不知道即使是超级用户也有什么办法可以超越存储限制。

编辑:

为了帮助说明预留对池的作用,这里有一个带有 1G 预留的微型 4G 虚拟磁盘池:

# zfs list -o name,used,avail,reservation,refer,mountpoint -r mypool
NAME              USED  AVAIL  RESERV  REFER  MOUNTPOINT
mypool           1.00G  2.62G    none    88K  /mypool
mypool/unusable    88K  3.62G      1G    88K  none
mypool/usable      88K  2.62G    none    88K  /mypool/usable

# zpool list mypool
NAME     SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
mypool  3.75G   744K  3.75G        -         -     0%     0%  1.00x  ONLINE  -

相关内容