bup (git-based image backup) 如何计算存储对象的哈希值
How does bup (git-based image backup) computes hashes of stored objects
有bup
备份程序(https://github.com/bup/bup)基于git
版本控制系统的一些想法和一些功能,用于虚拟机映像的紧凑存储。
在 bup
中有 bup ls
子命令,当传递 -s
选项时,它可以显示备份中存储的对象的一些类似 sha1 的哈希值(相同长度的十六进制)(在 man bup-ls
中只有“-s, --hash : show hash for each file/directory.”)。但是类似 sha1 的散列不等于 sha1sum
原始文件的输出。
原始 git
通过在数据前加上 `blob NNN[=46=]' 字符串来计算数据的 sha1 散列,其中 NNN 是以字节为单位的对象大小,写为十进制,根据 How does git compute file hashes? and
我测试了前缀“blob NNN[=46=]”,但 sha1 和仍然不相同。
bup中使用的文件哈希和计算方法是什么?它是线性 sha1 还是像 Merkle 树这样的树状变体?目录的哈希值是多少?
bup的ls
命令来源是https://github.com/bup/bup/blob/master/lib/bup/ls.py,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_hash_test
#!/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_hash_test
Initialized empty Git repository in ~/.bup/
bup's hash: b52baef90c17a508115ce05680bbb91d1d7bfd8d
git's hash: b52baef90c17a508115ce05680bbb91d1d7bfd8d
git --git-dir ~/.bup cat-file -p b52baef90c17a508115ce05680bbb91d1d7bfd8d
http://pkgsrc.se/sysutils/bup
http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/
After appending ' -1' line:
bup's hash: c95b4a1fe1956418cb0e58e0a2c519622d8ce767
git's hash: b5bc4094328634ce6e2f4c41458514bab5f5cd7e
git --git-dir ~/.bup cat-file -p c95b4a1fe1956418cb0e58e0a2c519622d8ce767
100644 blob aa7770f6a52237f29a5d10b350fe877bf4626bd6 00
100644 blob d00491fd7e5bb6fa28c517a0bb32b8b506539d4d 61
After replacing '-' with '#':
bup's hash: cda9a69f1cbe66ff44ea6530330e51528563e32a
git's hash: cda9a69f1cbe66ff44ea6530330e51528563e32a
git --git-dir ~/.bup cat-file -p cda9a69f1cbe66ff44ea6530330e51528563e32a
http://pkgsrc.se/sysutils/bup
http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/
#1
正如我们所见,当 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
有bup
备份程序(https://github.com/bup/bup)基于git
版本控制系统的一些想法和一些功能,用于虚拟机映像的紧凑存储。
在 bup
中有 bup ls
子命令,当传递 -s
选项时,它可以显示备份中存储的对象的一些类似 sha1 的哈希值(相同长度的十六进制)(在 man bup-ls
中只有“-s, --hash : show hash for each file/directory.”)。但是类似 sha1 的散列不等于 sha1sum
原始文件的输出。
原始 git
通过在数据前加上 `blob NNN[=46=]' 字符串来计算数据的 sha1 散列,其中 NNN 是以字节为单位的对象大小,写为十进制,根据 How does git compute file hashes? and
我测试了前缀“blob NNN[=46=]”,但 sha1 和仍然不相同。
bup中使用的文件哈希和计算方法是什么?它是线性 sha1 还是像 Merkle 树这样的树状变体?目录的哈希值是多少?
bup的ls
命令来源是https://github.com/bup/bup/blob/master/lib/bup/ls.py,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_hash_test
#!/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_hash_test
Initialized empty Git repository in ~/.bup/
bup's hash: b52baef90c17a508115ce05680bbb91d1d7bfd8d
git's hash: b52baef90c17a508115ce05680bbb91d1d7bfd8d
git --git-dir ~/.bup cat-file -p b52baef90c17a508115ce05680bbb91d1d7bfd8d
http://pkgsrc.se/sysutils/bup
http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/
After appending ' -1' line:
bup's hash: c95b4a1fe1956418cb0e58e0a2c519622d8ce767
git's hash: b5bc4094328634ce6e2f4c41458514bab5f5cd7e
git --git-dir ~/.bup cat-file -p c95b4a1fe1956418cb0e58e0a2c519622d8ce767
100644 blob aa7770f6a52237f29a5d10b350fe877bf4626bd6 00
100644 blob d00491fd7e5bb6fa28c517a0bb32b8b506539d4d 61
After replacing '-' with '#':
bup's hash: cda9a69f1cbe66ff44ea6530330e51528563e32a
git's hash: cda9a69f1cbe66ff44ea6530330e51528563e32a
git --git-dir ~/.bup cat-file -p cda9a69f1cbe66ff44ea6530330e51528563e32a
http://pkgsrc.se/sysutils/bup
http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/
#1
正如我们所见,当 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