巨大的 Docker 文件和 `tar` 行为

巨大的 Docker 文件和 `tar` 行为

当我使用 在我的 Linux 系统上进行备份时tar -czv,我注意到该过程停留了很长时间/var/lib/docker/devicemapper/devicemapper/data(比复制我的所有图像和容器所需的时间长得多),而结果文件并没有增长。

通过使用 检查此文件大小ls -lh,它会输出分区100G的大小20G。这是什么样的文件,tar在这里做什么?

答案1

看起来你有一个稀疏文件那里。

稀疏文件是一种计算机文件,当文件本身大部分为空时,它会尝试更有效地利用文件系统空间。这是通过将代表空块的简要信息(元数据)写入磁盘而不是构成块的实际“空”空间来实现的,从而占用较少的磁盘空间。仅当块包含“真实”(非空)数据时,才会将完整块大小作为实际大小写入磁盘。

这个答案说的是:

/var/lib/docker/devicemapper/devicemapper目录包含稀疏循环文件,其中包含 docker 挂载的所有其他数据。

您的文件主要由空块(全为零)组成,作为稀疏文件,它可以放入您的小分区中。显然,它tar只是读取所有零并对其进行处理。它们的压缩效果非常好,因此当零流结束时,结果文件只会稍微增大一点。

有一个命令行选项可以tar让它识别稀疏文件。它被描述为这里

-S
--sparse

对于您来说,我认为以下内容非常重要:

在提取时 (…),任何此类文件在发现漏洞的地方也会产生漏洞。(…) 在--sparse执行文件系统备份时考虑使用,以避免归档系统中稀疏存储的文件的扩展形式。

我猜你没有使用该--sparse选项,因此当进行提取时,你的100G文件将被创建为非稀疏文件,并且无法放入分区中20G

相关内容