Aunque muchas veces cuando todavía no tenemos mucha experiencia en GNU/Linux sentimos como un problema utilizar paquetes de archivos comprimidos tipo .tar.gz. en realidad estos tienen muchas ventajas respecto a otros sistemas de distribución de archivos.
Por ejemplo, si utilizamos un paquete .rpm o similares, todo parece marchar bien, hasta que intentamos instalarlo en una distribución diferente.
A veces funciona sin inconvenientes, otras veces no. Si bien en el caso de apt encontramos notables ventajas respecto a .rpm en lo que hace a la solidez del manejo de las llamadas dependencias (archivos que deben estar en el sistema como bibliotecas, etc para lograr una correcta instalación de una aplicación dada), siempre queda la posibilidad que una utilidad no sea encontrada en los repositorios o que la version existente no sea todo lo nueva que necesitamos.
Tambien existe klik, que es muy bueno, y tiene muchas aplicaciones 'listas para usar' pero todavia falta incorporar una buena cantidad de programas.
De una u otra forma, en algun momento no nos vamos a librar de utilizar algun paquete comprimido tipo tarball (llamamos paquete a un conjunto de archivos contenidos todos juntos -mediante tar- y comprimidos -puede con gzip o con bzip-) por lo que es mejor que conozcamos cómo hacerlo.
Lo que hace gzip es crear un nuevo archivo comprimido con la extension .gz Por ejemplo: Tenemos un archivo que se llama pepe.txt y luego de comprimirlo con gzip, ademas del archivo original, tendremos uno nuevo de nombre pepe.txt.gz
Si quisieramos ver el contenido de un archivo comprimido (pero sin descomprimir) utilizamos el comando zcat
Por ejemplo en nuestro caso:
zcat pepe.txt.gz
Si quisiereamos descomprimir el archivo en cuestion utilizamos el comando gunzip. En nuestro ejemplo seria
gunzip pepe.txt.gz
Es una forma de compresión mas avanzada, pero no todas son ventajas, asi como comprime más tambien tarda más en hacerlo. El archivo generado en este caso tiene una extension .bz o bz2.
Si quisieramos ver el contenido de un archivo comprimido (pero sin descomprimir) utilizamos el comando bzcat
Por ejemplo en nuestro caso:
bzcat pepe.txt.bz2
Si quisiereamos descomprimir el archivo en cuestión utilizamos el comando gunzip. En nuestro ejemplo seria
bunzip2 pepe.txt.bz2
Debemos tener en claro lo que hace .tar Este comando no comprime sino que empaqueta.
O sea que podemos crear un solo archivo '.tar' con varios archivos dentro. Cuando hacemos copias tipo backup o para enviar por correo puede ser de utilidad crear una archivo .tar comprimido. Veamos un paso a paso sobre como crear un archivo 'tar.
Colocamos todos los archivos que deseamos empaquetar en un directorio.
Escribimos el siguiente comando: tar -cvf [nombre_del_archivo.tar] *
Veamos esto en detalle:
tar genera el empaquetado,
la opcion -c permite crear
la opcion -v modo verboso (con explicaciones)
la opcion -f agrupa hacia o un archivo
Tambien existen otras opciones:
la opcion -z para compactar o descompactar
Para ver las opciones y el uso completo lo ideal es ver desde linea de comandos man tar
Comprimimos el paquete generado con .tar mediante el comando gzip de la siguiente manera:
Es un proceso muy similar. Vamos a utilizar una tuberia (que sirve para concatenar la salida de un proceso con la entrada de otro).
Vamos a concatenar la salida de un .tar (empaquetado) con la entrada del compresor bzip2.
Luego redireccionaremos este conjunto hacia un archivo. De esta manera efectuamos todo el proceso en una sola linea. La sintaxis seria:
tar -c archivos | bzip2 > archivo.tar.bz2
Donde 'archivos' podria ser un '*' si todos los archivos del directorio van a ser incluidos. De lo contrario habra que indicar uno a uno cuales empaquetaremos. Luego el simbolo '|' nos indicara que concatenaremos dos procesos (el de empaquetar -tar- con el de comprimir -bzip2-) Esto se llama tubería y en España lo conocen como 'fontanería' (en ingles 'pipes')
El producto final de ambos procesos lo redireccionamos a un archivo con extension .tar.bz2
cp /etc/passwd /etc/pmount.allow /etc/protocols /etc/resolv.conf /tmp/ejercicio
Lo anterior va todo en la misma linea o si no alcanza dejar que sea la misma linea de comandos quien la coloque en el 'renglon seguido' (sin tocar 'Enter') Podriamos habernos posicionado en /etc y copiar directamente los archivos, pero es buena practica acostumbrarse a utilizar rutas completas, como veremos especialmente cuando hagamos scripts en bash.
3.Creamos el archivo .tar para lo cual utilizaremos el nombre 'directorio' (podria ser cualquier otro) posicionados en el directorio 'ejercicio'.
/tmp/ejercicio#: tar -cvf directorio.tar *
gzip directorio.tar
Con este ultimo paso habremos sustituido el paquete anterior por uno nuevo comprimido de nombre directorio.tar.gz
losindios /tmp/ejercicio#: tar -c * | bzip2 > directorio.tar.bz2
Si ahora hacemos 'ls' sobre el subdirectorio /tmp/ejercicio veremos que hay un nuevo archivo llamado directorio.tar.bz2 y si hacemos bzcat directorio.tar.bz2 podremos ver que en su interior se encuentran los archivos que empaquetamos.
Nomenclatura usada para los archivos empaquetados
Veremos una forma curiosa y a veces (si no conocemos el motivo) hasta un poco molesta. Es la forma de nombrar los archivos .tar.gz o .tar.bz2 .
Veamos por ejemplo este paquete perteneciente al midnight commander:
mc-4.5.55.tar.gz
El nombre 'mc' nos dice que se trata de midnight commander, pero luego con un signo '-' aparece un numero 4.5.55 El primer numero (4) nos indica que se trata de esa version.
Luego el numero intermedio nos indica que se trata de una version no-estable ya que no es par. Si este numero fuera por ejemplo '6' en lugar de '5' indicaria una version estable.
Finalmente el numero 55 indica que se han hecho ya 55 modificaciones sobre la version original. Pero esto puede no ser asi ya que muchas veces no se lleva un orden tan estricto. De todos modos el numero nos indica que hay unas cuantas modificaciones realizadas a la version original.
Tambien es posible encontrar una notacion como esta:
mc-4.5.55-src.tar.gz
Son los mismos datos vistos con anterioridad pero se agrega un dato: 'src'. Estop significa 'source code' o 'codigo fuente' y por lo tanto está indicando que el paquete no esta compilado sino que es código fuente (para instalarlo debemos compilarlo).
mc-4.5.55-x86.tar.gz
Se trata de un paquete con el archivo binario para una plataforma Intel x86.
mc-4.5.55-x86-static.tar.gz
Este paquete con bibliotecas estáticas es más grande que los paquetes normales porque trae todo lo necesario para que la aplicación funcione. En este caso no tenemos que buscar dependencias, ya que el mismo paquete normalmente trae todo lo que necesitamos.
¿Ventajas?
Puede que sí en cuanto a la instalación individual de un programa, pero...es siempre preferible tener instaladas las dependencias para utilizar en forma conjunta por todos los programas que las necesiten. Esto significa que si luego otro programa las solicita no ocuparemos lugar en nuestro disco rígido volviéndolas a instalar y utilizaremos la anterior. Por otro lado la ventaja de la instalación con bibliotecas estáticas, es que, no tendremos problemas de 'dependencias' comunes en otras instalaciones.
Hay, en cambio otra forma de empaquetar que utiliza bibliotecas dinámicas y que tiene la siguiente nomenclatura:
mc-4.5.55-x86-dinamic.tar.gz
Las computadoras no entienden el lenguaje humano y a su vez el lenguaje que utilizan las computadoras no es entendible para los humanos.
La solución esta en utilizar alguno de los muchos lenguajes de programación existentes para escribir programas.
Entre estos lenguajes podemos mencionar al lenguaje Assembler (el mas cercano al lenguaje de máquina y por lo tanto muy difícil de manejar para el programador).
En este lenguaje fue escrita la primera version de Linux, pero luego su creador -Linux Torvalds- lo abandonó en favor de otro lenguaje conocido como 'lenguaje C', diseñado por las mismas personas que crearon el Sistema Operativo Unix.
Existen miles de lenguajes posibles de usar. Cuando un programa está escrito en esta forma, (sin compilar) su contenido es conocido como 'fuente' o 'código fuente'
A menudo vamos a leer que una de las cosas que diferencia al software libre del software propietario es que en los primeros es perfectamente legal conocer 'los fuentes', ya sea por la propia curiosidad de conocerlo, o para modificarlos en el deseo de mejorarlos.
Ahora bien, ¿podemos utilizar un programa en esta forma directamente aplicado a la computadora?
¡No, no podemos!
Previamente debemos hacer algo así como una 'traducción' al lenguaje que entienden las maquinas y eso justamente ...es lo que llamamos compilación.
Pero aquí, puede aparecer una confusión...hay ciertos programas que no se compilan y que normalmente se conocen como programas de 'lenguajes interpretados' . Bash es un ejemplo de esto.
Si abrimos un programa creado en bash, veremos que solo contiene comandos como los que hemos conocido (comandos bash agrupados en un programa). Con un editor de texto podemos ver y entender perfectamente lo que dice allí. ¿Entonces?
Simplemente existe un 'interprete de comandos' (que en el caso de bash esta integrado al kernel de gnu/linux) que permite decirle al SO en forma que este lo 'entienda'.
Resumiendo: Existen programas compilados y programas interpretados. En ambos casos hay una conversión de una u otra manera a un lenguaje que entienda la maquina. Los programas compilados son siempre mas rápidos de ejecutar que los programas interpretados. Estos últimos se usan en pequeñas aplicaciones. Los lenguajes compilados mas usados en el SO linux son C y C++.
Dentro de un paquete .tar.gz pueden haber programas ya compilados y listos para usar o bien simple código fuente que debe ser compilado para poder usar en nuestras máquinas.
También tiene que ver la función que cumple una utilidad que llamaremos enlazador. El código fuente de un programa debe enlazarse con utilidades generalmente externas llamadas bibliotecas, mal llamadas por un defecto de traducción 'librerias' (la traducción de 'library' del ingles no es librería sino biblioteca).
Estas bibliotecas no se utilizan en un solo programa sino en muchos y por esto es común que se encuentren dentro de nuestra computadora una sola vez. Existen dos formas diferentes de realizar la compilación y estas son:
Con enlace dinámico: las bibliotecas enlazadas no se proveen con los paquetes .tar.gz sino que se encuentran ya en nuestro sistema o deben conseguirse antes de la instalación y el enlace entre el ejecutable y las bibliotecas se realiza en tiempo de carga o ejecución del programa.
Como se comprenderá este segundo método, si bien es mas sencillo para compilar, tiene el inconveniente de ocupar mas espacio que el dinámico.
Lo mas común es que dentro de un paquete .tar.gz encontremos archivos con el código fuente y sin las bibliotecas. Lo primero que haremos será desempaquetar y descomprimir el archivo .tar.gz de la siguiente manera:
Bajamos de Internet o copiamos de un Cd, Dvd, pendrive o cualquier otra fuente donde se encuentre el paquete, a un directorio creado especialmente preferiblemente dentro de /tmp (ya que luego lo descartaremos). Por ejemplo podríamos crear un directorio con el nombre del programa o cualquier otro que podamos identificar con facilidad.
Veremos que en la primera fase de la compilación configure, si llega a haber errores (como dependencias que faltan), nos informa todo lo que nos hace falta.
Cuando mencionamos dependencias nos podemos estar refiriendo a alguna biblioteca que nos falte o a una versión mas nueva del compilador. Todos los elementos anexos al paquete pero que normalmente no vienen dentro del mismo.
Hay que tener un poco de paciencia en esta parte, que es donde normalmente casi todos fracasan, por no entender qué hay que hacer.
Simplemente, papel y lapicera y a anotar todo lo que falta, o está corrupto o desactualizado. Si está corrupto, averiguar el lugar donde se encuentra, anotarlo y borrarlo. Para eso aprendimos a usar el comando 'find' por ejemplo .
Supongamos que necesitamos el compilador "gcc" en su última versión. Es muy importante que este compilador esté en nuestra computadora en su última versión, ya que es quién compila los programas hechos en C por ejemplo. Buscamos la pagina oficial y descargamos la ultima version estable.
En la página oficial de gcc (http://gcc.gnu.org/)
Pero veamos esto con más detalle.
Si estamos usando Firefox podemos ir a Editar=>Preferencias=>Desacargas
y ubicar la próxima descarga en un directorio temporal. De todos modos, desde otros navegadores es posible luego cortar (mover) el paquete bajado a un archivo temporal, esto simplemente para no "llenar" inutilmente nuestro disco rígido.
root
y luego el sistema nos va a pedir nuestro password, lo escribimos también. Con Ubuntu, no podremos utilizar root, a menos que lo hayamos configurado para usarlo. Si no lo hemos hecho, debemos escribir en consola, como usuario comun:
tar -zxvf [nombre completo del archivo].tar.gz
7. Ahora le llega el momento a configure. Lo debemos escribir en la consola de la siquiente manera:
./configure
Este verificará que todo esté en condiciones para compilar el programa en cuestión. Si falta alguna biblioteca, nos lo dirá en este momento. De nada valdría seguir adelante forzando el programa, ya que no tendríamos buenos resultados. Si algo falta es el momento de detener todo y ponerse a bajar de Internet cualquier dependencia que nos falta antes de seguir adelante. No vale la pena utilizar opciones como -f o –force ya que solo atraseremos el desastre que seguramente aparecerá en algun momento por una compilación incorrecta.
Una vez que bajamos cualquier dependencia que falte o este corrupta o desactualizada volvemos a escribir './configure'. Cuando este comando no nos indique errores, recién allí pasaremos al siguiente paso.
make
make install
para que el programa se instale en nuestra máquina.
A veces los pasos no son exactamente los indicados, para saber cuando hay variantes, la mejor manera es siempre leer el archivo Install o Readme que nos llevará de la mano y que seguramente viene con el paquete correspondiente.
Hay variantes a este metodo, por ejemplo para instalar Thunderbird (el cliente de correo de Mozilla) o Firefox (uno de los navegadores de Mozilla), empezamos el proceso igual que lo visto, desempaquetando y descomprimiendo. Pero luego encontramos que ya tenemos los binarios y no será necesario compilar, por lo que directamente procedemos a crear un vínculo para usar el mismo.
¿Qué pasa con los archivos .tar.bz?
El proceso de compilación es exactamente el mismo, lo único diferente es la forma de comprimir que en lugar de utilizar gzip utiliza otro compresor llamado bzip. Podemos descomprimir estos paquetes utilizando la siguiente sintaxis en nuestra consola:
bzip2 -cd [nombrearchivo] | tar xvf
Veamos un poco, el comando bzip2 es para la descompresión propiamente dicha, luego debemos apuntar el archivo en cuestión colocando el nombre exactamente como lo hemos bajado. Finalmente ese símbolo '|' nos permite continuar la acción con otro proceso. Se trata del desempaquetado que se realiza mediante tar en la forma conocida.
Debemos tomar en cuenta, que si bien esta es la forma predeterminada de trabajar con este tipo de archivos, siempre debemos leer el archivo README que acompaña los paquetes, ya que pueden haber instrucciones especificas para cierto paquete.
00ooxxoo00