为什么“tar -cSf file.tar source”会耗尽内存?

为什么“tar -cSf file.tar source”会耗尽内存?

我正在尝试通过制作 tarball 将 66 GB 的数据备份到 NAS,但是“tar -cSf ...”在 62 GB 之后因“内存耗尽”错误而退出。我的 Linux 机器有 1 GB 的 RAM 和 1 GB 的交换空间。

(编辑) 我再次尝试了 tar 放弃的地方,但 tar 很快又放弃了,所以看起来它可能在处理特殊文件时遇到了麻烦。

这些数据意外地难以备份。rsync 比 tar 慢 4 倍,因为 NAS 速度不是很快,而且它会在中途退出,并显示“对方重置连接”;“cp”在 cifs 共享上无法正常工作,因为它无法创建特殊文件。还有更好的方法吗?

答案1

-S正在对稀疏文件(并非所有文件扩展都实际物理分配到磁盘上的文件)进行一些检查。这可能耗尽内存。尝试在不使用 -S 的情况下运行它(如果确实需要,请压缩它),看看这是否能解决问题。

tar cf foo.tar *

或者

tar czf foo.tar.gz *

答案2

我不知道为什么,但我建议你尝试一下

tar -L 32212254720 -f piece1.tar -f piece2.tar -f piece3.tar <path>

每 30 GB 会创建一个文件。如果达到 120 GB,则需要添加第四个文件 (-f piece4.tar)

如果这仍然失败,您可以尝试使用较小的片段并编写脚本来生成命令行(因为带有 80 个 -f 参数的命令行很难编写:-))

答案3

尝试传递 --hard-dereference 选项。这将禁用硬链接跟踪,这需要与要备份的 inode 数量成比例的内存。在 tar 进程尝试备份问题文件时尝试跟踪它也可能很有趣。

相关内容