Jak mogę sprawdzić, czy plik 1 TB został poprawnie przesłany?

25

Często przesyłam obrazy maszyn wirtualnych z hiperwizorów na serwer archiwum w celu długotrwałego przechowywania.

Przesyłam za pomocą netcata, ponieważ jest szybszy niż scp, rsync, itp.

hypervisor$ cat foo.box | nc <archive IP> 1234

archive$ nc -l -p 1234 > foo.box

Po zakończeniu przesyłania pliku sprawdzam, czy nie wystąpiło uszkodzenie, działając md5sumzarówno na celu, jak i źródle.

Niestety uruchomienie md5sum na dużym pliku może zająć bardzo dużo czasu. Jak mogę szybciej porównać integralność dwóch dużych plików?

Aktualizacja:

  • Moja transmisja rzadko jest przerywana, więc możliwość ponownego uruchomienia nie stanowi problemu.
  • Przekazanie przez NC zajmuje zwykle 3-4 godziny, a następnie 40 minut, aby uzyskać sumę md5.
  • W tym przypadku bezpieczeństwo skrótu nie stanowi problemu.
tbenz9
źródło
2
Możesz spróbować innej sumy kontrolnej: en.wikipedia.org/wiki/Checksum . Nie wiem jednak o ich występie
tumchaaditya
Jak długo trwa faktyczny transfer i jak długo trwa md5sum?
Keith Thompson
Transfer trwa zwykle od 3-4 godzin, a obliczenie sum md5 zajmuje około 40 minut.
tbenz9

Odpowiedzi:

18

Możesz użyć tee do zrobienia sumy w locie za pomocą czegoś takiego (dostosuj polecenia netcat do swoich potrzeb):

Serwer:

netcat -l -w 2 1111 | tee >( md5sum > /dev/stderr )

Klient:

tee >( md5sum > /dev/stderr ) | netcat 127.0.0.1 1111
nerdwaller
źródło
1
Tylko myśl: md5deepma tryb „chunk” ( md5deep.sourceforge.net/md5deep.html ), który może być do tego przydatny.
LawrenceC
@ultrasawblade - To niesamowite łącze, będę musiał to sprawdzić w innych celach. Dzięki, że o tym wspomniałeś!
nerdwaller
10

Odpowiedź Nerdwallera na temat teejednoczesnego przesyłania i obliczania sumy kontrolnej jest dobrym podejściem, jeśli martwisz się przede wszystkim o uszkodzenie w sieci. Nie ochroni cię jednak przed uszkodzeniem w drodze na dysk itp., Ponieważ pobiera sumę kontrolną, zanim trafi na dysk.

Ale chciałbym coś dodać:

1 TiB / 40 minut ≈ 437 MiB / s 1 .

Właściwie to dość szybko. Pamiętaj, że jeśli nie masz dużo pamięci RAM, musi ona wrócić z pamięci. Pierwszą rzeczą do sprawdzenia jest obserwowanie, iostat -kx 10jak uruchamiane są sumy kontrolne; w szczególności chcesz zwrócić uwagę na %utilkolumnę. Jeśli ustawiasz dyski (prawie 100%), odpowiedzią jest zakup szybszej przestrzeni dyskowej.

W przeciwnym razie, jak wspomniano w innych plakatach, możesz wypróbować różne algorytmy sumy kontrolnej. Wszystkie MD4, MD5 i SHA-1 są zaprojektowane jako skróty kryptograficzne (chociaż żadnego z nich nie należy już używać do tego celu; wszystkie są uważane za zbyt słabe). Jeśli chodzi o szybkość, możesz je porównać openssl speed md4 md5 sha1 sha256. Wrzuciłem SHA256, aby mieć przynajmniej jeden wystarczająco silny skrót.

The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md4              61716.74k   195224.79k   455472.73k   695089.49k   820035.58k
md5              46317.99k   140508.39k   320853.42k   473215.66k   539563.35k
sha1             43397.21k   126598.91k   283775.15k   392279.04k   473153.54k
sha256           33677.99k    75638.81k   128904.87k   155874.91k   167774.89k

Z powyższego widać, że MD4 jest najszybszy, a SHA256 najwolniejszy. Ten wynik jest typowy przynajmniej na sprzęcie podobnym do komputera PC.

Jeśli chcesz jeszcze większej wydajności (kosztem bycia trywialnym do manipulacji, a także mniejszym prawdopodobieństwem wykrycia korupcji), chcesz spojrzeć na skrót CRC lub Adlera. Z tych dwóch Adler jest zazwyczaj szybszy, ale słabszy. Niestety nie znam żadnych naprawdę szybkich implementacji wiersza poleceń; wszystkie programy w moim systemie działają wolniej niż md4 OpenSSL.

Tak więc, najlepiej postawić na szybkość openssl md4 -r( -rsprawia, że ​​wygląda to jak wyjście md5sum).

Jeśli chcesz trochę kompilować i / lub minimalnie programować, zobacz kod Mark Adlera w Stack Overflow, a także xxhash . Jeśli masz SSE 4.2, nie będziesz w stanie pokonać szybkości sprzętowej instrukcji CRC.


1 1 TiB = 1024⁴ bajtów; 1 MiB = 1024² bajtów. Dostarcza ≈417 MB / s przy mocy 1000 jednostek.

derobert
źródło
Jest szybki, kopiuję z jednej dużej macierzy RAID do drugiej dużej macierzy RAID.
tbenz9
@ tbenz9 Uznałem, że nie ma mowy, żeby to był jeden dysk! Dodałem pewne wskaźniki do niektórych naprawdę szybkich skrótów, które niestety będą wymagały przynajmniej ich skompilowania ... Ale na pewno będą działać tak szybko, jak twoje dyski (a nawet pamięć RAM) mogą dostarczyć dane. (A jeśli zastanawiasz się nad Markiem Adlerem przeciwko Adler32, tak, to wydaje się być twórcą
Adler32
@derobert, zamiast testować małe pliki, czy nie powinieneś testować go z dużym plikiem, takim jak 1 TB?
Pacerier
@derobert, dlaczego nie użyjesz shasumzamiast tego?
Pacerier
@Pacerier to wynik wbudowanego testu porównawczego OpenSSL. Bez wątpienia przy dłuższych blokach będzie to nieco szybsze, ale ranking raczej się nie zmieni (był spójny we wszystkich testowanych rozmiarach). Czy shasum ma szybszą implementację niż OpenSSL? Chociaż szczerze mówiąc dzisiaj, jeśli chcesz szybkiego skrótu kryptograficznego, użyjesz BLAKE2.
derobert
9

opensslKomenda obsługuje kilka streszczeń komunikatów. Z tych, które udało mi się wypróbować, md4wydaje się , że działa w około 65% czasu md5i około 54% czasu sha1(dla jednego pliku, z którym testowałem).

md2Dokumentacja znajduje się również w dokumentacji, ale wydaje się, że daje takie same wyniki jak md5.

Z grubsza prędkość wydaje się być odwrotnie związana z jakością, ale ponieważ (prawdopodobnie) nie martwisz się, że przeciwnik stworzy celową kolizję, nie powinno to stanowić większego problemu.

Możesz rozejrzeć się za starszymi i prostszymi skrótami wiadomości ( md1na przykład, czy istnieje )?

Drobna uwaga: masz Bezużyteczne wykorzystaniecat . Zamiast:

cat foo.box | nc <archive IP> 1234

możesz użyć:

nc <archive IP> 1234 < foo.box

lub nawet:

< foo.box nc <archive IP> 1234

Takie postępowanie oszczędza proces, ale prawdopodobnie nie będzie miało znaczącego wpływu na wydajność.

Keith Thompson
źródło
1
Dzięki za napiwek dla kota, niezwiązany z pytaniem, ale mimo to pomocna wskazówka. Twoje zdrowie!
tbenz9
@ tbenz9: czytelny kod jest łatwiejszy do debugowania, utrzymania i zmiany. catDlatego „bezużyteczny ” niekoniecznie jest całkowicie zły. Jeśli uniknięcie tego nie zwiększy wydajności, lepiej wybrać coś, z czym czujesz się lepiej, zakładając, że będziesz opiekunem tego kodu.
iconoclast
1
@Keith, Link down ..
Pacerier
4

Dwie opcje:

Posługiwać się sha1sum

sha1sum foo.box

W niektórych okolicznościach sha1sum jest szybszy .


Posługiwać się rsync

Transfer potrwa dłużej, ale rsync sprawdza, czy plik dotarł nienaruszony.

Ze strony podręcznika rsync

Zauważ, że rsync zawsze sprawdza, czy każdy przesłany plik został poprawnie zrekonstruowany po stronie odbierającej, sprawdzając sumę kontrolną całego pliku, która jest generowana podczas przesyłania pliku ...

spuder
źródło
1
Dzięki za wskazówkę dotyczącą sha1sum, rsync przesyła w górę ponad 10 godzin, mogę przesłać ten sam plik i uruchomić md5sums w około 4 godziny za pomocą nc i md5sum. Staram się, aby moje 4 godziny były jeszcze niższe.
tbenz9
3

Nauka się rozwija. Wygląda na to, że nowa funkcja skrótu BLAKE2 jest szybsza niż MD5 (i kryptograficznie silniejsza do uruchomienia).

Odniesienie: https://leastauthority.com/blog/BLAKE2-harder-better-faster-stronger-than-MD5.html

Ze slajdów Zooko:

cykli na bajt w funkcji Intel Core i5-3210M (Ivy Bridge) 
cykli na bajt
długa msg 4096 B 64 B. MD5 5.0 5,2 13.1 SHA1 4,7 4,8 13,7 SHA256 12,8 13,0 30,0 Keccak 8,2 8,5 26,0 BLAKE1 5,8 6,0 14,9 BLAKE2 3,5 3,5 9,3
Ninveh
źródło
2

Prawdopodobnie nie możesz zrobić nic lepszego niż dobry skrót. Możesz sprawdzić inne funkcje skrótu / sumy kontrolnej, aby sprawdzić, czy są one znacznie szybsze niż md5sum. Pamiętaj, że możesz nie potrzebować czegoś tak silnego jak MD5. MD5 (i rzeczy takie jak SHA1) są zaprojektowane tak, aby były silne pod względem kryptograficznym, więc atakujący / oszust nie jest w stanie stworzyć nowego pliku, który ma taką samą wartość skrótu jak istniejąca wartość (tj. Utrudnia manipulowanie podpisanym e -maile i inne dokumenty). Jeśli nie obawiasz się ataku na twoją komunikację, ale tylko błąd komunikacji, to coś w rodzaju cyklicznej kontroli nadmiarowej (CRC) może być wystarczające. (Ale nie wiem, czy byłoby to szybsze.)

Innym podejściem jest próba wykonania skrótu równolegle z przeniesieniem. Może to skrócić całkowity czas i zdecydowanie zmniejszyć czynnik podrażnienia związany z koniecznością oczekiwania na zakończenie transferu, a następnie ponownego oczekiwania na zakończenie MD5. Nie testowałem tego, ale powinno być możliwe zrobienie czegoś takiego:

  • Na maszynie źródłowej:

    mkfifo myfifo
    tee myfifo < plik_zrodlowy | nc dest_host  numer_portu i md5sum myfifo
    
  • Na maszynie docelowej:

    mkfifo myfifo
    nc -l -p numer_portu | tee myfifo> dest_file & md5sum myfifo
    

Oczywiście sprawdzanie rozmiarów plików to dobry, szybki sposób na wykrycie, czy jakieś bajty zostały upuszczone.

Scott
źródło
2

Wysyłanie dużych plików jest uciążliwe. Dlaczego nie spróbować podzielić plików generujących skrót dla każdego fragmentu, a następnie wysłać go do miejsca docelowego, a następnie sprawdzić skrót i dołączyć fragmenty.

Możesz także skonfigurować osobistą sieć BitTorrent. To zapewni, że całość dotrze bezpiecznie.

Gaurav Joseph
źródło
Rozumiem, że ponieważ jest to jedno źródło i jeden cel, sieć BitTorrent nie byłaby korzystna. Czy nie przyniesie to korzyści tylko w przypadku wielu miejsc docelowych z wielu źródeł?
tbenz9
Zastanawiałem się nad zasugerowaniem takiego podejścia (rozbicie pliku wejściowego na części, wysłanie ich osobno i ponowne złożenie z drugiej strony) i nie mogłem wymyślić, jak uczynić go nawet neutralnym pod względem wydajności, nie mówiąc już o poprawie. Nadal masz taki sam czas transferu sieci, ale masz dużo więcej kosztów na każdym końcu. W zasadzie polega to na skopiowaniu pliku z komputera źródłowego na komputer źródłowy , a następnie skopiowaniu go na komputer docelowy, a następnie skopiowaniu go z komputera docelowego na komputer docelowy . Nawet w przypadku dużych dysków RAM nie jest to bezpłatne.
Scott,
1
Jedyną zaletą tego podejścia jest możliwość ponownego uruchomienia, w tym szybsze odzyskiwanie po awarii transmisji. OP nie powiedział, jak często dostaje awarie, i nie wskazał, że chciał zoptymalizować to.
Scott,
@ tben9 Bittorrent to obecnie wybrane narzędzie do pojedynczego transferu plików. Posiadanie informacji o wartości skrótu w pliku oznacza, że ​​klient końcowy może zweryfikować pobrane dane i naprawić je w razie potrzeby. Wiele źródeł dotyczy prędkości. Tak, w takim przypadku korzystne jest użycie BT, aby zapewnić prawidłowe przesłanie pliku.
Obalenie