创建包含校验和的tar文件


16

这是我的问题:我需要将大量(最大30到40 GB)大文件(最多60 TB)归档到tar文件中。我想在归档之前对这些文件进行校验和(md5,sha1等)。然而读每一个文件两次(一次执行校验,两次tar'ing)或多或少的必需品,以达到很高的归档性能(LTO-4要120 MB / s的持续,以及备份窗口是有限的)。

因此,我需要某种方式来读取文件,在一侧提供一个校验和工具,在另一侧构建一个tar到磁带,类似于:

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

除了我不希望整个档案的校验和(此示例shell代码仅执行此操作),而是要档案中每个文件的校验和。

我研究了GNU焦油,Pax,Star选项。我查看了Archive :: Tar的源代码。我认为没有明显的方法可以实现这一目标。看来我必须手工用C或类似的东西来实现我所需要的。Perl / Python / etc根本无法降低性能,并且各种tar程序都缺少必要的“插件架构”。在开始编写代码之前,是否有人知道任何现有的解决方案?


3
tar如果您决定编写,那听起来当然是有用的补充;)

1
不是你的问题,但7z你可以选择哈希和打印的方式,sha1sum并且sha256sum可以理解:7zip.bugaco.com/7zip/7zip_15_09/MANUAL/c​​mdline/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 beta版进行了测试)
Nemo

Answers:


15

在继续并重写tar之前,您可能需要介绍一种快速简便的方法来两次读取数据,因为它可能不会比一次完成慢很多。

这里采用了两遍方法:

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
它实际上工作得很好,看起来受CPU处理md5的能力(一个内核约280MB / s)的限制。
wazoox 2010年

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文件操纵它之前,我的文件大小至少为20 GB ....
wazoox

1

我认为您的问题是tar的设计问题,因为tar不允许通过内容表在存档文件内部进行随机访问/放置,因此所有协议都将基于文件而不是基于缓冲区。
因此,您可能会看到允许随机访问的不同格式,例如PAX或DAR。


1
不幸的是,tar输出是强制性的,因为它是工作流的基础。
wazoox 2010年

0

最近的存档格式通常包括一些用于文件验证的哈希,但是它们也存在类似的问题:您不能总是选择自己的哈希函数,也不能保留哈希的本地副本。

您可能想要保存哈希的本地副本,该副本不同于存档本身中嵌入的副本:例如,如果存档是脱机存储的(存储在磁带或数据中心,读取成本很高),并且您想要验证文件/目录的本地副本。

7zip有几个选项,例如7z h自定义哈希值7z l -slt列出所有哈希值等,但是如果您想要md5或sha1哈希值列表怎么办?您可以使用-bb-bs控制详细程度,并重用已接受答案中提到的George Notaras方法:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.