#tar-archive #tar #archive #extract #in-place #unzip #header-file

app taro

内存受限系统的原地tar文件提取器

1 个不稳定版本

0.1.0 2019年2月28日

#712 in 压缩

MIT/Apache

86KB
403

taro

taro

Docs License

Taro提取是一种常用的调味品,常用于制作紫色珍珠奶茶。它也是一个命令行工具,可用于原地提取tar存档。

正常tar提取需要大约是原始存档两倍的磁盘空间。此工具可以使用仅额外512字节的磁盘空间,无论原始存档有多大。

用法

要提取文件recipe.tar,只需在命令行中运行taro recipe.tarrecipe.tar将被删除,其所有内容将在当前工作目录中创建。在此过程中,仅使用额外的512字节磁盘空间。

必读警告

有许多不同的tar实现,每种实现处理数据的方式略有不同。此工具设计成与GNU tar兼容,但它没有像原始GNU tar实现那样广泛使用。有可能某些tar存档可能无法正确提取。删除原始存档是一个故意的设计,所以请注意,您可能会丢失数据。请负责并保留备份。如果您找到一个无法使用此工具正确提取的tar存档示例,请提交问题或提交PR。

请注意,特别是,字符特殊文件、块特殊文件和FIFO目前无法使用taro重新创建。

工作原理

正常的tar存档格式化以简化单遍提取。例如,目录位于存档的起始部分,而目录中的文件位于末尾。遗憾的是,这使得在提取过程中原地删除文件变得非常困难。在Linux中,文件是向前读取的,写入必须覆盖原始文件或追加到文件末尾。无法从文件开头删除字节;它们必须从末尾截断。

幸运的是,这些属性足以使用tar归档作为具有简单push/pop操作的栈。tar归档格式的标准512字节块大小在此目的上效果更好。taro执行的第一步是将原始归档文件中的块顺序颠倒,通过将它们推送到两个颠倒的.rat文件中,一个用于头信息,一个用于文件内容,并逐个块地从.tar文件中删除它们。一旦.rat文件完全构建,就从它们的末尾弹出块,并将它们追加到文件系统中正确的提取位置。

难道你不能添加更多的磁盘空间吗??

我是SC18学生集群竞赛中的一个团队的系统管理员,在那里我们不得不构建一个3kW的计算集群,并在未知的数据集上对其性能进行基准测试。在比赛中,数据集以190GB的tar归档的形式提供。由于某种原因,我们有一个由四个节点组成的集群,每个节点的硬盘驱动器为256GB。经过仔细的照料,我设法在一个节点上清理出足够的空间来存储整个归档,并通过Raspberry Pi路由器从比赛的FTP服务器下载。正是在这里,我发现tar没有进行原地提取的方法。我可以选择性地提取文件,但原始归档仍然占据驱动器的大部分空间,而我们需要在运行任何东西之前拥有整个数据集。由于比赛规则,我们不允许添加外部驱动器或更改我们的网络配置。我们尝试将其传输到另一台机器,在那里提取它,然后再传输回来。不幸的是,网络速度是一个限制因素,我们最终耗尽了时间。

经过这次磨难后,我受到了启发,要构建一个原地tar归档提取器。虽然在大多数情况下可能不是必需的,但它可能在关键时刻拯救某人。

依赖项

~2–11MB
~127K SLoC