Oto mój problem: muszę archiwizować, aby spakować dużo plików (do 60 TB) dużych plików (zwykle 30 do 40 GB każdy). Chciałbym zrobić sumy kontrolne (md5, sha1, cokolwiek) tych plików przed archiwizacją; jednak nie czytanie każdego pliku dwa razy (raz dla sumowania kontrolnego, dwa razy dla tarowania) jest mniej więcej koniecznością do osiągnięcia bardzo wysokiej wydajności archiwizacji (LTO-4 chce utrzymania 120 MB / s, a okno tworzenia kopii zapasowych jest ograniczone).
Potrzebuję więc sposobu na odczytanie pliku, karmienie narzędzia do sumowania z jednej strony i budowanie tar na taśmę z drugiej strony, coś dalej:
tar cf - files | tee tarfile.tar | md5sum -
Tyle że nie chcę sumy kontrolnej całego archiwum (robi to tylko ten przykładowy kod powłoki), ale sumy kontrolnej dla każdego pliku w archiwum.
Studiowałem opcje GNU tar, Pax, Star. Spojrzałem na źródło z Archiwum :: Tar . Nie widzę żadnego oczywistego sposobu na osiągnięcie tego. Wygląda na to, że będę musiał ręcznie zbudować coś w C lub podobnym, aby osiągnąć to, czego potrzebuję. Perl / Python / etc po prostu nie wyciszy go pod względem wydajności, a różne programy tar brakuje niezbędnej „architektury wtyczek”. Czy ktoś wie o istniejącym rozwiązaniu tego problemu, zanim zacznę kasowanie kodu?
tar
jeśli zdecydujesz się go napisać;)7z
można wybrać hash i wydrukować go w taki sposób,sha1sum
asha256sum
może zrozumieć: 7zip.bugaco.com/7zip/7zip_15_09/MANUAL/cmdline/commands/... (i sami-lehtinen.net/blog/... ) Wypróbuj:7z h -scrcsha256 mydir/* | sed --regexp-extended 's, +[0-9]+ +, ,g' > mydir.sha256sum ; sha256sum -c mydir.sha256sum
(testowany z p7zip w wersji 15.09 beta)Odpowiedzi:
Przed przystąpieniem do przepisywania tar, możesz chcieć profilować szybką i łatwą metodę dwukrotnego odczytu danych, ponieważ może to nie być dużo wolniejsze niż zrobienie tego w jednym przebiegu.
Implikowana jest tutaj metoda dwuprzebiegowa:
http://www.g-loaded.eu/2007/12/01/veritar-verify-checksums-of-files-within-a-tar-archive/
z jednowarstwową:
Podczas gdy prawdą jest, że md5sum odczytuje każdy plik z dysku równolegle z tar, zamiast przesyłać dane strumieniowo przez potok, buforowanie dysku w systemie Linux powinno sprawić, że druga sekunda zostanie odczytana z bufora pamięci, co nie powinno być wolniejsze niż przeczytał standard. Musisz tylko upewnić się, że masz wystarczająco dużo miejsca w pamięci podręcznej dysku, aby pomieścić wystarczającą ilość każdego pliku, który 2. czytnik zawsze czyta z pamięci podręcznej i nie jest wystarczająco daleko w tyle, aby móc pobrać z dysku
źródło
Oto przykładowy skrypt w języku Python. Oblicza sumę kontrolną pliku dodawanego do archiwum. Na końcu skryptu plik sumy kontrolnej jest dodawany do archiwum.
Podczas rozpakowywania użyj pliku chksum_file, aby zweryfikować sumę kontrolną
źródło
Myślę, że twoim problemem jest kwestia projektowania tar, ponieważ tar nie pozwala na losowy dostęp / pozycjonowanie w pliku archiwum za pośrednictwem tabeli zawartości, dlatego wszystkie protokoły będą oparte na plikach, a nie na buforze.
Dlatego możesz spojrzeć na różne formaty, takie jak PAX lub DAR, które umożliwiają losowy dostęp.
źródło
Najnowsze formaty archiwów zazwyczaj zawierają pewien skrót do weryfikacji plików, ale mają podobny problem: nie zawsze możesz wybrać własną funkcję skrótu lub zachować lokalną kopię skrótów.
Możesz zapisać lokalną kopię skrótów, inną niż ta osadzona w samym archiwum: na przykład, jeśli archiwum jest przechowywane offline (na taśmach lub w centrum danych, które jest drogie do odczytania) i chcesz zweryfikować lokalna kopia pliku / katalogu.
7zip ma kilka opcji, takich jak
7z h
niestandardowy skrót i7z l -slt
aby wyświetlić listę wszystkich skrótów i co więcej, ale co jeśli chcesz listę skrótów MD5 lub SHA1? Możesz używać-bb
i-bs
kontrolować gadatliwość oraz ponownie wykorzystywać metodę George Notaras wymienioną w zaakceptowanej odpowiedzi:źródło