复制1TB稀疏文件

时间:2012-11-06 14:03:26

标签: 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

包含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

因此,对于这个非常稀疏的文件,tar + cpscp应该比直接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)上,tarcp有效处理稀疏文件非常

[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

我使用的是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

4 个答案:

答案 0 :(得分:21)

简答: 使用bsdtar创建存档,使用GNU tar将其提取到另一个框中。

答案很长: 这有一些要求。

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

然后,您需要可以支持此系统调用的tar实用程序。目前,GNU tar不支持它,但bsdtar确实支持它,使用sudo apt-get install bsdtar安装它。

虽然bsdtar(使用libarchive)很棒,但不幸的是,当谈到解围时它并不是很聪明 - 它愚蠢地要求在目标驱动器上至少有非自由空间。文件大小,不考虑漏洞。 GNU tar将有效地解压缩这些稀疏的档案,并且不会检查这种情况。

这是来自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

$ 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
$

就像我上面说过的那样,遗憾的是,除非你有1TB的可用空间,否则bsdtar无法解决问题。但是,GNU tar可以解决这样的sparse.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

答案 1 :(得分:1)

a related question开始,rsync可能会有效:

rsync --sparse sparse-1 sparse-1-copy

答案 2 :(得分:0)

我意识到这个问题很老了,但这是一个更新,对于那些像我一样找到自己的方式的人可能会有所帮助。

非常感谢,mvp的出色答案现在已过时。根据GNU tar release notes,在2016年5月16日发布的1.29版中添加了SEEK_HOLE / SEEK_DATA。 (而且,现在Debian稳定版中已成为GNU tar v.1.30的标准,因此可以肯定的是,几乎所有地方都可以使用tar版本≥1.29。)

因此,现在处理稀疏文件的方法是使用系统上安装的任何tar(GNU或BSD)以及用于提取的tar对其进行存档。

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

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

在我的带有四核Atom CPU的小型家用服务器上,使用pbzip2bzip2可以将时间减少25%或30%。

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

附加说明

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

答案 3 :(得分:-3)

您肯定在寻找压缩工具,例如tarlzmabzip2ziprar。根据这个网站,lzma非常快,同时仍具有相当好的压缩比:

http://blog.terzza.com/linux-compression-comparison-gzip-vs-bzip2-vs-lzma-vs-zip-vs-compress/

您还可以通过将压缩级别设置为较低来调整压缩的速度/质量比,尝试一下以找到效果最佳的级别

http://linux.die.net/man/1/unlzma