Tworzenie pliku tar z dołączonymi sumami kontrolnymi

16

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?

wazoox
źródło
3
Z pewnością brzmi jak przydatny dodatek, tarjeśli zdecydujesz się go napisać;)
1
Nie twoja sprawa, ale 7zmożna wybrać hash i wydrukować go w taki sposób, sha1suma sha256summoż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)
Nemo,

Odpowiedzi:

15

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ą:

  tar -cvpf mybackup.tar myfiles/| xargs -I '{}' sh -c "test -f '{}' && 
  md5sum '{}'" | tee mybackup.md5

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

bk.
źródło
3
W rzeczywistości działa całkiem dobrze, wygląda na ograniczoną zdolnością procesora do zgniatania md5 (~ 280 MB / s na jednym rdzeniu).
wazoox,
4

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.

import hashlib,os
import tarfile
def md5(filename):
    ''' function to get md5 of file '''
    d = hashlib.md5()
    try:
        d.update(open(filename).read())
    except Exception,e:
        print e
    else:
        return d.hexdigest()

root="/home"
outtar=os.path.join(root,"path1","output.tar")
path = os.path.join(root,"path1")
chksum_file=os.path.join(root,"path","chksum.txt")
tar = tarfile.open(outtar, "w")
o_chksum=open(chksum_file,"w")
for r,d,f in os.walk(path):
    for files in f:
        filename=os.path.join(r,files)
        digest="%s:%s"%(md5(filename) , filename)
        o_chksum.write(digest+"\n")
        tar.add(os.path.join(r,files))

tar.add(chksum_file)
tar.close()
o_chksum.close()

Podczas rozpakowywania użyj pliku chksum_file, aby zweryfikować sumę kontrolną

użytkownik37841
źródło
1
Tak, to coś takiego, o czym myślałem, ale zwykle tego rodzaju biblioteki ładują plik do pamięci RAM przed manipulowaniem nim, a moje pliki mają co najmniej 20 GB ....
wazoox
1

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.

weismat
źródło
1
Niestety, wyjście tar jest obowiązkowe, ponieważ na tym opiera się przepływ pracy.
wazoox
0

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 hniestandardowy skrót i 7z l -sltaby 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ć -bbi-bs kontrolować gadatliwość oraz ponownie wykorzystywać metodę George Notaras wymienioną w zaakceptowanej odpowiedzi:

7z a -bsp1 -bb3 dir.7z dir 2>&1 \
| grep "^+" | sed 's,^+ ,,g' | xargs -d "\n" -I § -P 1 sh -c "test -f '§' && sha1sum '§'" \
| tee dir.sha1
Nemo
źródło