我无法理解如何refreservation
工作。从文档:
设置保证数据集(不包括后代,例如快照和克隆)的最小磁盘空间量。当使用的磁盘空间量低于此值时,数据集将被视为占用了 refreservation 指定的空间量。 [...]
据我了解,refreservation
只有当高于数据集已经引用的空间时才应该有效,或者相反,当低于该空间时应该不执行任何操作。举个例子,如果我有一个 ZVOL,它已经指的是 60 GB
,然后我在 ZVOL 中添加一个refreservation
of 50 GB
,这应该做什么?毕竟,通过添加refreservation
,我保证这个 ZVOL 至少可以引用50 GB
,但既然它已经引用了60 GB
,那不应该改变任何东西,不是吗?
就我而言,该操作正在占用父数据集中的可用空间。请考虑以下命令列表及其输出(我删除了有关其他一些 ZVOL 和数据集的行,因为它们会分散注意力并且无助于理解行为):
root@cerberus:~/qemu-kvm# zfs list -o name,type,creation,volsize,available,used,referenced,reservation,refreservation,usedbydataset,usedbyrefreservation,usedbysnapshots,usedbychildren
NAME TYPE CREATION VOLSIZE AVAIL USED REFER RESERV REFRESERV USEDDS USEDREFRESERV USEDSNAP USEDCHILD
rpool filesystem Mon Jan 16 9:45 2017 - 672G 1.10T 96K none none 96K 0 0 1.10T
rpool/zvol-morn-system volume Tue Sep 15 20:43 2020 72G 722G 113G 63.0G none 50G 63.0G 49.8G 238M 0
root@cerberus:~/qemu-kvm# zfs set refreservation=none rpool/zvol-morn-system
root@cerberus:~/qemu-kvm# zfs list -o name,type,creation,volsize,available,used,referenced,reservation,refreservation,usedbydataset,usedbyrefreservation,usedbysnapshots,usedbychildren
NAME TYPE CREATION VOLSIZE AVAIL USED REFER RESERV REFRESERV USEDDS USEDREFRESERV USEDSNAP USEDCHILD
rpool filesystem Mon Jan 16 9:45 2017 - 722G 1.05T 96K none none 96K 0 0 1.05T
rpool/zvol-morn-system volume Tue Sep 15 20:43 2020 72G 722G 63.2G 63.0G none none 63.0G 0 258M 0
在第一个输出中,rpool/zvol-morn-system
引用63 GB
并具有refreservation
of 50 GB
,给出了 的总体用法113 GB
(这是我不明白的第一件事),并且父级中的可用空间rpool
是672 GB
。在第二个输出中,我删除了,这refreservation
增加了父级中的可用空间。我不明白为什么,因为该 ZVOL 的实际引用空间已经超过,所以 a不应该有任何效果。rpool
50 GB
50 GB
refreservation
50 GB
有人可以解释一下我错在哪里吗?
我研究了 ZFS 的文档和手册页,并研究了 SO 和相关站点上的几个问题。我找到了很多关于ZFS空间核算的信息,但找不到这个具体理解问题的解释。
答案1
问题似乎是从快照和数据集本身引用的块(因此,如果删除文件,它们消耗的空间将显示在 USEDSNAP 下,但在此之前,它们会显示在 REFER 下)。
我想,尽管如此,它们仍然属于“快照和克隆消耗的磁盘空间”,因此不会减少您的 USEDREFRESERV。您可以zfs list -t snapshot
在您所描述的情况下检查它们。
第一个问题的答案更简单:Refreservations 无论如何都属于“已使用”的定义,因此会增加 USED,就像所有其他 USED* 列一样。