2016-07-17 22 views
2

Es gibt bup Backup-Programm (https://github.com/bup/bup) basierend auf einigen Ideen und einige Funktionen aus git Versionskontrollsystem für kompakte Speicherung von virtuellen Maschinenbildern.Wie bup (git-basierte Imagesicherung) berechnet Hashes von gespeicherten Objekten

In bup gibt es bup ls subcommand, die einig SHA1-Hashes wie (die gleiche Länge von hex), von Objekten gespeichert innerhalb der Sicherung, wenn -s Option übergeben wird (in man bup-ls gibt es nur "es zeigt --hash : show hash für jede Datei/jedes Verzeichnis. "). Aber der sha1-artige Hash ist nicht gleich sha1sum Ausgabe der ursprünglichen Datei.

Ursprüngliche git berechnet SHA1 Hash der Daten durch Daten mit BLOB NNN \ 0' string Vorfixierung, wobei NNN eine Größe des Objekts in Bytes, als Dezimalzahl geschrieben, entsprechend How does git compute file hashes? und https://stackoverflow.com/a/28881708/

I prefix BLOB getestet NNN \ 0 'und immer noch nicht die gleiche sha1 Summe.

Was ist die Methode der Berechnung Hash-Summe für Dateien in Bup verwendet wird? Ist es linear sha1 oder eine baumartige Variante wie Merkle? Was ist der Hash eines Verzeichnisses?

Die Quelle von ls Befehl von bup ist https://github.com/bup/bup/blob/master/lib/bup/ls.py, und Hash nur in Hex gedruckt, aber wo der Hash generiert wurde?

def node_info(n, name, 
    ''' .... 
    if show_hash: 
     result += "%s " % n.hash.encode('hex') 

Ist das Hash auf die Schaffung BUP Backup erzeugt (wenn die Datei innerhalb von bup index + bup save Befehle auf den Backup platziert ist) und nur auf bup ls ausgedruckt; oder wird es auf jedem bup ls neu berechnet und kann als Integritätstest von bup backup verwendet werden?

+0

https://github.com/bup/bup/blob/master/DESIGN – torek

+0

torek, bereits überprüft, keine genauen Informationen über Hash Berechnung (es gibt sha1 type, aber * ungleich sha1sum * result) – osgx

+0

bup spaltet Datei-Dateien in viele Dateien auf, mit der dort beschriebenen Technik. Also ist der "bup hash" einer Datei kein git-Datei-Hash, weil es kein einzelnes git-Blob gibt, das der Datei oder dem Verzeichnis entspricht, das bup-save-d ist. Siehe Zeilen 556-560. Es gibt * ein einzelnes git * tree * -Objekt für eine solche Datei und wahrscheinlich ist das der bup-Hash. In jedem Fall ist die Integrität des gesamten Backups (oder sogar eines Gruppenelements darin) eindeutig nicht prüfbar, ohne alle zugrunde liegenden Git-Objekte zu überprüfen, was das Ausführen von "git fsck" oder Ähnliches erfordert. – torek

Antwort

0

bup speichert alle Daten in einem leeren Git-Repository (das sich standardmäßig unter ~/.bup befindet). Daher repliziert die Hashberechnungsmethode bup exakt die von git verwendete Methode.

Ein wichtiger Unterschied zu Git ist jedoch, dass bup Dateien in Stücke teilen kann. Wenn bup beschließt, eine Datei in Chunks aufzuteilen, wird die Datei im Repository als Baum und nicht als Blob dargestellt. In diesem Fall bup 's Hash der Datei fällt zusammen mit git' s Hash des entsprechenden Baumes.

Das folgende Skript zeigt, dass:

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 

Ausgang:

$ ./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 

Wie wir sehen können, wenn bup 's und git' s Hashes Spiel das entsprechende Objekt in der bup Repository ist ein Blob mit dem erwarteten Inhalt. Wenn die Hashes bup 's und git NICHT übereinstimmen, ist das Objekt mit bup ein Baum.Der Inhalt der Blobs in diesem Baum entspricht Fragmente der vollständigen Datei:

$ 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 
+0

Was habe ich? Ich habe 40GB Datei (Partition Image) in zwei Versionen in bup und dann Sha1sum auf Bup-Sicherung zu überprüfen. Ich möchte eine einfachere Möglichkeit haben, die Richtigkeit der Sicherung zu überprüfen. Jetzt habe ich dd von Partition zu Tmp-Ordner (1. Auslesen von Festplatte), Index, speichern (Auslesen von tmp; bup Arbeit), montieren Bup-Sicherung, rennen sha1sum auf Partition und auf Datei in Sicherung (3. Auslesen von Festplatte, 2. Auslesen von bup). Ich möchte: dd, die korrekte sha1 auf der Kopie (on fly) berechnen wird - um Quellauslesen zu überspringen. Und erhalten Sie die echte Summe der gespeicherten Datei (bup auch auf der langsamen Festplatte; hohe CPU-Last von der Sicherung). (Ich kenne die Antwort auf meine q, es – osgx

+0

Bup ist kein git! Es stahlen nur einige Ideen/Formate von Git, aber es hat seine eigene Variante von Hash. Es ist in Quellen von bup versteckt, aber es kann gefunden werden. "sha" Variablenname ist nicht wahr sha1, es ist ein (variables) Präfix, wie in git Anhang, aber nicht das gleiche Präfix. Was ist das Präfix? Welche sha Variante wird für Commit-ID verwendet? Für Verzeichnis? Ihr Fehler ist nicht mit der Frage verbunden, können Sie es direkt als Problem bei github bup/bup? PS: Und dieser Fehler zeigt an, dass der Wert von Hash gedruckt von 'bup ls -s' nicht dokumentiert ist. (Was ist Ihre bup Version?) – osgx

+0

@osgx Siehe aktualisierte Antwort.Es enthält den endgültigen Beweis, dass bup vollständig von git für seine Hash-Berechnung abhängig ist. – Leon