En informática , tar es una utilidad de software de computadora para recopilar muchos archivos en un solo archivo de almacenamiento , a menudo denominado tarball , para fines de distribución o copia de seguridad. El nombre se deriva de "archivo de cinta", ya que se desarrolló originalmente para escribir datos en dispositivos de E/S secuenciales sin sistema de archivos propio, como dispositivos que utilizan cinta magnética . Los conjuntos de datos de archivo creados por tar contienen varios parámetros del sistema de archivos , como nombre, marcas de tiempo, propiedad, permisos de acceso a archivos y organización de directorios . POSIX abandonó tar a favor de pax , pero tar sigue siendo de uso generalizado.
La utilidad de línea de comandos se introdujo por primera vez en la versión 7 de Unix en enero de 1979, reemplazando al programa tp (que a su vez reemplazó a "tap"). [7] La estructura de archivos para almacenar esta información se estandarizó en POSIX.1-1988 [8] y más tarde en POSIX.1-2001, [9] y se convirtió en un formato compatible con la mayoría de los sistemas de archivo de archivos modernos. El comando tar se abandonó en POSIX.1-2001 a favor del comando pax , que debía admitir el formato de archivo ustar; se indicó que el comando tar se retiraría a favor del comando pax al menos desde 1994.
Hoy en día, los sistemas operativos tipo Unix suelen incluir herramientas para soportar archivos tar, así como utilidades comúnmente utilizadas para comprimirlos, como xz , gzip y bzip2 .
El comando tar también ha sido portado al sistema operativo IBM i . [10]
BSD-tar se ha incluido en Microsoft Windows desde la actualización de Windows 10 de abril de 2018 , [11] [12] y existen otras múltiples herramientas de terceros disponibles para leer y escribir estos formatos en Windows.
Muchas unidades de cinta históricas leen y escriben bloques de datos de longitud variable , lo que deja un espacio desperdiciado significativo en la cinta entre bloques (para que la cinta comience y deje de moverse físicamente). Algunas unidades de cinta (y discos sin procesar) solo admiten bloques de datos de longitud fija. Además, al escribir en cualquier medio, como un sistema de archivos o una red, lleva menos tiempo escribir un bloque grande que muchos bloques pequeños. Por lo tanto, el comando tar escribe datos en registros de muchos bloques de 512 B. El usuario puede especificar un factor de bloqueo, que es la cantidad de bloques por registro. El valor predeterminado es 20, lo que produce registros de 10 KiB . [13]
Existen varios formatos de archivos tar, incluidos los históricos y los actuales. Dos formatos tar están codificados en POSIX: ustar y pax. El formato tar de GNU no está codificado, pero todavía se utiliza en la actualidad.
Un archivo tar consiste en una serie de objetos de archivo, de ahí el término popular tarball , que hace referencia a cómo un tarball recoge objetos de todo tipo que se adhieren a su superficie. Cada objeto de archivo incluye cualquier dato de archivo y está precedido por un registro de cabecera de 512 bytes . Los datos de archivo se escriben sin modificaciones, excepto que su longitud se redondea a un múltiplo de 512 bytes. La implementación original de tar no se preocupaba por el contenido de los bytes de relleno y dejaba los datos del búfer sin modificar, pero la mayoría de las implementaciones modernas de tar rellenan el espacio adicional con ceros. [14] El final de un archivo está marcado por al menos dos registros consecutivos llenos de ceros. (El origen del tamaño de registro de tar parece ser los sectores de disco de 512 bytes utilizados en el sistema de archivos Unix Versión 7). El bloque final de un archivo se rellena hasta su longitud completa con ceros.
El registro de encabezado de archivo contiene metadatos sobre un archivo. Para garantizar la portabilidad entre diferentes arquitecturas con diferentes órdenes de bytes , la información del registro de encabezado se codifica en ASCII . Por lo tanto, si todos los archivos de un archivo son archivos de texto ASCII y tienen nombres ASCII, entonces el archivo es esencialmente un archivo de texto ASCII (que contiene muchos caracteres NUL ).
Los campos definidos por el formato tar original de Unix se enumeran en la tabla siguiente. La tabla de indicadores de enlace/tipo de archivo incluye algunas extensiones modernas. Cuando un campo no se utiliza, se rellena con bytes NUL. El encabezado utiliza 257 bytes y luego se rellena con bytes NUL para que llene un registro de 512 bytes. No hay ningún "número mágico" en el encabezado para la identificación del archivo.
Encabezado tar anterior a POSIX.1-1988 (es decir, v7):
El campo indicador de enlace pre-POSIX.1-1988 puede tener los siguientes valores:
Algunas implementaciones de tar anteriores a POSIX.1-1988 indicaban un directorio con una barra diagonal (/) al final del nombre.
Los valores numéricos se codifican en números octales utilizando dígitos ASCII, con ceros a la izquierda. Por razones históricas, también se debe utilizar un carácter NUL o espacio final. Por lo tanto, aunque hay 12 bytes reservados para almacenar el tamaño del archivo, solo se pueden almacenar 11 dígitos octales. Esto da un tamaño de archivo máximo de 8 gigabytes en los archivos comprimidos. Para superar esta limitación, en 2001 star introdujo una codificación base-256 que se indica estableciendo el bit de orden superior del byte más a la izquierda de un campo numérico. [ cita requerida ] GNU-tar y BSD-tar siguieron esta idea. Además, las versiones de tar anteriores al primer estándar POSIX de 1988 rellenan los valores con espacios en lugar de ceros.
La suma de comprobación se calcula tomando la suma de los valores de bytes sin signo del registro de encabezado con los ocho bytes de suma de comprobación tomados como espacios ASCII (valor decimal 32). Se almacena como un número octal de seis dígitos con ceros a la izquierda seguidos de un NUL y luego un espacio. Varias implementaciones no se adhieren a este formato. Además, algunas implementaciones históricas de tar trataban los bytes como si tuvieran signo. Las implementaciones normalmente calculan la suma de comprobación de ambas formas y la tratan como correcta si la suma con signo o sin signo coincide con la suma de comprobación incluida.
Los sistemas de archivos Unix admiten varios enlaces (nombres) para el mismo archivo. Si aparecen varios de estos archivos en un archivo tar, solo el primero se archiva como un archivo normal; el resto se archiva como enlaces físicos, con el campo "nombre del archivo vinculado" establecido en el nombre del primero. Al realizar la extracción, estos enlaces físicos deben volver a crearse en el sistema de archivos.
La mayoría de los programas tar modernos leen y escriben archivos en formato UStar ( Unix Standard TAR [7] [15] ), introducido por el estándar POSIX IEEE P1003.1 de 1988. Introdujo campos de encabezado adicionales. Los programas tar más antiguos ignorarán la información adicional (posiblemente extrayendo archivos parcialmente nombrados), mientras que los programas más nuevos comprobarán la presencia de la cadena "ustar" para determinar si se está utilizando el nuevo formato.
El formato UStar permite nombres de archivo más largos y almacena información adicional sobre cada archivo. El tamaño máximo de un nombre de archivo es 256, pero se divide entre un "prefijo de nombre de archivo" de ruta anterior y el nombre de archivo en sí, por lo que puede ser mucho menor. [16]
El campo de bandera de tipo puede tener los siguientes valores:
Las extensiones específicas del proveedor POSIX.1-1988 que utilizan valores de bandera de enlace 'A'–'Z' tienen parcialmente un significado diferente con diferentes proveedores y, por lo tanto, se consideran obsoletas y se reemplazan por las extensiones POSIX.1-2001 que también incluyen una etiqueta de proveedor.
El tipo '7' (archivo contiguo) está formalmente marcado como reservado en el estándar POSIX, pero su propósito era indicar los archivos que deberían asignarse de forma contigua en el disco. Pocos sistemas operativos admiten la creación de dichos archivos de forma explícita, y por lo tanto la mayoría de los programas TAR no los admiten y tratarán los archivos de tipo 7 como si fueran de tipo 0 (normales). Una excepción son las versiones anteriores de GNU tar, cuando se ejecutaban en el sistema operativo MASSCOMP RTU (Real Time Unix), que admitían una bandera O_CTG en la función open() para solicitar un archivo contiguo; sin embargo, esa compatibilidad se eliminó a partir de la versión 1.24 de GNU tar.
En 1997, Sun propuso un método para agregar extensiones al formato tar. Este método fue aceptado posteriormente para el estándar POSIX.1-2001. Este formato se conoce como formato tar extendido o formato pax . El nuevo formato tar permite a los usuarios agregar cualquier tipo de mejoras específicas del proveedor etiquetadas por el proveedor. Las siguientes etiquetas están definidas por el estándar POSIX:
En 2001, el programa Star se convirtió en el primer tar en soportar el nuevo formato. [ cita requerida ] En 2004, GNU tar soportó el nuevo formato, [17] aunque todavía no lo escribe como su salida predeterminada del programa tar. [18]
El formato pax está diseñado para que todas las implementaciones capaces de leer el formato UStar puedan leer también el formato pax. Las únicas excepciones son los archivos que hacen uso de características extendidas, como nombres de archivo más largos. Por compatibilidad, estos se codifican en los archivos tar como archivos especiales x
o g
de tipo, normalmente bajo un PaxHeaders.XXXX
directorio. [19] : exthdr.name Una implementación que admita pax haría uso de la información, mientras que las que no lo admitan, como 7-Zip, los procesarían como archivos adicionales. [20]
Además de crear y extraer archivos, la funcionalidad de las distintas utilidades de archivo varía. Por ejemplo, las implementaciones pueden detectar automáticamente el formato de los archivos TAR comprimidos para la extracción, de modo que el usuario no tenga que especificarlo, y permitir que el usuario limite la adición de archivos a aquellos modificados después de una fecha específica. [21] [22]
tar [-opciones] <nombre del archivo tar> [archivos o directorios que se agregarán al archivo]
Opciones básicas:
-c, --create
— crear un nuevo archivo;-a, --auto-compress
— comprima adicionalmente el archivo con un compresor que se determinará automáticamente según la extensión del nombre del archivo. Si el nombre del archivo termina con *.tar.gz
, utilice gzip , si *.tar.xz
no, utilice xz , *.tar.zst
para Zstandard , etc.;-r, --append
— añadir archivos al final de un archivo;-x, --extract, --get
— extraer archivos de un archivo;-f, --file
— especificar el nombre del archivo;-t, --list
— mostrar una lista de archivos y carpetas en el archivo;-v, --verbose
— muestra una lista de archivos procesados.Crea un archivo de almacenamiento archive.tar
a partir del archivo README.txt
y directorio src
:
$ tar -cvf archive.tar README.txt src
Extraer el contenido del archive.tar
directorio actual:
$ tar -xvf archivo.tar
Crea un archivo de almacenamiento archive.tar.gz
a partir del archivo README.txt
y el directorio src
y comprímelo con gzip :
$ tar -cavf archive.tar.gz README.txt origen
Extraer el contenido del archive.tar.gz
directorio actual:
$ tar -xvf archivo.tar.gz
Un tarpipe es el método de crear un archivo en el archivo de salida estándar de la utilidad tar y canalizarlo a otro proceso tar en su entrada estándar , que trabaja en otro directorio, donde se descomprime. Este proceso copia un árbol de directorios de origen completo, incluidos todos los archivos especiales, por ejemplo:
$ alquitrán cf - srcdir | tar x -C directorio de destino
El formato tar sigue utilizándose ampliamente para la distribución de software de código abierto . Las distribuciones *NIX lo utilizan en varios mecanismos de distribución de paquetes fuente y binarios, y la mayor parte del código fuente del software se encuentra disponible en archivos tar comprimidos. [ cita requerida ]
El formato tar original fue creado en los primeros días de Unix y, a pesar de su uso generalizado actual, muchas de sus características de diseño se consideran anticuadas. [23]
Se han creado otros formatos para abordar las deficiencias del tar.
Debido al tamaño del campo, el formato TAR original no podía almacenar rutas y nombres de archivos con más de 100 caracteres.
Para superar este problema y al mismo tiempo mantener la legibilidad por las utilidades TAR existentes , GNU tar almacena las rutas de archivo y los nombres que exceden los 100 caracteres en @LongLink
entradas que serían vistas como archivos ordinarios por utilidades TAR que no conocen esta característica. [24] De manera similar, el formato PAX utiliza PaxHeaders
entradas. [25]
Muchas implementaciones antiguas de tar no registran ni restauran atributos extendidos (xattrs) o listas de control de acceso (ACL). En 2001, Star introdujo soporte para ACL y atributos extendidos, a través de sus propias etiquetas para POSIX.1-2001 pax. bsdtar utiliza las extensiones star para soportar ACL. [26] Las versiones más recientes de GNU tar soportan atributos extendidos de Linux, reimplementando extensiones star. [27] Una cantidad de extensiones se revisan en el manual de tipos de archivo para BSD tar, tar(5). [26]
Un tarbomb , en la jerga hacker , es un archivo tar que contiene muchos archivos que se extraen en el directorio de trabajo. Un archivo tar de este tipo puede crear problemas al sobrescribir archivos del mismo nombre en el directorio de trabajo o mezclar los archivos de un proyecto con los de otro. En el mejor de los casos, es un inconveniente para el usuario, que se ve obligado a identificar y eliminar una serie de archivos intercalados con el resto del contenido del directorio. Tal comportamiento se considera una mala educación por parte del creador del archivo.
Un problema relacionado es el uso de rutas absolutas o referencias a directorios padre al crear archivos tar. Los archivos extraídos de dichos archivos a menudo se crearán en ubicaciones inusuales fuera del directorio de trabajo y, como un tarbomb, tienen el potencial de sobrescribir archivos existentes. Sin embargo, las versiones modernas de FreeBSD y GNU tar no crean ni extraen rutas absolutas y referencias a directorios padre de forma predeterminada, a menos que se permita explícitamente con el indicador -P
o la opción --absolute-names
. El programa bsdtar, que también está disponible en muchos sistemas operativos y es la utilidad tar predeterminada en Mac OS X v10.6, tampoco sigue referencias a directorios padre o enlaces simbólicos. [28] [ verificación fallida ]
Si un usuario sólo tiene disponible un archivo tar muy antiguo, que no cuenta con esas medidas de seguridad, estos problemas se pueden mitigar examinando primero un archivo tar usando el comando tar tf archive.tar
, que enumera los contenidos y permite excluir archivos problemáticos después. Estos comandos no extraen ningún archivo, sino que muestran los nombres de todos los archivos en el archivo. Si alguno es problemático, el usuario puede crear un nuevo directorio vacío y extraer el archivo en él, o evitar el archivo tar por completo. La mayoría de las herramientas gráficas pueden mostrar el contenido del archivo antes de extraerlo. Vim puede abrir archivos tar y mostrar su contenido. GNU Emacs también puede abrir un archivo tar y mostrar su contenido en un búfer de directorio .
El formato tar fue diseñado sin un índice centralizado ni una tabla de contenido para los archivos y sus propiedades para su transmisión a dispositivos de respaldo en cinta. El archivo se debe leer de manera secuencial para enumerar o extraer archivos. En el caso de archivos tar de gran tamaño, esto genera una pérdida de rendimiento, lo que hace que los archivos tar no sean adecuados para situaciones que a menudo requieren acceso aleatorio a archivos individuales.
Con un archivo tar bien formado almacenado en un medio que permita búsquedas (es decir, que permita lecturas aleatorias eficientes), el tar
programa puede aún buscar un archivo relativamente rápido (en tiempo lineal en relación con el conteo de archivos) saltando lecturas de archivos de acuerdo con el campo "tamaño" en los encabezados de archivo. Esta es la base de la opción -n
en tar de GNU. Cuando un archivo tar se comprime por completo, el formato de compresión, al ser generalmente no buscable, impide que se realice esta optimización. [29] Una serie de compresores "indexados", que reconocen el formato tar, pueden restaurar esta característica para archivos comprimidos. [30] Para mantener la capacidad de búsqueda, los archivos tar también deben concatenarse correctamente, eliminando el bloque de ceros final al final de cada archivo. [31]
Otro problema con el formato tar es que permite que varios archivos (posiblemente diferentes) de un archivo tengan rutas y nombres de archivo idénticos. Al extraer dicho archivo, normalmente la última versión de un archivo sobrescribe la anterior.
Esto puede crear un tarbomb no explícito (no obvio), que técnicamente no contiene archivos con rutas absolutas o que hacen referencia a directorios principales, pero aún así provoca la sobrescritura de archivos fuera del directorio actual (por ejemplo, un archivo puede contener dos archivos con la misma ruta y nombre de archivo, el primero de los cuales es un enlace simbólico a alguna ubicación fuera del directorio actual, y el segundo es un archivo normal; luego, extraer dicho archivo en algunas implementaciones de tar puede provocar que se escriba en la ubicación señalada por el enlace simbólico).
Históricamente, muchos sistemas han implementado tar, y muchos archivadores de archivos generales tienen al menos un soporte parcial para tar (a menudo usando una de las implementaciones que se indican a continuación). La historia de tar es una historia de incompatibilidades, conocidas como las "guerras de tar". La mayoría de las implementaciones de tar también pueden leer y crear cpio y pax (este último en realidad es un formato tar con extensiones POSIX 2001).
Implementaciones clave en orden de origen:
Además, la mayoría de las implementaciones de pax y cpio pueden leer y crear múltiples tipos de archivos tar.
Los archivos tar generalmente tienen el sufijo de archivo .tar (por ejemplo, somefile.tar ).
Un archivo tar contiene secuencias de bytes sin comprimir de los archivos que contiene. Para lograr la compresión del archivo, hay una variedad de programas de compresión disponibles, como gzip , bzip2 , xz , lzip , lzma , zstd o compress , que comprimen el archivo tar completo. Normalmente, la forma comprimida del archivo recibe un nombre de archivo agregando el sufijo de compresión específico del formato al nombre del archivo. Por ejemplo, un archivo tar archive.tar se llama archive.tar.gz cuando se comprime con gzip.
Los programas tar populares como las versiones BSD y GNU de tar admiten las opciones de línea de comandos Z (comprimir), z (gzip) y j (bzip2) para comprimir o descomprimir el archivo al crearlo o descomprimirlo. Las adiciones relativamente recientes incluyen --lzma ( LZMA ), --lzop ( lzop ), --xz o J ( xz ), --lzip (lzip) y --zstd . [37] La descompresión de estos formatos se maneja automáticamente si se usan extensiones de nombre de archivo compatibles, y la compresión se maneja automáticamente usando las mismas extensiones de nombre de archivo si se pasa la opción --auto-compress (forma corta -a ) a una versión aplicable de tar de GNU. [16] BSD tar detecta una gama aún más amplia de compresores ( lrzip , lz4 ), no usando el nombre de archivo sino los datos dentro. [38] Los formatos no reconocidos se deben comprimir o descomprimir manualmente mediante canalización.
Las limitaciones de los nombres de archivo de MS-DOS 8.3 dieron lugar a convenciones adicionales para nombrar archivos comprimidos tar. Sin embargo, esta práctica ha disminuido, ya que FAT ahora ofrece nombres de archivo largos .
Los atributos extendidos pueden ser muy valiosos para almacenar metadatos de archivos (por ejemplo, author="John Smith", subject="country landscape"), en los muchos casos en los que no desea o no puede almacenar estos datos en las propiedades internas del archivo.