# Sistema de gestión de paquetes

Un sistema de gestión de paquetes, también conocido como gestor de paquetes, es una colección de herramientas que sirven para automatizar el proceso de instalación, actualización, configuración y eliminación de paquetes de software. El término se usa comúnmente para referirse a los gestores de paquetes en sistemas Unix-like, especialmente GNU/Linux, ya que se apoyan considerablemente en estos sistemas de gestión de paquetes.
Los sistemas de gestión de paquetes son herramientas que facilitan la instalación, actualización y eliminación de software en su sistema operativo.
En estos sistemas, el software se distribuye en forma de paquetes, frecuentemente encapsulado en un solo fichero. Estos paquetes incluyen otra información importante, además del software mismo, como pueden ser el nombre completo, una descripción de su funcionalidad, el número de versión, el distribuidor del software, la suma de verificación y una lista de otros paquetes requeridos para el correcto funcionamiento del software. Esta metainformación se introduce normalmente en una base de datos de paquetes local.

## Comparación entre instaladores y sistemas de gestión de paquetes

Las diferencias principales entre un sistema de gestión de paquetes y un instalador son las siguientes:
| Sistema de gestión de paquetes | Instalador |
| Forma parte del sistema operativo. | Cada producto viene unido a su propio instalador. |
| Usa una única base de datos de instalación. | Rastrea su propia instalación. |
| Puede verificar y administrar todos los paquetes sobre el sistema. | Solo trabaja con su propio producto. |
| Un único vendedor de sistema de administración de paquetes. | Múltiples vendedores de instalador. |
| Un único formato de paquetes. | Múltiples formatos de instalación. |

## Función

Los sistemas de gestión de paquetes tienen la tarea de organizar todos los paquetes instalados en el sistema y se encargan de mantener su usabilidad. Esto se consigue combinando las siguientes técnicas:
* Comprobación de la suma de verificación para evitar que haya diferencias entre la versión local de un paquete y la versión oficial.
* Comprobación de la firma digital.
* Instalación, actualización y eliminación simple de paquetes.
* Resolución de dependencias para garantizar que el software funcione correctamente.
* Búsqueda de actualizaciones para proveer la última versión de un paquete, ya que normalmente solucionan bugs y proporcionan actualizaciones de seguridad.
* Agrupamiento de paquetes según su función para evitar la confusión al instalarlos o mantenerlos.
Muchos de los sistemas de gestión de paquetes ampliamente utilizados utilizan backends simples para instalar los paquetes. Por ejemplo, YUM utiliza RPM como backend y APT utiliza dpkg.

### Desafíos con bibliotecas compartidas

En los sistemas donde las aplicaciones comparten trozos de instrucciones, como en la mayor parte de las distribuciones de GNU/Linux, la resolución de dependencias al instalar y desinstalar software se convierte en una necesidad. Algunos de los sistemas de gestión de paquetes más avanzados tienen la capacidad de desinstalar los paquetes recursivamente o en cascada, de forma que se eliminan todos los paquetes que dependen del paquete a desinstalar y todos los paquetes de los que el paquete a desinstalar depende, respectivamente.

### Frontends para paquetes compilados localmente

Es común que un administrador instale software que no está disponible en los repositorios provistos. Algunos ejemplos pueden ser una nueva versión de una aplicación que todavía no está disponible en la distribución o una alternativa distinta de la elegida por la distribución. Si este software adicional solo se distribuye en forma de código fuente, la instalación requerirá la compilación del código. Sin embargo, la instalación de este software adicional en el sistema ocasionará que el estado del sistema y la base de datos del gestor de paquetes no estén sincronizados, por lo que el administrador deberá tomar medidas adicionales para asegurar que el sistema de gestión de paquetes se mantenga al día, puesto que este no es capaz de hacerlo automáticamente.
Hay herramientas que se encargan de asegurar que los paquetes compilados localmente están integrados con el sistema de gestión de paquetes. En distribuciones basadas en paquetes .deb y .rpm, al igual que en Slackware, encontramos checkinstall. Para los sistemas basados en recetas como son Gentoo Linux o algunos sistemas híbridos como Arch GNU/Linux, es común escribir la receta en primer lugar, ya que ésta se encargará de asegurar que el paquete se incluye en la base de datos.

### Conversión de paquetes binarios

alien es un programa que convierte entre los diferentes formatos de paquetes de GNU/Linux. Soporta la conversión entre Linux Standard Base, RPM, deb, Stampede (.slp) y paquetes de Slackware (.tgz).

### Mantenimiento de la configuración

Otra problemática aparte de la actualización de software es la actualización de ficheros de configuración. Ya que los sistemas de gestión de paquetes surgieron como extensiones para las utilidades de archivado, normalmente solo son capaces de sobrescribir o retener los ficheros de configuración, en lugar de poder aplicarles reglas de modificación. Sin embargo, hay excepciones, que normalmente se aplica al proceso de configuración del núcleo, ya que si estos son incorrectos pueden ocasionar fallos al reiniciar el sistema, pudiendo incluso hacer que el sistema no arranque. Estos problemas pueden ocasionarse cuando el formato de los ficheros de configuración cambia. Por ejemplo, cuando el antiguo fichero de configuración no deshabilita nuevas opciones que deberían ser deshabilitadas. Algunos sistemas de gestión de paquetes, como el dpkg de Debian, permiten configurar el software durante la instalación. En cualquier otra situación es preferible instalar los paquetes con la configuración por defecto y sobrescribirla posteriormente. Por ejemplo, en la instalación de un paquete en un gran número de computadoras (dpkg también soporta este tipo de instalación preconfigurada).

### Repositorios

El software normalmente se pone a disposición de los usuarios en los repositorios, con el fin de proporcionar a los usuarios de un sencillo control sobre los diferentes tipos de software que van a instalar en su sistema y, en ocasiones, debido a razones legales o conveniencias por parte de los distribuidores.

### Evitar la actualización de paquetes

Cuando un usuario interactúa con el gestor de paquetes para realizar una actualización, este suele mostrar una lista de las tareas a realizar (normalmente la lista de paquetes a actualizar y, posiblemente, también los números de versión) y también es probable que permita realizar una actualización completa o bien seleccionar los paquetes que se desea actualizar. Algunos gestores de paquetes permiten indicar los paquetes que no se desea actualizar nunca o solamente cuando estos corrigen errores importantes en la versión anterior. A este proceso se lo suele denominar version pinning. Por ejemplo, yum permite esto mediante la sintaxis exclude=openoffice*, pacman con IgnorePkg=openoffice (en ambos casos para evitar la actualización de OpenOffice), mientras que las herramientas de Debian poseen una sintaxis más compleja y potente.

## Ejemplos
### Sistemas libres

Por la naturaleza del software libre, los paquetes bajo licencias compatibles y similares están disponibles para usarlo en varios sistemas operativos. Estos paquetes pueden ser fácilmente combinados y distribuidos usando "packaging systems" configurables para manejar los diferentes cambios del software y administrar las dependencias y los conflictos específicos de una versión. Algunos "packaging systems" de software libre son ellos mismos liberados como software libre.

#### Sistemas basados en paquetes binarios

* dpkg, usado originalmente por Debian y ahora también por otros sistemas, usa el formato .deb y fue el primero en poseer una herramienta de resolución de dependencias ampliamente conocida, APT.
* fink, para Mac OS X, deriva parcialmente de dpkg/apt y de ports. Esta herramienta pretende hacer más sencilla la instalación de programas libres en Mac OS X.
* El sistema RPM, creado por Red Hat y usado por un gran número de distribuciones de GNU/Linux, es el formato de paquetes del Linux Standard Base. Para trabajar con este sistema de paquetes existen muy diversas herramientas como apt4rpm, up2date (de Red Hat), urpmi (de Mandriva), YaST (de SuSE) y YUM (usado por Fedora y Yellow Dog Linux).
* El sistema tgz, usado por Slackware, empaqueta el software usando tar y gzip. Pero, además, hay algunas herramientas de más alto nivel para tratar con este formato: slapt-get, slackpkg y swaret.
* Pacman, para Arch Linux usa binarios precompilados distribuidos en un fichero pkg.tar.xz.

#### Sistemas de instalación desde una receta

* El sistema Portage (basado en el programa emerge) es usado por Gentoo Linux. Este está inspirado en el sistema de ports de BSD y usan scripts llamados ebuilds para instalar el software.
* En la distribución GoboLinux, un fichero-receta contiene información sobre cómo descargar, desempaquetar, compilar e instalar un paquete usando la herramienta Compile.

#### Sistemas híbridos

* La Colección de Ports de FreeBSD, a veces llamada ports a secas, usa un sistema de Makefiles para instalar software desde código fuente o ficheros binarios. Las colecciones de MacPorts (para Mac OS X) y de ports para pkgsrc (en NetBSD y OpenBSD) son similares.

#### Sistemas de metapaquetes

Los siguientes sistemas unifican la gestión de paquetes para muchas o todas las distribuciones de GNU/Linux y otras variantes de Unix basándose también en el concepto de ficheros-receta:
* klik proporciona una forma sencilla de instalar paquetes de software para la mayor parte de distribuciones sin los problemas de dependencias tan comunes en otros formatos de paquetes.
* Autopackage usa fichero .package.
* epm, desarrollado por Easy Software Products (creadores de CUPS), es un meta-empaquetador que permite crear paquetes nativos para todas las distribuciones de GNU/Linux y otros sistemas operativos basados en Unix (.deb, .rpm, .tgz para GNU/Linux; .pkg para Solaris y distros. BSD, .dmg para Mac OS X, ...) a partir de un único fichero .list.

### Sistemas propietarios

En la actualidad, una gran variedad de sistemas de gestión de paquetes es usada por algunos sistemas operativos propietarios para tratar con la instalación tanto de paquetes propietarios como libres.
* installp es el comando de AIX para las bases de datos Object Data Manager (ODM).
* El formato SysV usado por Solaris.
* Software Distributor es el gestor de paquetes de HP-UX.
* En el framework .NET de Microsoft, un ensamblado es una biblioteca de código parcialmente compilado destinado al uso en deployment, versioning y seguridad.

### Gestión de paquetes incrustada en aplicaciones

Algunos sistemas de gestión de paquetes no forman parte nativa del sistema operativo, como pueden ser fink en Mac OS X o el entorno Unix-like de Cygwin (para Windows). Algunos lenguajes de programación interpretados tienen su propio sistema de gestión de paquetes para manejar módulos del lenguaje, como pasa con los lenguajes de programación Perl (ver CPAN) o PHP (ver PEAR) o Ruby ( RubyGems ). Otros programas pueden venir con su propio sistema para gestionar módulos.