在问这个问题的时候,我已经弄清楚了,并且会自我回答。
我已将数据 ( 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
(或者为什么它被完全禁用)。