Python bup(基于git的映像备份)如何计算存储对象的哈希
基于Python bup(基于git的映像备份)如何计算存储对象的哈希,python,git,backup,sha1,git-annex,Python,Git,Backup,Sha1,Git Annex,基于git版本控制系统的一些思想和功能,有bup备份程序(),用于虚拟机映像的紧凑存储 在bup中有bup ls子命令,当传递-s选项时,它可以显示备份中存储的对象的一些类似sha1的散列(十六进制长度相同)(其中只有“-s,--hash:显示每个文件/目录的散列。”)。但类sha1散列不等于原始文件的sha1sum输出 Originalgit通过在数据前面加上'blob NNN\0'字符串来计算数据的sha1散列,其中NNN是对象的大小(以字节为单位),按照和写入十进制 我测试了前缀'blob
git
版本控制系统的一些思想和功能,有bup
备份程序(),用于虚拟机映像的紧凑存储
在bup
中有bup ls
子命令,当传递-s
选项时,它可以显示备份中存储的对象的一些类似sha1的散列(十六进制长度相同)(其中只有“-s,--hash:显示每个文件/目录的散列。”)。但类sha1散列不等于原始文件的sha1sum
输出
Originalgit
通过在数据前面加上'blob NNN\0'字符串来计算数据的sha1散列,其中NNN是对象的大小(以字节为单位),按照和写入十进制
我测试了前缀'blob NNN\0',但仍然不是相同的sha1和
bup中使用的文件哈希和的计算方法是什么?它是线性sha1还是像Merkle树这样的树状变体?目录的哈希是什么
bup的ls
命令的来源是,hash刚刚以十六进制打印,但是hash是在哪里生成的
def node_info(n, name,
''' ....
if show_hash:
result += "%s " % n.hash.encode('hex')
是在创建bup备份时生成的散列(当文件通过
bup index
+bup save
命令放置在备份内部时),并在bup ls
上打印出来;或者它是在每个bup ls
上重新计算的,并且可以用作bup备份的完整性测试吗?bup
将所有数据存储在一个裸git存储库中(默认情况下位于~/.bup
)。因此,bup
的散列计算方法完全复制了git
使用的散列计算方法
然而,与git的一个重要区别是,bup
可能会将文件分割成块。如果bup
决定将文件拆分为块,则该文件在存储库中表示为树而不是blob。在这种情况下,文件的bup
散列与相应树的git
散列一致
以下脚本演示了:
bup\u hash\u测试
#!/bin/bash
bup init
BUPTEST=/tmp/bup_test
function test_bup_hash()
{
bup index $BUPTEST &> /dev/null
bup save -n buptest $BUPTEST &> /dev/null
local buphash=$(bup ls -s buptest/latest$BUPTEST|cut -d' ' -f 1)
echo "bup's hash: $buphash"
echo "git's hash: $(git hash-object $BUPTEST)"
echo git --git-dir \~/.bup cat-file -p $buphash
git --git-dir ~/.bup cat-file -p $buphash
}
cat > $BUPTEST <<'END'
http://pkgsrc.se/sysutils/bup
http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/
END
test_bup_hash
echo
echo
echo " -1" >> $BUPTEST
echo "After appending ' -1' line:"
test_bup_hash
echo
echo
echo "After replacing '-' with '#':"
sed -i 's/-/#/' $BUPTEST
test_bup_hash
我们可以看到,当bup
和git
的散列匹配时,bup
存储库中的对应对象是一个包含预期内容的blob。当bup
和git
的散列不匹配时,具有bup
散列的对象是一棵树。该树中blob的内容对应于完整文件的片段:
$ git --git-dir ~/.bup cat-file -p aa7770f6a52237f29a5d10b350fe877bf4626bd6
http://pkgsrc.se/sysutils/bup
http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/
-$ git --git-dir ~/.bup cat-file -p d00491fd7e5bb6fa28c517a0bb32b8b506539d4d
1
torek,已经检查过了,没有关于散列计算的确切信息(有sha1类型,但不等于sha1 SUM结果)。bup使用这里描述的技术将文件数据拆分为多个文件。因此,文件的“bup散列”不是git文件散列,因为没有一个git blob对应于bup-save-d文件或目录。因此,请参见第556-560行。这样一个文件只有一个git树对象,可能就是bup散列。在任何情况下,如果不检查所有底层git对象,显然无法检查整个备份(甚至其中的一个组项)的完整性,这需要运行
git fsck
或等效程序。这可能意味着“在创建备份时生成并刚刚打印出来”。(顺便说一句,我说“可能”是因为我不知道;如果我知道,我会写一个答案,而不是仅仅利用显而易见的:-)的推测性评论),供上述设计文档的未来维护者使用。请收紧写作风格——目前非正式的闲聊风格没有给人一种认真对待这个项目的印象。我做了什么?我确实将两个版本的40GB文件(分区映像)放入bup中,然后使用bup fuse上的sha1sum重新检查。我想有一个更简单的方法来检查备份的正确性。现在我有了从分区到tmp文件夹的dd(从磁盘第一次读出)、索引、保存(从tmp读出;bup工作)、挂载bup保险丝、在分区和保险丝中的文件上运行sha1sum(从磁盘第三次读出,从bup第二次读出)。我想要:dd,它将在复制时(动态)计算正确的sha1,以跳过源读数。并获得保存文件的实际总和(磁盘速度太慢,fuse的cpu负载太高)。(我知道我的问题的答案,itBup不是git!它只是从git窃取了一些想法/格式;但它有自己的hash变体。它隐藏在bup的源代码中,但可以找到。“sha”变量名不是真的sha1,它是some(变量)前缀;类似于git附件;但不是相同的前缀。前缀是什么?提交id使用的是什么sha变量?目录?您的错误与问题无关,能否直接在github bup/bup上以问题的形式重新发布?PS:此错误表明,bup ls-s
打印的哈希值未被记录。(您的bup版本是什么?)@osgx查看更新的答案。它包含bup完全依赖git进行哈希计算的最终证明。当它们不匹配时,bup使用自己的git.py,并使用不同的前缀方案:calc_hash(type,content):“以git方式计算某些内容的哈希。”“header=“%s%d\0%”(type,len(content))sum=Sha1(header)sum.update(content)return sum.digest()
。您对bup中使用的散列类型(文件散列、目录散列、提交id、树散列)以及何时使用哪种类型有什么想法?您的bup版本是什么?@osgx git的散列计算代码:
$ git --git-dir ~/.bup cat-file -p aa7770f6a52237f29a5d10b350fe877bf4626bd6
http://pkgsrc.se/sysutils/bup
http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/
-$ git --git-dir ~/.bup cat-file -p d00491fd7e5bb6fa28c517a0bb32b8b506539d4d
1