虽然我使用ZFS已经有一段时间了,但我仍然时不时地无法理解它的某些方面。目前,我正在尝试了解 ZFS 快照如何占用磁盘上的空间以及为什么该空间比我预期的要小得多。
我的问题最好通过一个例子来解释。我有一个虚拟机运行在无压缩的 ZVOL( compression=off
)。这些是该卷的快照:
root@server01 ~ # zfs list -r -t all -o name,type,available,used,referenced,usedbyrefreservation,usedbydataset,usedbychildren,usedbysnapshots,volsize,refreservation,reservation rpool01/vm-server01
NAME TYPE AVAIL USED REFER USEDREFRESERV USEDDS USEDCHILD USEDSNAP VOLSIZE REFRESERV RESERV
rpool01/vm-server01 volume 1.60T 1.97T 1.01T 0B 1.01T 0B 985G 1.50T none none
rpool01/vm-server01@Y-2020-05-27-11-35-15 snapshot - 1.06G 1.00T - - - - 1T - -
rpool01/vm-server01@T-2020-06-02-11-41-15 snapshot - 1.04G 1.00T - - - - 1T - -
rpool01/vm-server01@Y-2021-04-24-05-36-24 snapshot - 1.66G 1.00T - - - - 1.50T - -
rpool01/vm-server01@M-2021-04-24-21-22-30 snapshot - 3.78G 1.01T - - - - 1.50T - -
rpool01/vm-server01@T-2021-04-25-14-27-15 snapshot - 0B 1.01T - - - - 1.50T - -
rpool01/vm-server01@T-2021-04-25-14-27-30 snapshot - 0B 1.01T - - - - 1.50T - -
rpool01/vm-server01@W-2021-04-25-21-55-43 snapshot - 555M 1.01T - - - - 1.50T - -
rpool01/vm-server01@D-2021-04-27-17-49-00 snapshot - 1.52G 1.01T - - - - 1.50T - -
rpool01/vm-server01@D-2021-04-29-08-48-16 snapshot - 1.06G 1.01T - - - - 1.50T - -
rpool01/vm-server01@D-2021-05-03-09-42-01 snapshot - 1.08G 1.01T - - - - 1.50T - -
rpool01/vm-server01@D-2021-05-04-12-12-01 snapshot - 45.3M 1.01T - - - - 1.50T - -
到目前为止,一切都很好。令人担忧的是:
例如,在拍摄倒数第二个快照后,我已将大约18 GB
的新数据复制到正在运行的虚拟机。但是,该快照的USED
大小报告为1.08 GB
.根据我的理解,当拍摄快照时,它是只读的,因此实际上无法增加。但当然,文件系统需要空间来记录数据集/ZVOL 之后发生的更改,这就是报告的快照大小USED
(如果我错了,请纠正我)。
作为第二个更极端的例子,该虚拟机在我拍摄快照后运行了大约七个小时@T-2021-04-25-14-27-30
。我绝对确定在那段时间虚拟机中已经更改了相当多 GB 的数据。但USED
据报道,该快照的大小甚至为0
.
我发现了一种奇怪的方法来查看拍摄快照后实际更改了多少数据:我们可以通过类似以下命令行的方式“模拟”发送快照(第一行上的命令,以下两行上的输出) :
root@server01 ~ # zfs send -v -n -R -i rpool01/vm-server01@D-2021-05-03-09-42-01 rpool01/vm-server01@D-2021-05-04-12-12-01
send from @D-2021-05-03-09-42-01 to rpool01/vm-server01@D-2021-05-04-12-12-01 estimated size is 18.6G
total estimated size is 18.6G
(-n
告诉 zfs 不要做任何事情,但报告它会做什么;-v
意味着详细;-i
意味着增量;对于-R
,请查看man zfs
,这里解释得太长了)
在这里我们看到,基于倒数第二个快照增量发送最后一个快照大约需要18 GB
,这几乎恰好是虚拟机中已更改或添加到虚拟机中的数据量,分别是在@D-2021-05-03-09-42-01
拍摄之后、拍摄之前D-2021-05-04-12-12-01
。被采取了。换句话说,ZFS 知道在倒数第二个快照和最后一个快照之间更改了多少数据,但倒数第二个快照仍显示值USED
而1.08 GB
不是 about 18 GB
。
有人可以解释一下吗?
PS我已经读过几篇关于如何解释 的大小值的文章,并且我知道当、、嵌套数据集、克隆、快照等发挥作用zfs list
时会变得相当困难,但这里的情况相当很简单,不是吗?不管怎样,我还没有看到关于快照的预期大小和报告大小之间差异的提示。reservations
refreservations
答案1
我现在可以回答我自己的问题了。由于我在这里几天没有得到回复,我也在 ZFS on Linux 邮件列表上提出了这个问题,两位名为“Greek”和“Stefan Ring”的成员向我解释了这个主题。线程是这里。
总结一下:
快照的大小USED
(与我的第一理解相反)并不反映自拍摄该快照以来在拍摄下一个快照之前写入 ZVOL 的数据量。
相反,它是数据量独特的到那个快照。换句话说,它是删除该快照时将释放的磁盘空间量。
现在很清楚为什么这永远不是在拍摄下一个快照之前添加到 ZVOL 的数据量。回到我的示例:在拍摄倒数第二个快照后,我向 ZVOL 添加了大约 18 GB 的空间。
但是,如果我删除该快照,那 18 GB 的数据当然仍会位于 ZVOL 中。因此,删除该快照不会释放该空间。
USED
相反,只会释放大约 1 GB(大小);只是该空间对于快照来说是唯一的,并且可能被混合元数据占用,以管理快照和在该快照之后已删除或更改(但未添加)的有效负载数据。
如果您想查看自拍摄快照以来以及拍摄下一个快照之前已写入快照的数据量,请使用该WRITTEN
属性。
USED
和之间的区别WRITTEN
在手册中清楚地记录了zfs
。尽管我已经多次阅读该手册,但我显然已经错过了该WRITTEN
属性。