Si ejecuto tar -cvfen 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 -hsalida:
/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á
tarhaciendo bajo el capó? - ¿Cómo puedo determinar esta información con precisión sin preguntar nuevamente?
tar
disk-usage
codecowboy
fuente
fuente

--totalsopció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 -csin compresióno
tar -cz data_dir | wc -ccon compresión gzipo
tar -cj data_dir | wc -ccon 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_dirComo 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-fargumento 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
zojtartarcomo un usuario normal para que el espacio reservado en la/partición no se toque si se queda sin espacio.fuente
taren sí mismo puede informar sobre el tamaño de sus archivos con la--testopció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/xzoperandos a cada lado del|pipemanejará 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
tarentonces 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-zpara la compresión como señala goldilocks, para ahorrar en el ancho de banda a mitad de la transferencia.-ibien, 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.ducuenta cada directorio como 4096 bytes ytarcuenta 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
-cvfno 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í.
bzip2debería estar disponible en cualquier sistema con tar, creo, por lo que incluirlosjen 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
tarutiliza 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
tarusanLD_PRELOAD, para cambiarlostary 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 muchasreadywriteeso se realiza en la operación normal detar. Esto estarmucho 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,readywritefunciones POSIX. La macroOUT_FDcontrola qué descriptor de archivo esperamostarusar como archivo de salida. Actualmente está configurado en stdout.readse cambió para devolver el valor de éxito decountbytes 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.writese modificó para sumar loscountbytes de entrada en la variable globaltotaly devolver el valor de éxito de loscountbytes solo si el descriptor de archivo coincideOUT_FD, de lo contrario, llama al reiniciador original adquirido a travésdlsymde realizar la llamada al sistema del mismo nombre.closetodavía realiza todas sus funciones originales, pero si el descriptor de archivo coincide con OUT_FD, sabe quetarse ha intentado escribir un archivo tar, por lo que eltotalnú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_PRELOADsolució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_PRELOADté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