复制1TB稀疏文件
我得到了一个1TB的稀疏文件,在Linux上实际上存储了32MB数据。
是否可以“有效地”制作一个软件包来存储稀疏文件?该软件包应解压缩为另一台计算机上的1TB稀疏文件。理想情况下,“软件包”应为32MB左右。
注意:可能的解决方案是使用“
tar”:https
:
//wiki.archlinux.org/index.php/Sparse_file#Archiving_with_.60tar.27
但是,对于1TB的稀疏文件,尽管tar球可能很小,但是将稀疏文件存档会花费很长时间。
我测试了tar和gzip,结果如下(请注意,此稀疏文件包含0字节的数据)。
$ du -hs sparse-10 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分钟太长了。
rsync
似乎完成复制文件的时间多于tar
但少于gzip
:
$ time rsync --sparse sparse-1 sparse-1-copyreal 124m46.321s
user 107m15.084s
sys 83m8.323s
$ du -hs sparse-1-copy
4.0K sparse-1-copy
因此,对于这个极为稀疏的文件,tar
+ cp
或scp
应该比直接速度更快rsync
。
感谢@mvp指出了较新内核中的SEEK_HOLE功能。(我以前在2.6.32 Linux内核上工作)。
注意:必须使用bsdtar版本> = 3.0.4(请在此处查看:http://ask.fclose.com/4/how-to-effective-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 -aLinux 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
(1.29或更高版本)来创建档案,并使用GNU
tar
(1.26或更高版本)来将它们提取到另一个盒子上。
这项工作有一些要求。
首先,Linux必须至少为内核3.1(Ubuntu 12.04或更高版本可以使用),因此它支持SEEK_HOLE
功能。
然后,您需要可以支持此syscall的tar实用程序。GNU tar
自1.29版(于2016/05/16发布,自Ubuntu
18.04起默认存在)或bsdtar
自3.0.4版(自Ubuntu 12.04起可用)提供支持sudo apt-get install
bsdtar。
尽管bsdtar
(使用libarchive
)很棒,但是不幸的是,它在解压缩时不是很聪明-
它愚蠢地要求目标驱动器上的空闲空间至少等于未解压缩文件的大小,而不考虑漏洞。GNU tar
将有效地解压缩此类稀疏档案,并且不会检查这种情况。
这是来自Ubuntu 12.10(Linux kernel 3.5)的日志:
$ dd if=/dev/zero of=1tb seek=1T bs=1 count=11+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
$
就像我在上面说的那样,不幸的是,bsdtar
除非拥有1TB的可用空间,否则使用松散是行不通的。但是,任何版本的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
以上是 复制1TB稀疏文件 的全部内容, 来源链接: utcz.com/qa/423385.html