El nombre tar
es, por la mayoría de las cuentas, la abreviatura de archivo de cinta. Las» cintas»en cuestión serían todas esas unidades de almacenamiento magnético que eran populares en la década de 1950.
Eso sugiere que la herramienta tar
podría ser un poco antigua y estar más allá de su primo. Pero la verdad es que, a lo largo de todos los años y a través de todos los cambios sísmicos en el mundo de TI, tar
no ha perdido nada de su poder y valor.
En este artículo, basado en el contenido de mi libro Linux in Action, voy a mostrarte los conceptos básicos de creación, compresión y restauración de archivos tar. Empecemos por el principio.
Este ejemplo tomará todos los archivos y directorios dentro y debajo del directorio de trabajo actual y construirá un archivo que he llamado inteligentemente archivename.tar
.
Aquí utilizo tres argumentos después del comando tar:
- el
c
le dice a tar que cree un nuevo archivo, -
v
establece la salida de pantalla en detallada para obtener actualizaciones, y -
f
apunta al nombre de archivo que me gustaría dar al archivo.
El *
es lo que indica a tar
que incluya todos los archivos y directorios locales de forma recursiva.
$ tar cvf archivename.tar *file1file2file3directory1directory1/morestuffdirectory1/morestuff/file100directory1/morestuff/file101
El comando tar nunca moverá ni eliminará ninguno de los directorios y archivos originales que le proporcione, solo hace copias archivadas.
También debe tener en cuenta que el uso de un punto (.) en lugar de un asterisco ( * ) en el comando anterior incluiría incluso archivos ocultos (cuyos nombres de archivo comienzan con un punto) en el archivo.
Si estás siguiendo en tu propia computadora (como definitivamente deberías), verás un nuevo archivo llamado archivename.alquitrán. El .la extensión de nombre de archivo tar no es necesaria, pero siempre es una buena idea comunicar claramente el propósito de un archivo de tantas maneras como sea posible.
Extraer su archivo para restaurar los archivos es fácil: Simplemente use xvf
en lugar de cvf
. Eso, en el ejemplo, guardará nuevas copias de los archivos y directorios originales en la ubicación actual.
$ tar xvf archivename.tarfile1file2file3directory1directory1/morestuffdirectory1/morestuff/file100directory1/morestuff/file101
Por supuesto, también puede hacer que tar envíe sus archivos extraídos a otro lugar utilizando el argumento -C
, seguido de la ubicación de destino:
$ tar xvf archivename.tar -C /home/mydata/oldfiles/
No siempre querrá incluir todos los archivos dentro de un árbol de directorios en su archivo.
Supongamos que ha producido algunos videos, pero actualmente se guardan en directorios junto con todo tipo de archivos gráficos, de audio y de texto (que contienen sus notas). Los únicos archivos que necesita hacer una copia de seguridad son los clips de video finales que usan la extensión de nombre de archivo .mp4.
he Aquí cómo hacerlo:
$ tar cvf archivename.tar *.mp4
Eso es genial. Pero esos archivos de vídeo son enormes. ¿No sería bueno hacer que el archivo sea un poco más pequeño usando compresión?
¡No digas más! Simplemente ejecute el comando anterior con el argumentoz
(zip). Eso le dirá al programa gzip que comprima el archivo.
Si desea seguir la convención, también puede agregar una extensión .gz
además de la extensión .tar
que ya está allí. Recuerda: claridad.
Así es como se desarrollaría:
$ tar czvf archivename.tar.gz *.mp4
Si prueba esto en sus propios archivos .mp4 y luego ejecuta ls-l en el directorio que contiene los nuevos archivos, puede notar que el archivo .tar.gz
no es mucho más pequeño que el .tar
, quizás un 10% más o menos. ¿Qué pasa con eso?
Bueno, el formato de archivo .mp4
está comprimido, por lo que hay mucho menos espacio para que gzip haga sus cosas.
Como tar es plenamente consciente de su entorno Linux, puede usarlo para seleccionar archivos y directorios que viven fuera de su directorio de trabajo actual. Este ejemplo agrega todos los archivos .mp4
en el directorio /home/myuser/Videos/
:
$ tar czvf archivename.tar.gz /home/myuser/Videos/*.mp4
Dado que los archivos de archivo pueden crecer, a veces puede tener sentido dividirlos en varios archivos más pequeños, transferirlos a su nuevo hogar y luego volver a crear el archivo original en el otro extremo. La herramienta dividida está hecha para este propósito.
En este ejemplo, -b
le dice a Linux que divida el nombre del archivo.alquitrán.archivo gz en piezas del tamaño de 1 GB. La operación entonces nombra cada una de las partes-nombre de archivo.alquitrán.gz.partaa, nombre de archivo.alquitrán.gz.partab, nombre de archivo.alquitrán.gz.partac, etc.:
$ split -b 1G archivename.tar.gz "archivename.tar.gz.part"
Por otro lado, se vuelve a crear el archivo leyendo cada una de las partes en secuencia (nombre de archivo cat.alquitrán.gz.part*), luego redirige la salida a un nuevo archivo llamado archivename.alquitrán.gz:
$ cat archivename.tar.gz.part* > archivename.tar.gz
Archivos del sistema de archivos de streaming
Aquí es donde empieza lo bueno. Voy a mostrarles cómo crear una imagen de archivo de una instalación de Linux en funcionamiento y transmitirla a una ubicación de almacenamiento remota, todo dentro de un solo comando. Aquí está la orden:
# tar czvf - --one-file-system / /usr /var \ --exclude=/home/andy/ | ssh [email protected] \ "cat > /home/username/workstation-backup-Apr-10.tar.gz"
En lugar de intentar explicar todo eso de inmediato, usaré ejemplos más pequeños para explorarlo una pieza a la vez.
Vamos a crear un archivo de los contenidos de un directorio llamado importantstuff que está lleno de, bueno, cosas realmente importantes:
$ tar czvf - importantstuff/ | ssh [email protected] "cat > /home/username/myfiles.tar.gz"importantstuff/filename1importantstuff/[email protected]'s password:
Déjame explicar ese ejemplo. En lugar de ingresar el nombre del archivo justo después de los argumentos del comando (como lo ha hecho hasta ahora), usé un guión (czvf -).
El tablero envía los datos a la salida estándar. Le permite volver a enviar los detalles del nombre de archivo al final del comando y le dice a tar que espere el contenido de origen para el archivo en su lugar.
Luego canalé ( / ) el archivo comprimido sin nombre a un inicio de sesión ssh en un servidor remoto donde se me pidió mi contraseña.
El comando encerrado entre comillas ejecutó cat contra el flujo de datos del archivo, que escribió el contenido del flujo en un archivo llamado myfiles.alquitrán.gz en mi directorio personal en el host remoto.
Una ventaja de generar archivos de esta manera es que evita la sobrecarga de un paso intermedio. Ni siquiera es necesario guardar temporalmente una copia del archivo en la máquina local. Imagine hacer una copia de seguridad de una instalación que llena 110 GB de sus 128 GB de espacio disponible. ¿A dónde iría el archivo?
Eso era solo un directorio de archivos. Supongamos que necesita hacer una copia de seguridad de un sistema operativo Linux activo en una unidad USB para que pueda moverlo a una máquina separada y soltarlo en la unidad principal de esa máquina.
Suponiendo que ya hay una nueva instalación de la misma versión de Linux en la segunda máquina, la siguiente operación de copiar/pegar generará una réplica exacta de la primera.
NOTA: Esto no funcionará en una unidad de destino que no tenga instalado un sistema de archivos Linux. Para manejar esa situación, deberá usar
dd
El siguiente ejemplo se crea un archivo comprimido en la unidad USB conocido como /dev/sdc1
.
El argumento--one-file-system
excluye todos los datos de cualquier sistema de archivos además del actual. Esto significa que las pseudo particiones como /sys/
y /dev/
no se agregarán al archivo. Si hay otras particiones que desea incluir (como lo hará con /usr/
y /var/
en este ejemplo), entonces deben agregarse explícitamente.
Finalmente, puede excluir datos del sistema de archivos actual utilizando el argumento --exclude
:
# tar czvf /dev/sdc1/workstation-backup-Apr-10.tar.gz \ --one-file-system \ / /usr /var \ --exclude=/home/andy/
Ahora volvamos a ese ejemplo de comando de servicio completo. Usando lo que ya ha aprendido, archive todos los directorios importantes de un sistema de archivos y copie el archivo comprimido en una unidad USB. Debería tener sentido para ti ahora:
# tar czvf - --one-file-system / /usr /var \ --exclude=/home/andy/ | ssh [email protected] \ "cat > /home/username/workstation-backup-Apr-10.tar.gz"
Hay mucha más bondad de administración en forma de libros, cursos y artículos disponibles en mi bootstrap-it.com.