Pacman (gestor de paquetes)

Pacman es el gestor de paquetes de la distribución GNU/Linux Arch Linux. Fue desarrollado por el creador de Arch Linux, Judd Vinet. Pacman es capaz de resolver las dependencias, y descargar e instalar automáticamente todos los paquetes necesarios. En teoría, el usuario solo necesita ejecutar una única orden para actualizar por completo el sistema. Además de ser utilizado en Arch Linux, Pacman también es usado en Manjaro, EndeavourOS, Parabola, Frugalware y Chakra.

El gestor de paquetes Pacman es uno de los puntos fuertes de Arch Linux. Combina un simple paquete binario con un formato fácil de usar sistema de construcción (makepkg y ABS). Pacman permite administrar fácilmente los paquetes, ya sea desde los repositorios oficiales de Arch Linux, o desde repositorios propios de usuarios.

Pacman mantiene el sistema actualizado al día mediante la sincronización de la lista de paquetes con el servidor primario. Este modelo cliente/servidor también le permite descargar e instalar paquetes completos con todas las dependencias requeridas con un simple comando.

Pacman utiliza archivos empaquetados en tar y comprimidos en gzip o xz para todos los paquetes, cada uno de los cuales contiene binarios compilados. Los paquetes son descargados a través de FTP, también se puede utilizar HTTP y archivos locales, dependiendo de cómo esté configurado cada repositorio. Cumple con Linux Arch Build System (ABS) utilizados para crear los paquetes desde el código fuente.

Pacman está escrito en lenguaje de programación C  y utiliza el formato tar de bsdtar para empaquetar.

Configuración 
Para configurar Pacman solamente hay que editar el archivo /etc/pacman.conf, donde se pueden añadir repositorios y definir diversas opciones, pudiendo incluso crear repositorios propios.

Paquetes y sistema de compilación 
Los paquetes de Pacman son archivos tar comprimidos, que contienen metadatos y una estructura de directorios con los archivos. Los paquetes se construyen con makepkg, usando guiones de Bash, conocidos como PKGBUILDs. El siguiente es un PKGBUILD para el paquete patch, incluido en la documentación Pacman a manera de ejemplo: 

pkgname=patch
pkgver=2.5.4
pkgrel=3
pkgdesc="A utility to apply patch files to original sources"
arch=('i686' 'x86_64')
url="http://www.gnu.org/software/patch/patch.html"
license=('GPL')
groups=('base-devel')
depends=('glibc' 'ed')
source=(ftp://ftp.gnu.org/gnu/$pkgname/$pkgname-$pkgver.tar.gz)
md5sums=('ee5ae84d115f051d87fcaaef3b4ae782')

build() {
  cd "$srcdir"/$pkgname-$pkgver
  ./configure --prefix=/usr
  make
}

package() {
  cd "$srcdir"/$pkgname-$pkgver
  make prefix="$pkgdir"/usr install
}

Operaciones más comunes con Pacman

Utilización 

Lo que sigue es una muestra de las operaciones que se pueden realizar con pacman.

Instalar paquetes

Instalar paquetes específicos 

Para instalar o actualizar un solo paquete o lista de paquetes (incluyendo las dependencias), ejecute la orden siguiente:

 # pacman -S nombre_del_paquete1 nombre_del_paquete2 ...

Para instalar una lista de paquetes con una expresión regular (regex):

 # pacman -S $(pacman -Ssq expresion-regular_paquete)

A veces hay varias versiones de un paquete en diferentes repositorios (por ejemplo, extra y testing=. Para instalar la versión desde el repositorio extra en este ejemplo, el repositorio debe definirse delante del nombre del paquete:

 # pacman -S extra/nombre_del_paquete

Para instalar un número de paquetes que comparten patrones similares en sus nombres uno puede usar la expansión de llaves. Por ejemplo:

 # pacman -S plasma-{desktop,mediacenter,nm}

Esto se puede ampliar a los niveles que sean necesarios:

 # pacman -S plasma-{workspace{,-wallpapers},pa}

Instalar grupos de paquetes

Algunos paquetes pertenecen a un grupo de paquetes], los cuales se pueden instalar simultáneamente. Por ejemplo, emitiendo la orden:

 # pacman -S gnome

el prompt le pedirá que seleccione los paquetes del grupo gnome que desea instalar.

En algunas ocasiones, un grupo contiene una gran cantidad de paquetes, y puede que solo le interese, o no desee instalar, unos pocos de ellos. En lugar de tener que introducir todos los números excepto los que no desea, quizás sea más conveniente, para seleccionar o excluir paquetes o intervalos de paquetes, la siguiente sintaxis:

 Enter a selection (default=all): 1-10 15

que seleccionará los paquetes del 1 al 10 y 15 para la instalación, o bien:

 Enter a selection (default=all): ^5-8 ^2

que seleccionará todos los paquetes excepto 5 a 8 y 2 para la instalación.

Para ver qué paquetes pertenecen al grupo gnome, ejecute:

 # pacman -Sg gnome

Si un paquete de la lista ya está instalado en el sistema, este se volverá a reinstalar, incluso si ya está actualizado, a menos que se utilice la opción --needed.

Desinstalar paquetes 

Para eliminar un solo paquete, dejando todas sus dependencias instaladas:

 # pacman -R nombre_del_paquete

Para eliminar un paquete y sus dependencias (siempre que no sean usadas por ningún otro paquete instalado):

 # pacman -Rs nombre_del_paquete

Para eliminar un paquete, sus dependencias y todos los paquetes que dependen de esas dependencias:

Esta operación es recursiva, y debe utilizarse con precaución, ya que puede eliminar muchos paquetes potencialmente necesarios.

 # pacman -Rsc nombre_del_paquete

Para eliminar un paquete, el cual es requerido por otro paquete, sin quitar el paquete dependiente (la siguiente operación puede romper un sistema y debe evitarse):

 # pacman -Rdd nombre_del_paquete

Pacman guarda los archivos de configuración importantes al quitar ciertas aplicaciones y los renombra con la extensión: .pacsave. Para evitar la creación de estos archivos de respaldo utilice la opción -n:

 # pacman -Rn nombre_del_paquete

Actualizar paquetes 

Pacman puede actualizar todos los paquetes del sistema con una sola orden. Esto proceso puede durar bastante dependiendo de cuánto tiempo haya estado el sistema sin actualizar. La siguiente orden sincroniza las bases de datos de los repositorios y actualiza los paquetes del sistema (excluyendo los paquetes «locales» que no estén en los repositorios configurados):

 # pacman -Syu

Consultar la base de datos de los paquetes 

Pacman puede consultar la base de datos de los paquetes presentes en el sistema con la opción -Q, las bases de datos de los servidores remotos con la opción -S y los archivos presentes en dichas bases con la opión -F. Vea pacman -Q --help, pacman -S --help y pacman -F --help para conocer las subopciones respectivas de cada opción.

Pacman puede buscar paquetes en la base de datos, la búsqueda se realiza tanto por los nombres como por las descripciones de los paquetes:

 $ pacman -Ss cadena1 cadena2 ...

Algunas veces -s construye una ERE (Expresión Regular Extendida) que puede causar resultados no deseados, por lo cual debe limitarse para que coincida con el nombre del paquete y no con la descripción u otro campo:

 $ pacman -Ss '^vim-'

Para buscar paquetes ya instalados:

 $ pacman -Qs cadena1 cadena2 ...

Para buscar nombres de archivos de paquetes en los paquetes de los servidores remotos:

 $ pacman -Fs cadena1 cadena2 ...

Para mostrar información detallada acerca de un determinado paquete:

 $ pacman -Si nombre_del_paquete

Para conocer los paquetes instalados en el sistema:

 $ pacman -Qi nombre_del_paquete

Pasando la doble opción -i también se mostrará la lista de archivos de respaldo y sus estados de modificación:

 $ pacman -Qii nombre_del_paquete

Para obtener una lista de los archivos instalados por un paquete:

 $ pacman -Ql nombre_del_paquete

Para obtener un listado de los archivos instalados por un paquete recibido desde un servidor remoto:

 $ pacman -Fl nombre_del_paquete

Para verificar la presencia de los archivos instalados por un paquete:

 $ pacman -Qk nombre_del_paquete

Pasando la opción k dos veces, se realizará un chequeo más exhaustivo.

Para consultar la base de datos para saber a qué paquete pertenece un archivo del sistema de archivos:

 $ pacman -Qo /ruta/al/nombre_del_archivo

Para consultar la base de datos para saber a qué paquete del servidor remoto pertenece un archivo:

 $ pacman -Fo /ruta/al/nombre_del_archivo

Para listar todos los paquetes que no sean necesarios como dependencias (huérfanos):

 $ pacman -Qdt

Para listar todos los paquetes explícitamente instalados y no requeridos como dependencias:

 $ pacman -Qet

Pactree 

Para ver el árbol de dependencias de un paquete:

 $ pactree nombre_del_paquete

Para ver el árbol dependiente de un paquete, se utiliza la opción inversa -r a pactree.

Estructura de la base de datos 

Las bases de datos de pacman se encuentran, normalmente, en /var/lib/pacman/sync. Para cada repositorio especificado en /etc/pacman.conf habrá su correspondiente archivo de base de datos ubicado allí. Los archivos de base de datos son archivos en formato tar-gzip que contienen un directorio para cada paquete.

El archivo depends enumera los paquetes de los que depende este paquete, mientras que el archivo desc contiene una descripción del paquete, como el tamaño del archivo y el hash MD5.

Limpiar la memoria caché de los paquetes 

Pacman almacena los paquetes descargados en /var/cache/pacman/pkg/ y no elimina las versiones antiguas o desinstaladas automáticamente. Esto tiene algunas ventajas:

 Permite realizar downgrade de un paquete sin necesidad de recuperar la versión anterior por otros medios, como  de Arch Linux Archive.
 Un paquete que se ha desinstalado se puede reinstalar fácilmente directamente desde la carpeta caché, sin necesidad de una nueva descarga desde el repositorio.

Sin embargo, es necesario limpiar deliberadamente la caché periódicamente para evitar que la carpeta crezca indefinidamente en tamaño.

El script paccache, proporcionado dentro del paquete  pacman-contrib, elimina todas las versiones en caché de los paquetes instalados y desinstalados, excepto los 3 más recientes, por defecto:

  # paccache -r

También puede definir cuántas versiones recientes desea conservar. Para conservar solo una versión anterior:

 # paccache -rk1

Añada la opción u para limitar la acción de paccache a los paquetes desinstalados. Por ejemplo, para eliminar todas las versiones en caché de paquetes desinstalados:

 # paccache -ruk0

Véase paccache -h para más opcioines.

Pacman también tiene algunas opciones integradas para limpiar el caché y los archivos de base de datos sobrantes de los repositorios que ya no figuran en el archivo de configuración de /etc/pacman.conf. Sin embargo, pacman no ofrece la posibilidad de mantener una serie de versiones anteriores y, por lo tanto, es más agresivo que las opciones predeterminadas de  paccache.

Para eliminar todos los paquetes en caché que no están instalados actualmente, y la base de datos de sincronización no utilizada:
	
  # pacman -Sc

pkgcacheclean y pacleaner (ambas del repositorio AUR) son dos alternativas más para limpiar la caché.

Órdenes adicionales 

Descargar un paquete sin instalarlo:

 # pacman -Sw nombre_del_paquete

Instalar un paquete «local» que no proviene de un repositorio remoto (por ejemplo, el paquete proviene de AUR):

 # pacman -U /ruta/al/paquete/nombre_del_paquete-versión.pkg.tar.xz

Para mantener una copia del paquete local en la caché de pacman:

 # pacman -U file://ruta/al/paquete/nombre_del_paquete-versión.pkg.tar.xz

Instalar un paquete 'remoto' (no de un repositorio indicado en los archivos de configuración de pacman):

 # pacman -U http://www.ejemplo.com/repo/ejemplo.pkg.tar.xz

Para inhibir las acciones derivadas de -S, -U y -R, puede utilizarse -p.

Pacman siempre enumerará los paquetes que se van a instalar o eliminar y pedirá permiso antes de realizar la acción.

Motivo de la instalación 

La base de datos de pacman diferencia los paquetes instalados en dos grupos, de acuerdo a la razón por la que fueron instalados:

 explicitly-installed: (instalado explícitamente), son aquellos paquetes que se instalaron con una orden genérica de pacman como -S o -U;
 dependencies: (dependencias), son aquellos paquetes que, pese a que nunca se pasaron (en general) por una orden de instalación de pacman, fueron implícitamente instalados porque eran requeridos por otro paquete que fue explícitamente instalado.

Al instalar un paquete, es posible forzar su motivo de instalación a dependency con:

 # pacman -S --asdeps nombre_del_paquete

La lista de paquetes explícitamente instalados se puede mostrar con pacman -Qe, mientras que la lista complementaria de dependencias se puede mostrar con pacman -Qd.

Para cambiar el motivo de la instalación de un paquete ya instalado, ejecute:

 # pacman -D --asdeps nombre_del_paquete

Utilice --asexplicit para realizar la operación opuesta.

Buscar un paquete que contenga un archivo específico 

Sincronice la base de datos de archivos:

 # pacman -Fy

Busque un paquete que contenga un archivo, por ejemplo:

 $ pacman -Fs pacman
 core/pacman 5.0.1-4
     usr/bin/pacman
     usr/share/bash-completion/completions/pacman
 extra/xscreensaver 5.36-1
     usr/lib/xscreensaver/pacman

Configuración 

La configuración de pacman se encuentra en el archivo /etc/pacman.conf. Este es el archivo donde el usuario configura el programa para que funcione de la manera deseada.

Opciones generales

Comparar versiones antes de actualizar 

Para ver versiones antiguas y nuevas de paquetes disponibles, descomente la línea «VerbosePkgLists» en/etc/pacman.conf.La salida de pacman -Syu se verá así:

 Package (6)             Old Version  New Version  Net Change  Download Size
 
 extra/libmariadbclient  10.1.9-4     10.1.10-1      0.03 MiB       4.35 MiB
 extra/libpng            1.6.19-1     1.6.20-1       0.00 MiB       0.23 MiB
 extra/mariadb           10.1.9-4     10.1.10-1      0.26 MiB      13.80 MiB

Evitar la actualización de un paquete 

Para omitir la actualización de un paquete en particular cuando vaya a actualizar el sistema, debe especificarlo así:

 IgnorePkg=linux

Para ignorar la actualización de varios paquetes, utilice una lista separada por espacios, o utilice líneas adicionales de IgnorePkg. También se pueden utilizar la sintaxis «glob patterns». Si desea omitir paquetes pero solo una vez, puede utilizar la opción --ignore en la línea de órdenes, esta vez con una lista separada por comas.

Aún será posible actualizar los paquetes ignorados usando pacman -S: en este caso pacman le recordará que los paquetes han sido incluidos en una declaración de IgnorePkg.

Evitar la actualización de un grupo de paquetes 

En Archlinux y derivadas no son posibles las actualizaciones parciales.

Al igual que con los paquetes, saltarse un grupo de paquetes completo también es posible:

 IgnoreGroup=gnome

Evitar que un archivo sea actualizado 
	
Todos los archivos enumerados con una directivaNoUpgrade nunca se tocarán durante la instalación/actualización de un paquete, y los nuevos archivos se instalarán con una extensión .pacnew.
	
 NoUpgrade=ruta/al/archivo

La ruta se refiere a los archivos del paquete. Por lo tanto, no debe incluirse la barra inclinada.

Evitar la instalación de archivos en el sistema 

Para ignorar siempre la instalación de archivos o directorios específicos, enumérelos en NoExtract. Por ejemplo, para evitar la instalación de unidades de systemd, proceda así:

 NoExtract=usr/lib/systemd/system/*

Las reglas posteriores anulan las anteriores, pero se puede negar una regla añadiéndole el signo !.

Mantener varios archivos de configuración 

Si tiene varios archivos de configuración y quiere compartir las opciones entre dichas configuraciones, puede utilizar la declaración Include de los archivos de configuración, por ejemplo:

 Include = /ruta/a/configuraciones/comunes

Donde el archivo /ruta/a/configuraciones/comunes contiene las mismas opciones para ambas configuraciones.

Seguridad de los paquetes 

Pacman soporta firmas de los paquetes, que añaden una capa adicional de seguridad a los mismos. La configuración por defecto, 1=SigLevel = Required DatabaseOptional, permite la verificación de las firmas para todos los paquetes a nivel global: esto puede ser anulado en la línea SigLevel de cada repositorio en cuestión.

Front ends 
Existen varios front ends para Pacman que permiten llevar a cabo las tareas de mantenimiento de paquetes de forma gráfica: 

 AppSet, un gestor de paquetes avanzado.
 Chase, demonio de KDE que maneja actualizaciones mediante libapqm.
 kpacupdate, Pacman update notification tool para el system tray de KDE.
 pacman-notifier, simple icono en bandeja que avisa acerca de actualizaciones, también permite gestionar actualizaciones. Escrito en Ruby y GTK.
 alunn, notificador en bandeja de actualizaciones y noticias de archlinux.org.
 pacupdate, un applet de la bandeja de sistema, que notifica al usuario de actualizaciones disponibles.
 pacsyu, un applet que utiliza python 2, pygtk y vte; y que permite revisar el sistema y actualizarlo con un solo clic, además de ser independiente del escritorio, actualmente el desarrollador está trabajando en soporte para paquetes de AUR sin necesidad de una herramienta como Yaourt o Packer.
 octopi, estupendo gestor de paquetes gráfico escrito en Qt para Arch, Manjaro, Chakra, KaOS y ArchBang. Permite mostrar información, instalar y actualizar paquetes automáticamente desde los repositorios oficiales y AUR: http://octopiproject.wordpress.com/about/
 pamac, herramienta simple pero poderosa para instalar paquetes individuales escrita en GTK muy similar a Octopi. Cuenta además con un simple gestor de actualizaciones y soporte para AUR.

Véase también 
 Arch Linux
 Manjaro Linux

Referencias

Enlaces externos 

 Página principal de Pacman
 Pacman – Arch Linux Wiki
 Interfaces gráficas de Pacman – Arch Linux Wiki
 DistroWatch Interview: Judd Vinet talks about Arch Linux and Pacman in 2003

Fuentes

Arch Linux
Gestores de paquetes libres
Gestores de paquetes Linux