复制1TB稀疏文件

我得到了一个1TB的稀疏文件,其中实际存储了32MB的Linux数据。

是否有可能“有效地”制作一个包来存储稀疏文件? 应该将该软件包解压缩为另一台计算机上的1TB稀疏文件。 理想情况下,“软件包”应该在32MB左右。

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

但是,对于1TB的稀疏文件,尽pipe焦油球可能很小,但归档稀疏文件需要很长时间。

编辑1

我testing了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焦油球,或者通过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_HOLEfunction。 (我以前在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 

简短的回答:使用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这个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 

从相关的问题 ,也许rsync将工作:

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

你一定在寻找一个压缩工具,比如tarlzmabzip2zip或者rar 。 根据这个网站, lzma是相当快的,而仍然有相当不错的压缩比:

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

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

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