linux file sparse-file

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

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


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