
Gibt es in einer beliebigen Linux-Distribution eine Möglichkeit, eine MD5SUM- oder SHA1-Prüfung durchzuführen, während die Datei von einer lokalen Partition auf eine NFS-Partition übertragen wird?
Beispiel:
Ich habe ein per NFS gemountetes Laufwerk und eine sehr große Datei auf meinem lokalen Laufwerk. Ich möchte diese Datei auf das per NFS gemountete Laufwerk übertragen und gleichzeitig eine MD5-Prüfung durchführen. Ich habe viele Skripte gefunden, die die MD5-Prüfung durchführen, nachdem die Datei auf das Remote-Laufwerk kopiert wurde, aber da es sich um eine sehr große Datei (über 100 GB) handelt, würde ich gerne wissen, ob es eine Möglichkeit gibt, die Tatsache auszunutzen, dass die Datei bereits während der Übertragung gelesen wird.
Antwort1
Mir ist kein Standard-Linux-Dienstprogramm bekannt, das dies kann. Wenn die Datei in Ihren speicherbasierten Cache passen würde, wäre es nicht so ineffizient, zuerst die MD5-Summe zu berechnen und dann zu kopieren (beim Kopieren würden die Daten aus dem Speicher abgerufen).
Sie können folgende Kombination verwenden:
cat filename | tee remote_output_name | md5sum
Dies können Sie möglicherweise ändern, um die ausgegebene Summe direkt md5sum
mit dem gespeicherten MD5 zu vergleichen. Dadurch wird die Datei nur einmal von der Festplatte gelesen.
Angenommen, Sie haben eine generiert check.md5
mit
cd dir_with_big_files
md5sum * > check.md5
, das folgende Python-Programm würde das Kopieren und Prüfen einer einzelnen Datei durchführen und dabei jeweils 64 MB lesen/schreiben. Speichern Sie es als /usr/local/bin/chkcopy chmod +x /usr/local/chkcopy
und rufen Sie es mitchkcopy file_name check.md5 destination_filename_or_dir
#! /usr/bin/env python
import sys, os, hashlib
m = hashlib.md5()
file_name = sys.argv[1]
md5_name = sys.argv[2]
out_name = sys.argv[3]
if os.path.isdir(out_name):
out_name = os.path.join(out_name, file_name)
BUF_SIZE = 64 * (1024 ** 2)
with open(file_name, 'rb') as ifp:
with open(out_name, 'wb') as ofp:
buf = ifp.read(BUF_SIZE)
while buf:
m.update(buf)
ofp.write(buf)
buf = ifp.read(BUF_SIZE)
with open(md5_name) as fp:
for line in fp:
md5, fn = line.rstrip().split(' ', 1)
if fn == file_name:
assert m.hexdigest() == md5
break
else:
print('no md5 found for ' + file_name)
Antwort2
Es gibt einen Fork des bekannten dd
mit erweiterter Funktionalität namensdcfldd
die ich seit Jahren benutze oder eine gepatchte dd
Version namensdc3dd
mit etwas ähnlicher Funktionalität.
Beide Tools können während des Kopierens Hashes durchführen (auf Wunsch auch mit mehreren Hash-Typen gleichzeitig). Hashes können über Chunks und/oder den gesamten Datenstrom berechnet werden.
Einige Distributionen wie Debian bieten Pakete direkt in ihren Repositories an, Pakete für Fedora sind über das externeZertifikat-RepositorysZum Beispiel.
So kopieren Sie eine Datei in 8-MiB-Blöcken und berechnen die MD5-Summe der gesamten Daten, die auf STDERR ausgegeben wird:
dcfldd if=/path/to/input bs=8M hash=md5 of=/path/to/outputfile
So kopieren Sie eine Datei in 8-MiB-Blöcken und berechnen den SHA256-Hash der gesamten Daten sowie die SHA256-Summe über jeden 64-MiB-Block:
dcfldd if=/path/to/input bs=8M hash=SHA256 hashwindow=64M of=/path/to/outputfile
Eine Ausgabedatei für den berechneten Hash kann auch bereitgestellt werden, indem eine Datei über den hashlog
Parameter angegeben wird. Bei der Berechnung mehrerer Hashes können separate Ausgaben beispielsweise über angegeben werden md5log=FILE1.log sha256log=FILE2.log
.
Antwort3
Sie können ein externes Programm () verwenden crcsum
, das cp
und mv
mit Prüfsumme erweitert: