Saltar la navegación

El sistema de paquetes

En las distribuciones GNU/Linux el software binario, y también su código fuente, se distribuye, como ya se ha dicho, a través de paquetes, cuya estructura no es siempre la misma. Una de las decisiones más importantes de las distribuciones GNU/Linux es decidir cuál será el formato de empaquetado que utilizarán. Fundamentalmente, se usan dos tipos de paquetes, los paquetes DEB creados por la distribución Debian, y los RPM creados por la distribución Red Hat. Aunque existen otros formatos, la mayoría de las restantes distribuciones GNU/Linux eligen uno de los dos formatos anteriores.

En la distribución Debian existen dos tipos de paquetes, los paquetes «binarios» y los «fuentes». Los primeros son archivos con extensión .deb para utilizar directamente con el comando dpkg, mientras que los segundos contienen el código fuente así como las instrucciones para crear los paquetes binarios.

Los paquetes binarios (.deb) son compendios de ficheros (conjunto de ficheros agrupados en uno solo) que pueden ser manipulados en cualquier sistema Unix, pues simplemente se necesita disponer de los programas habituales ar, tar, y gzip (a veces, en vez de gzip, puede que necesitemos xz o bzip2). El nombre de estos paquetes tiene la siguiente forma: paquete_version_arquitectura.deb (por ejemplo, tree_1.7.0-5_amd64.deb). La arquitectura se refiere a la arquitectura hardware para la que se ha compilado el programa y por lo tanto el tipo de ordenador donde se podrá ejecutar. Así, para la arquitectura AMD de 64 bits e Intel compatible con esta, se utiliza el término amd64, para la arquitectura Intel/AMD de 32 bits se utiliza el término i386, y existen otros términos para otras arquitecturas como powerpc, mips, etc.

Un paquete binario Debian está constituido por tres ficheros. Veamos esto con un paquete en concreto:

$ wget http://ftp.es.debian.org/debian/pool/main/t/tree/tree_1.7.0-5_amd64.deb
--2017-07-07 14:00:42--  http://ftp.es.debian.org/debian/pool/main/t/tree/tree_1.7.0-5_amd64.deb
Resolviendo ftp.es.debian.org (ftp.es.debian.org)... 82.194.78.250
Conectando con ftp.es.debian.org (ftp.es.debian.org)[82.194.78.250]:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 46144 (45K) [application/vnd.debian.binary-package]
Grabando a: “tree_1.7.0-5_amd64.deb”

tree_1.7.0-5_amd64.deb                    100%[=======================================================================================>]  45,06K  --.-KB/s   en 0,03s  

2017-07-07 14:00:42 (1,27 MB/s) - “tree_1.7.0-5_amd64.deb” guardado [46144/46144]

$ ls -l
total 48
-rw-r--r-- 1 usuario usuario 46144 ene  4  2017 tree_1.7.0-5_amd64.deb
$ file tree_1.7.0-5_amd64.deb
tree_1.7.0-5_amd64.deb: Debian binary package (format 2.0)
$ ar t tree_1.7.0-5_amd64.deb
debian-binary
control.tar.gz
data.tar.xz
$ ar x tree_1.7.0-5_amd64.deb
$ ls -l
total 104
-rw-r--r-- 1 usuario usuario   728 jul  7 14:01 control.tar.gz
-rw-r--r-- 1 usuario usuario 45224 jul  7 14:01 data.tar.xz
-rw-r--r-- 1 usuario usuario     4 jul  7 14:01 debian-binary
-rw-r--r-- 1 usuario usuario 46144 ene  4  2017 tree_1.7.0-5_amd64.deb

Los tres ficheros del compendio son debian-binary, control.tar.gz (está comprimido con el programa gzip) y data.tar.xz (está comprimido con el programa xz). Entre distintos paquetes, pueden variar las extensiones finales de los dos ficheros comprimidos, en función del programa de compresión que se haya usado: .gz para gzip, .xz para xz y .bz2 para bzip2. Estos tres compresores son habituales en cualquier sistema Unix.

Veamos los tres ficheros anteriores con un poco más de detalle:

  • debian-binary: Es un fichero de texto que contiene la versión del formato de paquetes Debian que se está utilizando. En este caso es la versión 2 del formato de empaquetado .deb.
$ file debian-binary 
debian-binary: ASCII text
$ cat debian-binary
2.0
  • control.tar.gz: Es un compendio de ficheros que contiene metainformación para la instalación del programa contenido en el paquete. Encontramos, para este ejemplo del paquete tree, en el fichero "md5sums" los hash MD5 de los ficheros que se instalarán, y esto sirve para comprobar que son los ficheros originales sin ninguna manipulación o error por la transmisión. También está presente en el fichero "control" información del nombre del paquete, su versión, arquitectura, dependencias, descripción breve, etc. En otros paquetes, aparecen más ficheros además de estos dos, como por ejemplo, scripts que permiten la ejecución de órdenes en diferentes etapas del ciclo de vida del paquete (instalación, actualización y eliminación).
$ file control.tar.gz 
control.tar.gz: gzip compressed data, max compression, from Unix
$ tar -tzf control.tar.gz
./
./control
./md5sums
$ tar -xzf control.tar.gz
$ ls -l
total 112
-rw-r--r-- 1 usuario usuario   485 ene  4  2017 control
-rw-r--r-- 1 usuario usuario   728 jul  7 14:01 control.tar.gz
-rw-r--r-- 1 usuario usuario 45224 jul  7 14:01 data.tar.xz
-rw-r--r-- 1 usuario usuario     4 jul  7 14:01 debian-binary
-rw-r--r-- 1 usuario usuario   433 ene  4  2017 md5sums
-rw-r--r-- 1 usuario usuario 46144 ene  4  2017 tree_1.7.0-5_amd64.deb
$ cat md5sums
ef591522cf9e3714b397084fa0458c11  usr/bin/tree
395435fa9997747ba2edc60df59930ca  usr/share/doc/tree/README.gz
312b255ce10210cef109a19c7484ee05  usr/share/doc/tree/TODO
98859bcd394778668044a2241331f04b  usr/share/doc/tree/changelog.Debian.gz
9d40e0496166ea170603afe2a953815d  usr/share/doc/tree/changelog.gz
e51a3c84c3b33325acc683347bfb4d3f  usr/share/doc/tree/copyright
e836a627fe74dfcb58b8456553a7b01b  usr/share/man/man1/tree.1.gz
$ cat control
Package: tree
Version: 1.7.0-5
Architecture: amd64
Maintainer: Florian Ernst <florian@debian.org>
Installed-Size: 104
Depends: libc6 (>= 2.14)
Section: utils
Priority: optional
Homepage: http://mama.indstate.edu/users/ice/tree/
Description: displays an indented directory tree, in color
 Tree is a recursive directory listing command that produces a depth indented
 listing of files, which is colorized ala dircolors if the LS_COLORS environment
 variable is set and output is to tty.

La información del fichero "control" de un paquete, mezclada con otros datos, puede mostrarse en cualquier momento usando el comando apt-cache con la opción show, por ejemplo:

$ apt-cache show tree
Package: tree
Version: 1.7.0-3
Installed-Size: 104
Maintainer: Florian Ernst <florian@debian.org>
Architecture: amd64
Depends: libc6 (>= 2.14)
Description-en: displays an indented directory tree, in color
 Tree is a recursive directory listing command that produces a depth indented
 listing of files, which is colorized ala dircolors if the LS_COLORS environment
 variable is set and output is to tty.
Description-md5: 9b53b68087a50d4cd859ac0117aecc08
Homepage: http://mama.indstate.edu/users/ice/tree/
Tag: implemented-in::c, interface::commandline, role::program,
 scope::utility, use::browsing, works-with::file
Section: utils
Priority: optional
Filename: pool/main/t/tree/tree_1.7.0-3_amd64.deb
Size: 45900
MD5sum: c07af21bff43da266d31b8b1e7ef14ca
SHA1: 27baf4743aede47be48f5c095b97c4590b069694
SHA256: 6c3dce346a04e103afb3a6e7b7d2f38534861789138eaf8f7915dde3e0e3dcf5

La información de las dependencias (Depends, paquetes que deben ser desempaquetados y configurados antes de la configuración del paquete que declara las dependencias), y también, aunque en este ejemplo no aparecen, la información de conflictos (Conflicts, indica que un paquete no puede instalarse simultáneamente con otro), incompatibilidades (Breaks, indica que la instalación de un paquete romperá otro paquete, en general, esta incompatibilidad entre dos paquetes es temporal, se refiere específicamente a las versiones incompatibles y suele resolverse actualizando a nuevas versiones), reemplazo (Replaces), predependencias (Pre-Depends, paquetes que deben ser desempaquetados y configurados antes de la ejecución del script de preinstalación del paquete que declara las predependencias), recomendaciones (Recommends, no son obligatorias pero mejorarían considerablemente la funcionalidad ofrecida por el paquete) y sugerencias (Suggests y Enhances, no son obligatorias pero complementarían y aumentarían la utilidad ofrecida por el paquete), se muestra utilizando una cierta sintaxis; así para expresar una condición sobre la versión necesaria de un paquete, se utilizan los siguientes operadores: << (menor que), <= (menor o igual que), =: (igual a), >= (mayor o igual que, en el ejemplo, el paquete libc6 debe ser mayor o igual que la versión 2.14), >> (mayor que). También, con la coma ( , ) se expresa la condición y lógica, por ejemplo, Depends: A, B, C, indicaría que se depende obligatoriamente de los paquetes A, B y C. Por último, se puede expresar también la condición o lógica inclusiva, y para ello se usa el símbolo |, por ejemplo, Depends: A | B, significaría que se depende obligatoriamente de que esté instalado el paquete A o el B o los dos. Es importante recordar que aquí el operador o tiene más prioridad que el operador y, así la dependencia A | B, C estaría indicando (A o B) y C. No se pueden utilizar paréntesis, por lo que para expresar la dependencia A o (B y C), habría que poner: A | B, A | C.

Puede verse parte de lo explicado anteriormente en el siguiente ejemplo:

$ apt-cache show apt
Package: apt
Version: 1.0.9.8.4
Installed-Size: 3178
Maintainer: APT Development Team <deity@lists.debian.org>
Architecture: amd64
Replaces: manpages-it (<< 2.80-4~), manpages-pl (<< 20060617-3~), openjdk-6-jdk (<< 6b24-1.11-0ubuntu1~), sun-java5-jdk (>> 0), sun-java6-jdk (>> 0)
Depends: libapt-pkg4.12 (>= 1.0.9.8.4), libc6 (>= 2.15), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.9), debian-archive-keyring, gnupg
Suggests: aptitude | synaptic | wajig, dpkg-dev (>= 1.17.2), apt-doc, python-apt
Conflicts: python-apt (<< 0.7.93.2~)
Breaks: manpages-it (<< 2.80-4~), manpages-pl (<< 20060617-3~), openjdk-6-jdk (<< 6b24-1.11-0ubuntu1~), sun-java5-jdk (>> 0), sun-java6-jdk (>> 0)
Description-en: commandline package manager
 This package provides commandline tools for searching and
 managing as well as querying information about packages
 as a low-level access to all features of the libapt-pkg library.
 .
 These include:
  * apt-get for retrieval of packages and information about them
    from authenticated sources and for installation, upgrade and
    removal of packages together with their dependencies
  * apt-cache for querying available information about installed
    as well as installable packages
  * apt-cdrom to use removable media as a source for packages
  * apt-config as an interface to the configuration settings
  * apt-key as an interface to manage authentication keys
Description-md5: 9fb97a88cb7383934ef963352b53b4a7
Tag: admin::package-management, devel::lang:ruby, hardware::storage,
 hardware::storage:cd, implemented-in::c++, implemented-in::perl,
 implemented-in::ruby, interface::commandline, network::client,
 protocol::ftp, protocol::http, protocol::ipv6, role::program,
 role::shared-lib, scope::application, scope::utility, sound::player,
 suite::debian, use::downloading, use::organizing, use::searching,
 works-with::audio, works-with::software:package, works-with::text
Section: admin
Priority: important
Filename: pool/main/a/apt/apt_1.0.9.8.4_amd64.deb
Size: 1108646
MD5sum: 7a46d5f8807a00748f8ba7fb32af96ca
SHA1: 6d3c574205f8ef47fca8472221ccb765b92b7e24
SHA256: f40e51afbbcf2b1e23442c4c3df064a02ddc27bdfbfb155839577dcb1dedb74a
  • data.tar.xz: Este fichero es un compendio que contiene todos los ficheros que hay que extraer y copiar en el disco duro para instalar el programa contenido en el paquete, es decir, ejecutables, documentación, ficheros de configuración, etc., pero nunca ficheros de los paquetes de los que tiene alguna dependencia. Para resolver el problema de las dependencias, se tendrán que instalar todos los paquetes de los que depende el paquete principal, y de esta forma estarán todos los ficheros necesarios para la correcta ejecución del programa que se esté instalando. En el caso del ejemplo anterior, además del paquete tree, también habrá que instalar (si no lo estuviera ya) el paquete libc6 (en una versión mayor o igual a la 2.14) y así estarán en el disco todos los ficheros necesarios para la correcta ejecución del comando tree.
$ tar -tJf data.tar.xz 
./
./usr/
./usr/bin/
./usr/bin/tree
./usr/share/
./usr/share/doc/
./usr/share/doc/tree/
./usr/share/doc/tree/README.gz
./usr/share/doc/tree/TODO
./usr/share/doc/tree/changelog.Debian.gz
./usr/share/doc/tree/changelog.gz
./usr/share/doc/tree/copyright
./usr/share/man/
./usr/share/man/man1/
./usr/share/man/man1/tree.1.gz

Estos ficheros que llevan una ruta relativa, se instalarán a partir del directorio raíz, y como vemos, en el caso del paquete tree, solo se instala un programa (/usr/bin/tree) y el resto son ficheros de documentación, entre los que se encuentra la página del manual del sistema del comando tree.

El otro tipo de paquetes, son los paquetes fuentes, que es donde está el código fuente de un programa, y en este caso, el paquete está formado por tres ficheros independientes, no están unidos en un compendio, como en los paquetes binarios. El nombre de estos tres ficheros tienen la siguiente forma y la extensión puede variar según el compresor:

  • paquete_version.dsc (tree_1.7.0-3.dsc): Contiene metainformación (como en el fichero control del paquete binario) que describe el paquete fuente e indica qué otros archivos forman parte del mismo.
  • paquete_version.orig.tar.gz (tree_1.7.0.orig.tar.gz): Es un compendio que contiene el código fuente como es provisto por el desarrollador original.
  • paquete_version.debian.tar.xz ó paquete_version.diff.gz (tree_1.7.0-3.debian.tar.xz): Contiene todas las modificaciones realizadas por el desarrollador Debian, especialmente el agregado de un directorio de nombre debian que contiene las instrucciones para construir un paquete Debian.

Licencia: licencia de software libre GPL