这是我的问题:我需要将大量文件(最多60 TB)归档到tar文件(通常每个30到40 GB).我想在归档之前制作这些文件的校验和(md5,sha1,等等);然而,两次不读取每个文件(一次用于校验和,两次用于tar’)或多或少是实现非常高的归档性能的必要条件(LTO-4需要120 MB / s持续,并且备份窗口有限).
所以我需要一些方法来读取文件,在一侧提供校验和工具,并在另一侧构建tar到磁带,以及:
tar cf - files | tee tarfile.tar | md5sum -
除了我不想要整个存档的校验和(这个示例shell代码只是这样),但是存档中每个单独文件的校验和.
我研究过GNU tar,Pax,Star选项.我看过Archive::Tar的源代码.我认为没有明显的方法来实现这一目标.看起来我将不得不用C或类似的东西手工构建一些东西来实现我的需要. Perl / Python / etc不会在性能方面削减它,并且各种tar程序错过了必要的“插件架构”.在开始代码搅拌之前,有没有人知道任何现有的解决方案?
解决方法
在继续并重写tar之前,您可能想要分析两次读取数据的快速简便方法,因为它可能不会比在一次传递中慢得多.
这里实现了两个pass方法:
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磁盘缓存应该使第二次读取从内存缓冲区中读取一个简单的内存缓冲区,这应该不会真正慢于stdin阅读.您只需要确保磁盘缓存中有足够的空间来存储第二个读取器始终从缓存中读取的每个文件,并且远远不够,必须从磁盘检索