为什么 ZFS 快照报告零大小?

为什么 ZFS 快照报告零大小?

我有一个 Centos7 系统,其中有一个 zfs 池,我用它拍了快照sudo zfs snapshot -r data-pool/Samba@backup_r。拍完快照后,我将几 GB 的文件从我的 Windows PC 复制到该池(它被映射为 samba 共享)。复制后,我用它拍了快照sudo zfs snapshot -r data-pool/Samba@backup_r2

令我惊讶的是,输出zfs list -o space -r data-pool中的这两个快照USED和字段的大小都报告为 0。USEDSNAP

为什么这两个快照的大小都报告为 0?如果我理解正确的话,ZFS 文件系统中的快照是增量的,因此我认为后一个快照应该报告我复制到 samba 共享的数据量的大小。

答案1

快照的大小只会在以下情况下增加:更改或删除文件它们在拍摄快照时就存在于数据集中。

ZFS 使用写时复制快照,这意味着如果要更改数据块,则包含更改的块的新副本将被写入存储池中的不同位置,并且相关数据集/卷中的引用也会更新。

如果快照时数据集使用的任何块均未被修改,则快照的大小为零,因此快照与数据集的当前版本仅在元数据上有所不同。

答案2

重要的是要理解,USED只计算特定快照中包含的唯一数据。从手册页:

快照的已用空间(请参阅 zfsconcepts(7) 的“快照”部分)是此快照独占引用的空间。如果此快照被销毁,则将释放已用空间量。该指标不考虑多个快照共享的空间。

换句话说,可以有多个快照,USED == 0但它们总共占用大量空间。例如,让我们看一下这个测试池:

# write some data
root@localhost:~/test# dd if=/dev/zero of=/tank/test bs=1M count=128
128+0 records in
128+0 records out
134217728 bytes (134 MB, 128 MiB) copied, 3.58123 s, 37.5 MB/s

# current pool usage
root@localhost:~/test# zfs list -t all -o space
NAME  AVAIL   USED  USEDSNAP  USEDDS  USEDREFRESERV  USEDCHILD
tank   704M   128M        0B    128M             0B       178K

# create a snapshot and check used space - no surprises here
root@localhost:~/test# zfs snapshot tank@snap1
root@localhost:~/test# zfs list -t all -o space
NAME        AVAIL   USED  USEDSNAP  USEDDS  USEDREFRESERV  USEDCHILD
tank         704M   128M        0B    128M             0B       174K
tank@snap1      -     0B         -       -              -          -

# create a second snapshot and check uses space - again, no surprises
root@localhost:~/test# zfs snapshot tank@snap2
root@localhost:~/test# zfs list -t all -o space
NAME        AVAIL   USED  USEDSNAP  USEDDS  USEDREFRESERV  USEDCHILD
tank         704M   128M        0B    128M             0B       170K
tank@snap1      -     0B         -       -              -          -
tank@snap2      -     0B         -       -              -          -

# now overwrite some data
root@localhost:~/test# dd if=/dev/zero of=/tank/test bs=1M count=128
128+0 records in
128+0 records out
134217728 bytes (134 MB, 128 MiB) copied, 3.58123 s, 37.5 MB/s

# As both snapshots reference the same overwritten data, both report 0 bytes USED
# however USEDSNAP shows 128M are really used
root@localhost:~/test# zfs list -t all -o space
NAME        AVAIL   USED  USEDSNAP  USEDDS  USEDREFRESERV  USEDCHILD
tank         577M   255M      128M    127M             0B       200K
tank@snap1      -     0B         -       -              -          -
tank@snap2      -     0B         -       -              -          -

# WRITTEN shows the true story
root@localhost:~/test# zfs list -t all -o space,written
NAME        AVAIL   USED  USEDSNAP  USEDDS  USEDREFRESERV  USEDCHILD  WRITTEN
tank         576M   256M      128M    128M             0B       207K     128M
tank@snap1      -     0B         -       -              -          -     128M
tank@snap2      -     0B         -       -              -          -        0

相关内容