Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python bup(基于git的映像备份)如何计算存储对象的哈希_Python_Git_Backup_Sha1_Git Annex - Fatal编程技术网

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
输出

Original
git
通过在数据前面加上'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