Ich habe ein ~ 1-GB-Image, das ich über das dd
Tool auf eine 8-GB-SD-Karte schreibe . Ich möchte überprüfen, ob es ohne Korruption geschrieben wurde, indem ich es zurücklese und seinen Hash mit dem Original vergleiche.
Wenn ich es über dd
die Größe des resultierenden Bildes zurücklese, stimmt es natürlich mit der Größe meiner SD-Karte überein, weshalb das Überprüfen von Hashes nutzlos ist.
Ich glaube, dass ich die Ausgabe des Schreibaufrufs irgendwie interpretieren sollte , um die skip
/ count
-Parameter so zu konfigurieren , dass sie richtig zurückgelesen werden.
Befehl, mit dem ich mein Bild geschrieben habe:
> sudo dd if=my.img of=/dev/sdc bs=1M
8+50581 records in
8+50581 records out
3947888640 bytes (3.9 GB) copied, 108.701 s, 36.3 MB/s
Befehl, mit dem ich mein Bild gelesen habe:
> sudo dd if=/dev/sdc of=same_as_my.img
15523840+0 records in
15523840+0 records out
7948206080 bytes (7.9 GB) copied, 285.175 s, 27.9 MB/s
files
dd
file-comparison
Kentzo
quelle
quelle
Antworten:
Bestimmen Sie die Größe des Bildes zum Beispiel mit
\ls -l my.img
(nichtls -lh
, das würde Ihnen eine ungefähre Größe geben;\ls
schützt vor einem Alias wiels='ls -h'
) oder mitstat -c %s my.img
.Wenn Sie die Kopie nur einmal mit dem Original vergleichen möchten, vergleichen Sie einfach die Dateien. Die Verwendung von Hashes ist für einen einmaligen Vergleich nutzlos. Sie würde die Dinge nur langsamer machen und mehr Befehle erfordern. Der Befehl
cmp
vergleicht Binärdateien. Sie müssen ihm die Bilddatei und den entsprechenden Teil der SD-Karte übergeben. Verwenden Siehead
diese Taste, um den Anfang der SD-Karte zu extrahieren.Wenn Sie viele Vergleiche durchführen möchten, sind Hashes hilfreich, da Sie jede Instanz nur einmal lesen müssen, um ihren Hash zu berechnen. Jeder Hash ist ausreichend, da Sie sich Sorgen um Datenkorruption machen. Wenn Sie überprüfen erforderlich , dass eine Datei aus Sicherheitsgründen nicht geändert wurde, dann
cksum
undmd5sum
würde nicht geeignet sein, sollten Sie verwendensha256sum
odersha512sum
statt.Beachten Sie die Eingabeumleitung im ersten Befehl. Dadurch wird sichergestellt, dass die Prüfsummendatei keine Dateinamen enthält, sodass Sie die Prüfsummendateien vergleichen können. Wenn Sie eine Prüfsummendatei und eine zu überprüfende Kopie haben, können Sie die Prüfung direkt mit durchführen
Oh, und nicht verwenden
dd
, es ist langsam (oder bestenfalls nicht schneller) und erkennt keine Kopierfehler.quelle
Was wir getan haben, war
md5um
die eigentliche Partition. Es erlaubt Ihnen nicht genau, das Image mit der Festplatte zu prüfen, aber wenn Sie ein paar Festplatten haben (wie wir), können Sie die 'richtige' Prüfsumme erstellen.In unserem Fall sehen die Partitionen beispielsweise so aus:
Wir können dann einfach einen Hash für die Partition (en) generieren mit:
Dies setzt jedoch Folgendes voraus:
Beachten Sie auch, dass Sie nicht die gesamte Festplatte prüfen können (dh '/ dev / sdc' im obigen Beispiel), da dies einen anderen Hash ergibt, der auf den Eigenschaften der SD-Karte basiert.
quelle
md5sum
wäre hier eine gute lösung, um den wert der image-datei mit dem der sd-karte zu vergleichen.quelle
Schreiben Sie es in ein Dateisystem auf der SD-Karte? Oder direkt? Sie müssen zählen, wenn Sie die Lauflänge der verglichenen Daten begrenzen möchten?
dd sollte Ihnen mitteilen, wie viele Bytes kopiert wurden.
Dies muss erfasst und mit den entsprechenden Werten bs = x und count = y verwendet werden. Auf diese Weise soll vermieden werden, dass in einer Clusterspitze Hashing-Müll entsteht.
BEARBEITEN
Erfassen Sie die Ausgabe. Dies ist die gewünschte Zeile. Verwenden Sie grep für Bytes.
also (entschuldigen Sie Ausführlichkeit und Backticks).
Dies wird langsam sein, daher müssen Sie (und ich werde es hier nicht tun) zuerst die optimale Blockgröße und die Anzahl der zu lesenden ganzen Vielfachen berechnen und dann den Rest mit einem Sprung / Suchvorgang abrufen.
Ein besserer Ansatz wäre es jedoch, eine aufgerundete Anzahl von Blöcken zurückzulesen und den Hash auf einer verkürzten Länge auszuführen. Das Ziel besteht darin, nicht das gesamte Gerät zu lesen, wenn dies nicht erforderlich ist.
quelle
cmp
vergleicht zwei Dateien Byte für Byte und gibt sie zurück, je nachdem, ob sie identisch sind oder nicht. Wenn eine Datei kürzer ist als die andere, aber beide Dateien über die gesamte Länge der kürzeren Datei identisch sind,cmp
wird 1 zurückgegeben undEOF on <shorter file>...
an stderr gemeldet . Wenn beide Dateien identisch sind,cmp
wird 0 zurückgegeben und es wird überhaupt nichts gemeldet. Wenn sie sich jedoch sonst unterscheiden,cmp
wird 1 zurückgegeben und das Byte angegeben, in dem sie sich unterscheiden. Die obige Anweisung gibt also 1 für jedencmp
Lauf zurück, der eine Ausgabezeile für stdout oder stderr erzeugt, die nicht mitEOF on $1
oder 0 übereinstimmt .quelle
IMO ist die beste (einfachste) Möglichkeit, dies zu tun. Verwenden Sie bei Verwendung von dd eine Byte-Größe (bs =), die gleichmäßig in Ihre Quelldatei unterteilt werden kann. Dies führt zu einer ganzen Anzahl von Blockschreibvorgängen. Dann können Sie den Vorgang umkehren (zurücklesen), indem Sie sicherstellen, dass die genaue Anzahl der Bytes von uns im Befehl read sowohl bs = als auch count = gelesen wird - und durch das Prüfsummenprogramm leiten.
Beispiel:
Generiere eine Checksumme:
Die Dateigröße 1006632960 ist teilbar durch 512. Also benutze dd:
ergibt diese Ausgabe:
Das +0 ist hier der wichtige Teil. Wenn Sie etwas anderes als +0 sehen, benötigen Sie eine andere Bytesize in Ihrem Befehl dd.
Verwenden Sie dann den folgenden Befehl, um die Ergebnisse zu überprüfen:
und die Ausgabe stimmt mit der vorherigen sha256sum überein, was bedeutet, dass es sich um eine gute Kopie handelt:
Das Schwierigste ist, die Bytesize richtig zu machen. Sobald Sie es haben, ist der Rest einfach.
quelle