我没想到这会这么难。我只是用焦油。我有两条数据,一条是大量的pcap数据,另一条是python泡沫化文件形式的额外元数据。我的目标是创建一个包含这两个文件的.tar文件,并使用XZ进行压缩。
我希望能够索引tarball,这样我就可以从.tar.xz文件中快速提取元数据文件。我使用PIXZ进行xz压缩,它自动对tar文件进行索引。因为我正在压缩的pcap太大了,所以我不想在磁盘被压缩之后再触摸它。我正在用tcprewrite对它做一些其他的修改,但它们并不重要。
我有我所有的工具设置使用命名管道,它是美丽和非常迅速。不幸的是,tar不适用于命名管道。每次我尝试压缩一个命名的管道时,它只会将/dev/fd/#编号写入tarball。而且我不能仅仅将pcap写入磁盘或/dev/shm来解析它,关键是pcap在压缩后才能到达磁盘。
我用python编写了整个实用程序,所以我尝试使用python的tarfile模块。文档声称它可以使用FIFO,但是当我使用tarfile.add()时,我遇到了同样的问题。我尝试过研究一些替代方案,比如zip (它有一个使用命名管道的-FI选项),但是我需要为我们现有的基础设施使用tar。
我试过gnutar和bsdtar,它们都不能与管道一起工作。最终,我使用什么工具并不重要,只要最终结果是一个.tar.xz文件,该文件将被索引并允许快速访问元数据。
发布于 2018-04-24 06:11:31
别为这事而沮丧..。我相信你会设法解决这个问题的!
我认为tar让您感到困惑的是,“支持命名管道”意味着它可以识别命名管道,并将它们作为命名管道存储在归档文件中,以便以后可以将它们恢复为命名管道.这不是你真正想要的。
另外,tar文件的格式不太适合您所做的工作,因为描述文件的条目存储在文件内容之前,而文件条目必须包含文件大小,所以除非事先知道内容的确切大小,否则很难这样做……
有这个解决方案 (参见TarFileStdin),它使用黑客来解决这个问题。它插入一个文件大小为零的TarInfo,然后存储文件的内容,最后查找原始TarInfo的偏移量,并用正确的大小覆盖它.有点太烦人了,但应该能用.但是继续读吧。
您提到过“我希望能够索引tarball,这样我就可以从.tar.xz文件中快速提取元数据文件”,所以看起来更像一个ZIP文件!ZIP格式首先存储所有文件的内容,然后在ZIP末尾存储文件信息表和偏移量。在这个意义上,它是索引的,就像你提到的。列出ZIP的内容可以快速完成,因为工具很容易从文件末尾开始查找该文件表。
您可以使用ZIP的本机压缩格式,也可以使用ZIP的“存储”模式(未压缩),然后在其中添加一个xyz.pcap.xz文件。将*.xz文件添加到ZIP中可以方便地使用外部压缩器,例如并行xz。
Python3‘S zipfile.ZipFile
对象有一个open()
方法,它允许您只按名称添加文件并接收可以写入内容的文件对象。
您可以使用该API和shutil.copyfileobj()
将您的压缩pcap从命名管道添加到ZIP文件中:
import shutil
import zipfile
with zipfile.ZipFile('mydata.zip', 'w') as zf:
with zf.open('xyz.pcap.xz', 'w') as outputf:
with open('/path/to/namedpipe', 'r') as inputf:
shutil.copyfileobj(inputf, outputf)
zf.write('metadata.pickle') # from local directory
这个代码片段假设您正在将已经xz压缩的pcap写入命名管道,并且已经将元数据序列化到当前目录中的一个名为“metadata.pickle”的文件中。(当然,您也可以使用ZIP文件的open()
将泡菜元数据直接序列化到ZIP文件中的一个条目中!)
如果要使用ZipFile的本机压缩,可以将默认压缩设置为ZipFile:
with zipfile.ZipFile('mydata.zip', 'w', zipfile.ZIP_LZMA) as zf:
(默认的是ZIP_STORED,这意味着没有压缩,如果要在那里传输xz压缩的数据,这可能就是您想要的。)
有关更多细节,请参见档文件文档。较新的Python具有更多的特性,例如,使用Python3.5,您实际上可以将pipe文件写入管道,这样就可以通过SSH将其直接上传到远程主机。
希望你能找到有用的东西!如果您真的需要一个tarball,可以尝试这个答案,但是我真的认为使用Python3的zipfile解决方案是您描述的用例的更好的方法!因此,如果这种格式是可能的,我真的会推荐它。
https://unix.stackexchange.com/questions/439607
复制相似问题