체크섬이 포함 된 tar 파일 작성


16

내 문제는 다음과 같습니다. 많은 (최대 60TB) 큰 파일 (보통 30-40GB)을 tar 파일로 아카이브해야합니다. 보관하기 전에 이러한 파일의 체크섬 (md5, sha1 등)을 만들고 싶습니다. 그러나 모든 파일을 두 번 읽지 않으면 (체크섬 한 번, 타르 팅 두 번) 매우 높은 아카이빙 성능을 달성하기 위해 어느 정도 필요합니다 (LTO-4는 120MB / s를 유지하고 백업 기간이 제한됨).

따라서 파일을 읽고 한쪽에 체크섬 도구를 공급하고 다른쪽에 테이프로 타르를 빌드하는 방법이 필요합니다.

tar cf - files | tee tarfile.tar | md5sum -

전체 아카이브의 체크섬 (이 샘플 쉘 코드는 이것을 수행함)을 원하지 않지만 아카이브의 각 개별 파일에 대한 체크섬은 원하지 않습니다.

GNU tar, Pax, Star 옵션을 연구했습니다. Archive :: Tar 에서 소스를 살펴 보았습니다 . 나는 이것을 달성 할 분명한 방법이 없다. 내가 필요한 것을 달성하기 위해 C 또는 비슷한 것으로 손으로 무언가를 만들어야 할 것 같습니다. Perl / Python / etc 등은 단순히 성능 측면에서 떨어지지 않으며 다양한 tar 프로그램은 필요한 "플러그인 아키텍처"를 놓칩니다. 코드 변경을 시작하기 전에 기존 솔루션을 아는 사람이 있습니까?


3
tar당신이 그것을 작성하기로 결정한다면 확실히 유용한 추가 물처럼 들린다 ;)

1
아니 질문,하지만 함께 7z당신이 해시를 선택하는 방식으로 인쇄 할 수 있습니다 sha1sumsha256sum이해 할 수 7zip.bugaco.com/7zip/7zip_15_09/MANUAL/cmdline/commands/...를 (그리고 sami-lehtinen.net/blog/... ) 사용해보기 : 7z h -scrcsha256 mydir/* | sed --regexp-extended 's, +[0-9]+ +, ,g' > mydir.sha256sum ; sha256sum -c mydir.sha256sum(p7zip 버전 15.09 베타로 테스트)
Nemo

답변:


15

타르를 다시 작성하기 전에 한 번에 수행하는 것보다 속도가 느리지 않을 수 있으므로 빠르고 쉽게 데이터를 두 번 읽는 방법을 프로파일 링 할 수 있습니다.

두 가지 패스 방법이 여기에 있습니다.

http://www.g-loaded.eu/2007/12/01/veritar-verify-checksums-of-files-within-a-tar-archive/

하나의 라이너로 :

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

md5sum이 파이프를 통해 스트리밍되는 데이터를 가져 오는 대신 tar와 병렬로 디스크에서 각 파일을 읽는다는 사실이 사실이지만 Linux 디스크 캐시는 두 번째 읽기를 메모리 버퍼에서 간단한 읽기로 만들어야합니다. 표준 읽기. 두 번째 리더가 항상 캐시에서 읽고 디스크에서 검색하기에 충분히 뒤지지 않는 각 파일을 충분히 저장할 수 있도록 디스크 캐시에 충분한 공간이 있어야합니다.


3
실제로 꽤 잘 작동하며 md5를 크런치하는 CPU 기능 (한 코어에서 ~ 280MB / s)으로 제한됩니다.
wazoox

4

다음은 예제 Python 스크립트입니다. 아카이브에 추가되는 파일의 체크섬을 계산합니다. 스크립트가 끝나면 체크섬 파일이 아카이브에 추가됩니다.

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()

압축을 풀 때 chksum_file을 사용하여 체크섬을 확인하십시오.


1
그렇습니다. 제가 생각했던 것과 같은 것이지만, 보통 이런 종류의 라이브러리는 파일을 조작하기 전에 RAM에 파일을로드하며, 내 파일은 최소 20GB입니다.
wazoox

1

tar는 콘텐츠 테이블을 통해 아카이브 파일 내부에서 임의의 액세스 / 위치 지정을 허용하지 않으므로 모든 프로토콜은 파일이며 버퍼 기반이 아니므로 문제는 tar의 디자인 문제라고 생각합니다.
따라서 임의 액세스를 허용하는 PAX 또는 DAR과 같은 다른 형식을 볼 수 있습니다.


1
불행히도 tar 출력은 워크 플로의 기반이되기 때문에 필수입니다.
wazoox

0

최근 아카이브 형식에는 일반적으로 파일 확인을위한 일부 해시가 포함되지만 비슷한 문제가 있습니다. 항상 자체 해시 기능을 선택할 수 없으며 로컬 해시 사본을 유지할 수 없습니다.

아카이브 자체에 내장 된 것과는 다른 해시의 로컬 사본을 저장하려고 할 수 있습니다. 파일 / 디렉토리의 로컬 사본.

7zip 에는 7z h사용자 지정 해시 와 같은 몇 가지 옵션이 있으며7z l -slt 모든 해시를 나열하고 md5 또는 sha1 해시 목록을 원한다면 어떻게해야합니까? 허용 된 답변에 언급 된 George Notaras 방법을 사용 -bb하고-bs 자세한 정보를 제어하고 재사용 할 수 있습니다 .

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.