复制1TB稀疏文件(Copying a 1TB sparse file)

2019-07-03 14:46发布

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

是否有可能为“有效”打个包来存储稀疏文件? 该包应该解压到是另一台计算机上1TB稀疏文件。 理想情况下,“包”应约32MB。

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

然而,对于一个1TB稀疏文件,虽然焦油球可能很小,归档稀疏文件需要的时间太长了。

编辑1

我测试的焦油和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

1TB的文件稀疏-1包含0字节的数据可以通过“焦油”为10KB焦油球被存档或gzip压缩到一个〜1GB的文件。 gzip的花费的时间约2倍焦油所用的时间。

从比较中,“焦油”似乎比gzip更好。

然而,96分钟未对包含0字节的数据稀疏文件太长。

编辑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

Answer 1:

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

就像我上面说的,不幸的是,解包bsdtar不会工作,除非你有1TB的自由空间。 然而,GNU工程焦油只是罚款处理的打包这样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


Answer 2:

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

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


Answer 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



文章来源: Copying a 1TB sparse file