复制1TB稀疏文件

eri*_*zma 16 linux file sparse-file

我得到了1TB的稀疏文件,它实际上在Linux上存储了32MB的数据.

是否有可能"有效"地创建一个包来存储稀疏文件?应将程序包解压缩为另一台计算机上的1TB稀疏文件.理想情况下,"包"应该在32MB左右.

注意:可能的解决方案是使用'tar':https://wiki.archlinux.org/index.php/Sparse_file#Archiving_with_.60tar.27

但是,对于1TB稀疏文件,尽管tar球可能很小,但归档稀疏文件将花费很长时间.

编辑1

我测试了tar和gzip,结果如下(请注意,这个稀疏文件包含0字节的数据).

$ du -hs sparse-1
0   sparse-1

$ ls -lha sparse-1
-rw-rw-r-- 1 user1 user1 1.0T 2012-11-03 11:17 sparse-1

$ time tar cSf sparse-1.tar sparse-1

real    96m19.847s
user    22m3.314s
sys     52m32.272s

$ time gzip sparse-1

real    200m18.714s
user    164m33.835s
sys     10m39.971s

$ ls -lha sparse-1*
-rw-rw-r-- 1 user1 user1 1018M 2012-11-03 11:17 sparse-1.gz
-rw-rw-r-- 1 user1 user1   10K 2012-11-06 23:13 sparse-1.tar
Run Code Online (Sandbox Code Playgroud)

包含0字节数据的1TB文件sparse-1可以通过'tar'存档到10KB tar球或通过gzip压缩到~1GB文件.gzip占用tar时间的2倍左右.

从比较来看,'tar'似乎比gzip更好.

但是,对于包含0字节数据的稀疏文件,96分钟太长.

编辑2

rsync似乎完成复制文件的时间超过tar但小于gzip:

$ time rsync --sparse sparse-1 sparse-1-copy

real    124m46.321s
user    107m15.084s
sys     83m8.323s

$ du -hs sparse-1-copy 
4.0K    sparse-1-copy
Run Code Online (Sandbox Code Playgroud)

因此,对于这个非常稀疏的文件,tar+ cp或者scp应该比直接更快rsync.

编辑3

感谢@mvp在新内核中指出了SEEK_HOLE功能.(我之前在2.6.32 Linux内核上工作).

注意:需要bsdtar版本> = 3.0.4(请点击此处:http://ask.fclose.com/4/how-to-efficiently-archive-a-very-large-sparse-file?show=299#c299 ).

在新的内核和Fedora发行版(17),tar以及cp处理稀疏文件非常有效.

[zma@office tmp]$ ls -lh pmem-1 

-rw-rw-r-- 1 zma zma 1.0T Nov  7 20:14 pmem-1
[zma@office tmp]$ time tar cSf pmem-1.tar pmem-1

real    0m0.003s
user    0m0.003s
sys 0m0.000s
[zma@office tmp]$ time cp pmem-1 pmem-1-copy

real    0m0.020s
user    0m0.000s
sys 0m0.003s
[zma@office tmp]$ ls -lh pmem*
-rw-rw-r-- 1 zma zma 1.0T Nov  7 20:14 pmem-1
-rw-rw-r-- 1 zma zma 1.0T Nov  7 20:15 pmem-1-copy
-rw-rw-r-- 1 zma zma  10K Nov  7 20:15 pmem-1.tar
[zma@office tmp]$ mkdir t
[zma@office tmp]$ cd t
[zma@office t]$ time tar xSf ../pmem-1.tar 

real    0m0.003s
user    0m0.000s
sys 0m0.002s
[zma@office t]$ ls -lha
total 8.0K
drwxrwxr-x   2 zma  zma  4.0K Nov  7 20:16 .
drwxrwxrwt. 35 root root 4.0K Nov  7 20:16 ..
-rw-rw-r--   1 zma  zma  1.0T Nov  7 20:14 pmem-1
Run Code Online (Sandbox Code Playgroud)

我使用的是3.6.5内核:

[zma@office t]$ uname -a
Linux office.zhiqiangma.com 3.6.5-1.fc17.x86_64 #1 SMP Wed Oct 31 19:37:18 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

mvp*_*mvp 23

简短的回答: 使用bsdtar创建档案,以及GNU tar提取它们在另一台电脑.

答案长:这有一些要求.

首先,Linux必须至少是内核3.1(Ubuntu 12.04或更高版本),因此它支持SEEK_HOLE功能.

然后,您需要可以支持此系统调用的tar实用程序.目前,GNU tar不支持它,但SEEK_HOLE确实 - 使用它安装它tar.

虽然bsdtar(使用sudo apt-get install bsdtar)很棒,但不幸的是,当涉及到解决方案时它并不是很聪明 - 它愚蠢地要求在目标驱动器上至少具有与非文件大小一样多的可用空间,而不考虑空洞.GNU bsdtar将有效地解压缩这些稀疏的档案,并且不会检查这种情况.

这是来自Ubuntu 12.10(Linux内核3.5)的日志:

$ dd if=/dev/zero of=1tb seek=1T bs=1 count=1
1+0 records in
1+0 records out
1 byte (1 B) copied, 0.000143113 s, 7.0 kB/s

$ time bsdtar cvfz sparse.tar.gz 1tb 
a 1tb

real    0m0.362s
user    0m0.336s
sys 0m0.020s

# Or, use gnu tar if version is later than 1.29:
$ time tar cSvfz sparse-gnutar.tar.gz 1tb
1tb

real    0m0.005s
user    0m0.006s
sys 0m0.000s

$ ls -l
-rw-rw-r-- 1 autouser autouser 1099511627777 Nov  7 01:43 1tb
-rw-rw-r-- 1 autouser autouser           257 Nov  7 01:43 sparse.tar.gz
-rw-rw-r-- 1 autouser autouser           134 Nov  7 01:43 sparse-gnutar.tar.gz
$
Run Code Online (Sandbox Code Playgroud)

就像我上面所说的那样,不幸的是,libarchive除非你拥有1TB的可用空间,否则无法解决问题.但是,GNU tar可以很好地解决这个问题tar:

$ rm 1tb 
$ time tar -xvSf sparse.tar.gz 
1tb

real    0m0.031s
user    0m0.016s
sys 0m0.016s
$ ls -l
total 8
-rw-rw-r-- 1 autouser autouser 1099511627777 Nov  7 01:43 1tb
-rw-rw-r-- 1 autouser autouser           257 Nov  7 01:43 sparse.tar.gz
Run Code Online (Sandbox Code Playgroud)

  • 惊人的!我猜 SEEK_HOLE 起作用了!我在 3.6.5 Linux 内核上尝试了 `tar` 和 `cp`,两者都非常快。谢谢! (2认同)
  • 可悲的是,自从我写这篇文章以来已有1.5年了,GNU`tar`*仍然没有学会有效地解析漏洞,所以这个配方仍然非常相关!:(... (2认同)
  • 最后,GNU tar 从 1.29 版本开始正确支持这一点;-) (2认同)

Ask*_*eli 8

我意识到这个问题很老了,但这里有一个更新,可能对像我一样在这里找到方法的其他人有所帮助。

\n\n

值得庆幸的是,mvp 的出色答案现在已经过时了。根据 GNU tar 发行说明,SEEK_HOLE/SEEK_DATA 是在 2016-05-16 发布的 v.1.29 中添加的。(现在 GNU tar v. 1.30 已成为 Debian 稳定版本的标准,因此可以安全地假设 tar 版本 \xe2\x89\xa5 1.29 几乎在任何地方都可用。)

\n\n

因此,现在处理稀疏文件的方法是使用系统上安装的任何 tar(GNU 或 BSD)对它们进行归档,提取时也是如此。

\n\n

此外,对于实际包含一些数据的稀疏文件,如果值得使用压缩(即数据可压缩到足以节省大量磁盘空间,并且磁盘空间节省值得花费大量时间和 CPU 资源来进行压缩)。压缩它):

\n\n
    \n
  • tar -cSjf <archive>.tar.bz2 /path/to/sparse/file都将利用 tar\ 的 SEEK_HOLE 功能来快速有效地归档稀疏文件,并使用 bzip2 来压缩实际数据。
  • \n
  • tar --use-compress-program=pbzip2 -cSf <archive>.tar.bz2 /path/to/sparse/file正如 marcin 的评论中提到的,将执行相同的操作,同时使用多个核心来执行压缩任务。
  • \n
\n\n

在我的带有四核 Atom CPU 的小型家庭服务器上,使用pbzip2vsbzip2减少了大约 25 或 30% 的时间。

\n\n

无论是否压缩,这都会为您提供一个不需要任何特殊稀疏文件处理的存档,大约占用原始稀疏文件的“实际”大小(如果压缩则更少),并且可以移动无需担心不同实用程序的稀疏文件功能之间的不一致。例如:cp将自动检测稀疏文件并执行正确的操作,rsync如果使用该-S标志,将正确处理稀疏文件,并且scp没有稀疏文件选项(它将消耗带宽为所有孔复制零,并且生成的副本将是非稀疏文件,其大小为原始文件的“表观”大小);但它们当然都能很好地处理 tar 存档\xe2\x80\x94,无论它是否包含稀疏文件\xe2\x80\x94,而无需任何特殊标志。

\n\n

补充笔记

\n\n
    \n
  1. 提取时,tar将自动检测使用创建的存档-S,因此无需指定它。
  2. \n
  3. 使用创建的存档pbzip2存储在块中。这会导致存档比使用的存档稍大bzip2,但也意味着提取可以是多线程的,这与使用 . 创建的存档不同bzip2
  4. \n
  5. pbzip2并将bzip2可靠地提取彼此的档案,而不会出现错误或损坏。
  6. \n
\n