我正在尝试使用librbd
复制rbd export-diff
的功能。我有以下python代码:
offsets = []
extents = []
def iter_cb(offset,length,exists):
if exists:
offsets.append(offset)
extents.append(length)
image.diff_iterate(0,image.size(),None,iter_cb)
with open(os.path.join(BACKUP_DIR,'test.img'),'wb') as f:
for offset,extent in zip(offsets,extents):
f.write(image.read(offset,extent))
f.close()
我可以写入文件,但是该文件比rbd export-diff
生成的文件大。但是,extents
的总和的长度为144629760
,与rbd diff rbd/test | awk '{ SUM += $2 } END { print SUM }'
所示的长度相同。
那为什么当我将所有差异保存到文件中时,它比export-diff
大吗?
仅通过将export
写入文件,我就可以足够容易地复制image.read(0,image.size())
,但这包括所有零,并且是图像的真实大小。此外,如果我将运行此功能后显示的差异写入相同大小的新图像,它将正确读取。
如何在rbd export-diff
中模拟librbd
?