我得到了一个稀疏的1TB文件,它实际上在Linux上存储了32 on的数据。
是否有可能“高效”地制作一个包来存储稀疏文件?包应该被解压缩为另一台计算机上的1TB稀疏文件。理想情况下,“包”应该在32 be左右。
注意:关于可能的解决方案是使用'tar':.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文件稀疏-1可以由“tar”存档到10 1GB的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 + 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我使用的是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发布于 2012-11-07 10:01:08
简短回答:使用bsdtar或GNU tar (版本1.29或更高版本)创建归档文件,使用GNU tar (版本1.26或更高版本)在另一个框中提取它们。
长答案:,这需要一些条件才能工作。
首先,Linux至少必须是内核3.1 (Ubuntu12.04或更高版本就可以了),因此它支持SEEK_HOLE功能。
然后,您需要tar实用程序来支持这个syscall。GNU tar从1.29版本( 2016/05/16发布,它应该在默认情况下出现在Ubuntu18.04)或3.0.4版本(从Ubuntu12.04开始就可以使用)起就支持它--使用sudo apt-get install bsdtar安装它。
虽然bsdtar (使用libarchive)很棒,但不幸的是,它在解锁方面并不是很聪明--它愚蠢地要求目标驱动器上至少有与未注册的文件大小相同的空闲空间,而不考虑漏洞。GNU tar将有效地解压缩这种稀疏的档案,并且不会检查这种情况。
这是来自Ubuntu12.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
$正如我前面说过的,不幸的是,除非您有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发布于 2019-09-13 17:27:01
我意识到这个问题很古老,但是这里有一个更新,可能会帮助其他人找到他们的方式,就像我一样。
谢天谢地,mvp的出色回答现在已经过时了。根据GNU 焦油释放说明的说法,第1.29节增加了查找孔/查找数据,发布时间为2016-05-16。(既然GNU . 1.30现在在Debian稳定性中是标准的,那么可以放心地假设tar版本≥1.29几乎随处可见。)
因此,现在处理稀疏文件的方法是用安装在系统上的tar (GNU或BSD)对它们进行存档,并对其进行提取。
此外,对于实际包含某些数据的稀疏文件,如果值得使用压缩(即数据足够可压缩以节省大量磁盘空间,并且节省的磁盘空间值得压缩所需的大量时间和CPU资源):
tar -cSjf <archive>.tar.bz2 /path/to/sparse/file将利用tar的SEEK_HOLE功能快速高效地归档稀疏文件,并使用bzip2压缩实际数据。tar --use-compress-program=pbzip2 -cSf <archive>.tar.bz2 /path/to/sparse/file也将在使用多个内核执行压缩任务的同时,也会这样做。在我的带有四核原子CPU的小型家庭服务器上,使用pbzip2和bzip2可以减少大约25 %或30%的时间。
不管有没有压缩,这将为您提供一个存档,它不需要任何特殊的稀疏文件处理,大约占用原始稀疏文件的“真实”大小(如果压缩则更小),并且可以在不担心不同实用程序稀疏文件功能之间的不一致性的情况下四处移动。例如:cp将自动检测稀疏文件并执行正确的操作,如果您使用-S标志,rsync将正确处理稀疏文件,而scp没有稀疏文件选项(对于所有漏洞,它将消耗带宽复制零,由此产生的副本将是一个非稀疏文件,其大小为原始文件的“表”大小);但是,所有这些文件当然都能很好地处理一个tar存档--不管它是否包含稀疏文件--没有任何特殊标志。
补充说明
tar将自动检测用-S创建的存档,因此不需要指定它。pbzip2创建的存档存储在块中。这会导致存档比使用bzip2稍微大一些,但也意味着提取可以是多线程的,这与用bzip2创建的归档不同。pbzip2和bzip2将可靠地提取对方的档案,不会出现错误或损坏。发布于 2012-11-07 08:51:54
来自一个相关的问题的rsync可能会起作用:
rsync --sparse sparse-1 sparse-1-copyhttps://stackoverflow.com/questions/13252682
复制相似问题