linux - Copiando un archivo disperso de 1TB
file sparse-file (3)
De una pregunta relacionada , tal vez rsync
funcione:
rsync --sparse sparse-1 sparse-1-copy
Obtuve un archivo disperso de 1TB que almacena datos de 32MB en Linux.
¿Es posible "eficientemente" hacer un paquete para almacenar el archivo disperso? El paquete debe desempaquetarse para ser un archivo disperso de 1TB en otra computadora. Idealmente, el "paquete" debería estar alrededor de 32MB.
Nota: la posible solución es usar ''tar'': https://wiki.archlinux.org/index.php/Sparse_file#Archiving_with_.60tar.27
Sin embargo, para un archivo disperso de 1TB, aunque la bola de alquitrán puede ser pequeña, archivar el archivo disperso tomará demasiado tiempo.
Editar 1
Probé el tar y el gzip y los resultados son los siguientes (tenga en cuenta que este archivo disperso contiene datos de 0 bytes).
$ 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
El archivo 1TB sparse-1 que contiene datos de 0 bytes se puede archivar con ''tar'' en una bola de 10KB o comprimirse con gzip en un archivo de ~ 1GB. gzip toma alrededor de 2 veces del tiempo que el tar utiliza.
De la comparación, ''tar'' parece mejor que gzip.
Sin embargo, 96 minutos son demasiado largos para un archivo disperso que contiene datos de 0 bytes.
Editar 2
rsync
parece terminar de copiar el archivo en más tiempo que tar
pero menos que 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
Por lo tanto, tar
+ cp
o scp
deberían ser más rápidos que rsync
directamente para este archivo extremadamente disperso.
Editar 3
Gracias a @mvp por señalar la funcionalidad SEEK_HOLE en el kernel más nuevo. (Anteriormente trabajo en un kernel 2.6.32 de Linux).
Nota: se requiere la versión bsdtar> = 3.0.4 (consulte aquí: http://ask.fclose.com/4/how-to-efficiently-archive-a-very-large-sparse-file?show=299#c299 ).
En un kernel más nuevo y en la versión de Fedora (17), tar
y cp
manejan el archivo disperso de manera muy eficiente.
[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
Estoy usando un kernel 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
Definitivamente estás buscando una herramienta de compresión como tar
, lzma
, bzip2
, zip
o rar
. Según este sitio, lzma
es bastante rápido y aún tiene una buena relación de compresión:
http://blog.terzza.com/linux-compression-comparison-gzip-vs-bzip2-vs-lzma-vs-zip-vs-compress/
También puede ajustar la relación velocidad / calidad de la compresión ajustando el nivel de compresión a un nivel bajo, experimente un poco para encontrar el nivel que funcione mejor
Respuesta corta: use bsdtar
para crear archivos y GNU tar
para extraerlos en otro cuadro.
Respuesta larga: hay algunos requisitos para que esto funcione.
Primero, Linux debe tener al menos kernel 3.1 (Ubuntu 12.04 o posterior lo haría), por lo que admite la funcionalidad SEEK_HOLE.
Entonces, necesitas la utilidad tar que puede soportar este syscall. En este momento, GNU tar
no lo admite, pero bsdtar
sí lo instala, utilizando sudo apt-get install bsdtar
.
Si bien bsdtar
(que usa libarchive
) es impresionante, desafortunadamente, no es muy inteligente cuando se trata de desarticular, requiere estúpidamente tener al menos tanto espacio libre en la unidad de destino como tamaño de archivo sin etiquetar, sin tener en cuenta los orificios. GNU tar
desbloqueará eficazmente dichos archivos dispersos y no comprobará esta condición.
Este es el registro de Ubuntu 12.10 (kernel de 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
$
Como dije anteriormente, desafortunadamente, no es compatible con bsdtar
si no tienes un espacio libre de 1TB. Sin embargo, GNU tar funciona bien para sparse.tar
tal 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