为什么我的 zfs 备份这么小?

为什么我的 zfs 备份这么小?

在问这个问题的时候,我已经弄清楚了,并且会自我回答

我已将数据 ( tank) 备份到 NTFS 驱动器 ( ) 上的基于文件的 zfs 池indoorpool。但是,现在看起来备份占用的空间比原始空间少很多。这是为什么?我的备份是否完整且成功完成?

$ zfs get compression,compressratio,used tank indoorpool
NAME        PROPERTY       VALUE     SOURCE
indoorpool  compression    off       default
indoorpool  compressratio  1.53x     -
indoorpool  used           261G      -
tank        compression    lz4       local
tank        compressratio  1.32x     -
tank        used           457G      -

我觉得很奇怪

  • 备份上已禁用压缩,但原始文件上已启用压缩
  • 尽管如此,压缩率很高
  • 备份占用的空间减少了 196G

备份创建

# create file of size 1Terabyte
sudo truncate -s 1T /media/generic/My\ Passport/indoorpool_20230206.zpool

# create zfs pool inside that file
sudo zpool create indoorpool /media/generic/My\ Passport/indoorpool_20230206.zpool 

# send data from my original pool to the backup
# -R means recurse into lower datasets
# -w means to send raw (the original is encrypted)
sudo zfs send -Rw tank/ds1@backup2302062136 | sudo zfs receive -u -d indoorpool

我让它运行了一整夜,并没有报告任何错误。

没有丢失任何快照

比较输出

zfs list -t snap -s creation -r tank/ds1
zfs list -t snap -s creation -r indoorpool/ds1

没有显示出差异。行数相同。(5996,因为 docker 喜欢创建 zfs 数据集 >.< )

答案1

我错过了一些外面的数据集tank/ds1

如何列出所有数据集

zfs list -r tank

使用 sed 清除 docker datasets 在 list 命令的输出中添加的混乱:

zfs list | sed -E '\#/u18/.{12}#,+1d#'

这很好地概述了全部数据集及其挂载点,是我手动创建的,但删除了每个出现的/u18/asdfasdfasdfasdf和以下行,因为那是我的六千个自动生成的数据集所在的位置。

我的解决方案

我有一个tank/nosnap大小为 186G 的数据集和一个tank/var我完全忘记的几千字节的数据集。

zpool list从输出的原始大小中删除 186G

zpool list
NAME         SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
indoorpool  1016G   261G   755G        -         -     0%    25%  1.00x    ONLINE  -
tank         572G   457G   115G        -         -    54%    79%  1.00x    ONLINE  -

剩下 271G,对应于USED备份的值(indoorpool)。

我唯一仍不明白的是为什么当报告为关闭compressratio时会出现这种情况compression(或者为什么它被完全禁用)。

相关内容