Vergleich von Rohblockgeräten

12

Gibt es ein Dienstprogramm (oder eine Shell-Magie), mit dem ich zwei Blockgeräte vergleichen kann?

Details: Ich habe ein großes RAID-Gerät (0,5 TB), das ich mit dd auf einem etwas größeren SATA-Gerät gesichert habe. Auf dem Gerät befinden sich mehrere Partitionen. Ich kopiere jedoch vom übergeordneten Gerät und nicht von den partitionierten Geräteknoten (z. B. kopiere ich / dev / hda und nicht / dev / hda1).

Ich möchte überprüfen, ob das Backup gut / korrekt ist.

Ich habe darüber nachgedacht, md5sum auf jedem Gerät auszuführen, aber das liefert mir kein genaues Ergebnis, da das zweite Gerät etwas größer als das erste ist und daher die zusätzlichen Bytes den Hash ändern.

Alanxz
quelle

Antworten:

13

Ich würde den Befehl verwenden

cmp /dev/hda /dev/hdb

Es stoppt beim ersten abweichenden Byte, schreibt seinen Versatz aus oder bei EOF beim kürzeren.

Enzotib
quelle
Ich sehe auf der Manpage nichts über einen Zwischenstopp bei EOF. Ist das irgendwo dokumentiert?
Kevin
Tatsächlich lautet der Exit-Status: "1: Die Dateien sind unterschiedlich. Dies schließt den Fall ein, in dem eine Datei mit dem ersten Teil der anderen identisch ist." Dies scheint zu implizieren, dass sie nicht als identisch gemeldet werden, wenn eine kürzer ist.
Kevin
@ Kevin: from info cmp: "Der Befehl 'cmp' vergleicht zwei Dateien und teilt, falls sie sich unterscheiden, dem ersten Byte und der Zeilennummer mit, wo sie sich unterscheiden."
Enzotib
1
Sie können die --bytes=LIMITOption verwenden, indem Sie den LIMITWert auf die Byte-Größe des kleineren Geräts einstellen, um am Ende des kleineren Laufwerks (oder der Partitionsgrenze) anzuhalten, ohne den cmpExit mit dem Status ungleich Null zu beenden .
Rozcietrzewiacz
Wenn ich eine Kopie / dev / loop0 von / dev / sda habe und Änderungen an / dev / loop0 vornehme, wie kann ich die neuen Änderungen an / dev / sda hinzufügen? Vielen Dank
Milor123
2

Je nachdem, wie voll die Laufwerke tatsächlich sind, kann es am schnellsten sein, die Dateisysteme bereitzustellen und dies zu tun

diff -qr /mnt/root1 /mnt/root2

Ansonsten würde ich so etwas sagen:

diff -q <(dd bs=1M count=500K if=/dev/sda) <(dd bs=1M count=500K if=/dev/sdb)

Stellen Sie natürlich fest, wie groß Sie sein müssen, bsund counthalten Sie am Ende des kleineren Laufwerks an (oder kurz davor, wenn es viel bequemer ist).

Dank des Kommentars von enzotib können Sie es auch verwenden cmp, aber Sie benötigen das -nFlag, um die Anzahl der Bytes auf das kürzere der beiden Laufwerke zu beschränken.

cmp /dev/sda /dev/sdb -n 500GB
Kevin
quelle
Leider kann ich das Gerät nicht als NTFS-Volume bereitstellen, und ich habe eine LiveCD ohne die richtigen Treiber. Für den zweiten Befehl versuchen die von Ihnen verwendeten Subshells nicht, das gesamte Gerät in den Speicher zu saugen, bevor Sie es in diff einspeisen.
Alanxz
1
@alanxz Nein, die diffSubshells lesen nicht das gesamte Gerät, bevor sie es schreiben. ddschreibt bsBytes unmittelbar nach dem Lesen (oder der Verarbeitung, falls angegeben, nicht hier), und sie schreiben in fifos, die blockieren, bis sie gelesen werden.
Kevin
Ich habe mehr auf Shell-Ebene nachgedacht (oder was auch immer das FIFO implementiert). Aber das beantwortet meine Frage!
Alanxz
2

Sie suchen nach binärer Diff-Software

rdiff
wurde für Backup und Netzwerkübertragung entwickelt. Sehen Sie sich rdiff-backup und Duplizität für Backup-Vorschläge an

xdelta3
ist ein Open-Source- Binärdiff mit Differentialkomprimierungswerkzeugen und VCDIFF-Delta-Komprimierung (RFC 3284).

bsdiff
ist auch !! speicherhungrig, ist nicht für Blockgeräte geeignet.

gustavodiazjaimes
quelle
1

Es gibt ein Dienstprogramm namens bsdiff , das genau so etwas macht. Es geht sehr schnell und kann bei Bedarf einen binären Patch generieren.

In diesem Beitrag finden Sie einige Erklärungen dazu.

Coren
quelle
bsdiffDie Aufgabe ist komplexer als nur zwei Dateien zu vergleichen. Ich bezweifle, dass sie schneller als die einfachere sein kann cmp.
Enzotib
Die Verbindung ist unterbrochen.
Owen Pauling
1

Sie können zwei unterschiedlich große Blockgeräte folgendermaßen vergleichen md5sum:

(vorausgesetzt das kleinere Gerät ist /dev/sda)

# md5sum /dev/sda && head -c $(blockdev --getsize64 /dev/sda) /dev/sdb | md5sum
EmmaV
quelle
0

Ziehen Sie in Betracht, fsckdas Backup auszuführen. Möglicherweise müssen Sie einige Streiche spielen losetup, um Loopback-Geräte auf Partitionen zu setzen, die in die Sicherung eingebettet sind. Wenn die Dateiprüfung jedoch besagt, dass die Dateistruktur konsistent ist, sind die Daten selbst wahrscheinlich gut.

Wenn Sie eine vollständige Prüfsumme wünschen, können Sie Loopback-Geräte mit Offsets verwenden, um die internen 'Partitionen' der Sicherung und der MD5-Summe separat zu betrachten. Eine erzwungene fsckkann Ihnen jedoch eine Grundidee geben, die viel schneller ist als Byte für Byte-Vergleiche oder Prüfsummenberechnungen.

Evan Langlois
quelle