Si ejecuto tar -cvf
en un directorio de tamaño 937MB para crear una copia fácilmente descargable de una estructura de carpetas profundamente anidada, ¿me arriesgo a llenar el disco dada la siguiente df -h
salida:
/dev/xvda1 7.9G 3.6G 4.3G 46% /
tmpfs 298M 0 298M 0% /dev/shm
Preguntas relacionadas:
- Si el disco puede llenarse, ¿por qué, por ejemplo, qué hará Linux (Amazon AMI) y / o qué estará
tar
haciendo bajo el capó? - ¿Cómo puedo determinar esta información con precisión sin preguntar nuevamente?
tar
disk-usage
codecowboy
fuente
fuente
--totals
opción. De cualquier manera, si llena el disco, simplemente puede eliminar el archivo, en mi humilde opinión. Para verificar todas las opciones disponibles, puede pasartar --help
.Respuestas:
tar -c data_dir | wc -c
sin compresióno
tar -cz data_dir | wc -c
con compresión gzipo
tar -cj data_dir | wc -c
con compresión bzip2imprimirá el tamaño del archivo que se crearía en bytes, sin escribir en el disco. Luego puede compararlo con la cantidad de espacio libre en su dispositivo de destino.
Puede verificar el tamaño del directorio de datos en sí mismo, en caso de que se haya hecho una suposición incorrecta sobre su tamaño, con el siguiente comando:
du -h --max-depth=1 data_dir
Como ya se respondió, tar agrega un encabezado a cada registro en el archivo y también redondea el tamaño de cada registro a un múltiplo de 512 bytes (por defecto). El final de un archivo está marcado por al menos dos registros consecutivos llenos de cero. Por lo tanto, siempre tendrá un archivo tar sin comprimir más grande que los archivos, la cantidad de archivos y la forma en que se alinean con los límites de 512 bytes determina el espacio adicional utilizado.
Por supuesto, los sistemas de archivos en sí mismos usan tamaños de bloque que pueden ser más grandes que el contenido de un archivo individual, así que tenga cuidado donde lo descomprime, ¡es posible que el sistema de archivos no pueda contener muchos archivos pequeños aunque tenga espacio libre mayor que el tamaño del alquitrán!
https://en.wikipedia.org/wiki/Tar_(computing)#Format_details
fuente
-f -
para tar es redundante, ya que simplemente puede omitir el-f
argumento por completo para escribir el resultado en stdout (es decirtar -c data_dir
).El tamaño de su archivo tar será de 937MB más el tamaño de los metadatos necesarios para cada archivo o directorio (512 bytes por objeto), y el relleno agregado para alinear los archivos a un límite de 512 bytes.
Un cálculo muy aproximado nos dice que otra copia de sus datos lo dejará con 3.4GB gratis. En 3.4GB tenemos espacio para aproximadamente 7 millones de registros de metadatos, suponiendo que no haya relleno, o menos, si supone un promedio de relleno de 256 bytes por archivo. Entonces, si tiene millones de archivos y directorios para tar, es posible que tenga problemas.
Podrías mitigar el problema al
z
oj
tar
tar
como un usuario normal para que el espacio reservado en la/
partición no se toque si se queda sin espacio.fuente
tar
en sí mismo puede informar sobre el tamaño de sus archivos con la--test
opción:El comando anterior no escribe nada en el disco y tiene el beneficio adicional de enumerar los tamaños de archivo individuales de cada archivo contenido en el tarball. Agregar los diversos
z/j/xz
operandos a cada lado del|pipe
manejará la compresión como lo hará.SALIDA:
No estoy completamente seguro de su propósito, pero si es para descargar el tarball, esto podría ser más importante:
O simplemente copiar con
tar
:fuente
tar
entonces copiar el árbol en el disco local en una corriente sin guardar nada en el disco remoto en absoluto, después de lo cual se puede eliminar desde el host remoto y restaurarla más tarde. Probablemente debería agregar-z
para la compresión como señala goldilocks, para ahorrar en el ancho de banda a mitad de la transferencia.-i
bien, lo siento!He investigado mucho sobre esto. Puede hacer una prueba en el archivo con un recuento de palabras, pero no le dará el mismo número de número que a
du -sb adir
.du
cuenta cada directorio como 4096 bytes ytar
cuenta los directorios como 0 bytes. Debe agregar 4096 a cada directorio:entonces tienes que agregar todos los personajes. Para algo que se parece a esto:
No estoy seguro de si esto es perfecto ya que no probé archivos que han sido tocados (archivos de 0 bytes) o archivos que tienen 1 carácter. Esto debería acercarte más.
fuente
-cvf
no incluye ninguna compresión, por lo que hacerlo en una carpeta de ~ 1 GB dará como resultado un archivo tar de ~ 1 GB (la respuesta de Flub tiene más detalles sobre el tamaño adicional en el archivo tar, pero tenga en cuenta que incluso si hay 10,000 archivos esto es solo 5 MB). Como tienes más de 4 GB gratis, no, no llenarás la partición.La mayoría de las personas consideraría "más fácil" como sinónimo de "más pequeño" en términos de descarga, por lo que debe usar algo de compresión aquí.
bzip2
debería estar disponible en cualquier sistema con tar, creo, por lo que incluirlosj
en sus conmutadores es probablemente la mejor opción.z
(gzip
) es quizás aún más común, y hay otras posibilidades (menos ubicuas) con más squash.Si quiere decir, si
tar
utiliza temporalmente espacio adicional en el disco para realizar la tarea, estoy bastante seguro de que no lo hace por varias razones, una de ellas se remonta a una época en que las unidades de cinta eran una forma de almacenamiento primario, y dos eran tuvo décadas para evolucionar (y estoy seguro de que no es necesario utilizar un espacio intermedio temporal, incluso si se trata de compresión).fuente
Si la velocidad es importante y no se necesita compresión, puede enganchar los envoltorios de syscall que se
tar
usanLD_PRELOAD
, para cambiarlostar
y calcularlos por nosotros. Al reimplementar algunas de estas funciones para satisfacer nuestras necesidades (calcular el tamaño de los datos de alquitrán de salida potencial), podemos eliminar muchasread
ywrite
eso se realiza en la operación normal detar
. Esto estar
mucho más rápido, ya que no es necesario cambiar de contexto de un lado a otro en el kernel ni mucho menos, y solo elstat
/ los archivo / carpeta (s) de entrada solicitados debe leerse desde el disco en lugar de los datos del archivo real.El código siguiente incluye implementaciones de las
close
,read
ywrite
funciones POSIX. La macroOUT_FD
controla qué descriptor de archivo esperamostar
usar como archivo de salida. Actualmente está configurado en stdout.read
se cambió para devolver el valor de éxito decount
bytes en lugar de llenar buf con los datos, dado que los datos reales no se leyeron buf no contendrían datos válidos para pasar a compresión, y por lo tanto, si se usara compresión, calcularíamos tamaño.write
se modificó para sumar loscount
bytes de entrada en la variable globaltotal
y devolver el valor de éxito de loscount
bytes solo si el descriptor de archivo coincideOUT_FD
, de lo contrario, llama al reiniciador original adquirido a travésdlsym
de realizar la llamada al sistema del mismo nombre.close
todavía realiza todas sus funciones originales, pero si el descriptor de archivo coincide con OUT_FD, sabe quetar
se ha intentado escribir un archivo tar, por lo que eltotal
número es final y lo imprime en stdout.Prueba comparativa que compara una solución en la que el acceso al disco de lectura y todas las llamadas al sistema de la operación normal de tar se realizan contra la
LD_PRELOAD
solución.El código anterior, un script de compilación básico para compilar lo anterior como una biblioteca compartida, y un script con la "
LD_PRELOAD
técnica" que lo usa se proporciona en el repositorio: https://github.com/G4Vi/tarsizeAlguna información sobre el uso de LD_PRELOAD: https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/
fuente