===== Guía rápida y completa del gestor de paquetes pacman (Arch) ===== ==== Paquetes Arch ==== Un paquete de Arch no es más que un archivo tar o 'tarball', comprimido usando xz, que contiene los siguientes archivos generados por makepkg: Archivos binarios a instalar. * .PKGINFO: contiene todos los metadatos requeridos por pacman para tratar con paquetes, dependencias, etc. * .MTREE: contiene hashes y marcas de tiempo de los archivos que se incluyen en la base de datos local para que pacman pueda verificar la integridad del paquete. * .INSTALL: un archivo opcional utilizado para ejecutar comandos después de la fase de instalación/actualización/eliminación. (Este archivo sólo está presente si se especifica en el .PKGBUILD). * Changelog: un archivo opcional guardado por el responsable del paquete documentando los cambios del paquete. (No está presente en todos los paquetes.) ==== Actualizar sistema ==== # Actualizar sistema sin actualizar la información de los repositorios. pacman -Su # Actualizar sistema actualizando la base de datos de paquetes previamente (Uso recomendado). pacman -Syu pacman -Syu --ignore paquete1,paquete2 # Ignora uno o varios paquetes en la actualización. Útil cuando algún paquete está en conflicto con otro nuevo que va a sustituir al actualmente instalado. pacman --overwrite "*" -Syu # Si se muestran errores de que determinado fichero ya existe en el sistema de ficheros (de esta manera se fuerza la sobreescritura). Para Ignorar siempre la instalacion de X paquetes se puede usar el fichero /etc/pacman.conf y de esta forma evitar hacer uso del parámetro --ignore IgnorePkg = linux-firmware linux-headers linux ==== Evitar responder a preguntas de confirmación de pacman ==== Contestar siempre "yes/sí" a las preguntas de pacman (Are you sure? / ¿Continuar con la instalación? / ... ) # ejemplo de actualización del sistema no interactivo. pacman -Syu --noconfirm ==== Eliminar / Optimizar Cache ==== # Elimina de la cache todos los paquetes menos los actualmente instalados. (Impide un Rollback). # Para borrados de cache (/var/cache/pacman/pkg/) selectivos usar "paccache". # Permite también quitar repositorios no utilizados. pacman -Sc pacman -Scc # Solo en casos de necesidad (Ej. Disco duro lleno). # Optimizar base de datos de pacman (fragmentación). pacman-optimize ==== Eliminar paquetes huérfanos ==== # Paquetes huérfanos (Ya no son dependencia de ningún paquete). pacman -Qtdq # Lista paquetes huérfanos. pacman -Rs $(pacman -Qtdq) # Elimina paquetes huérfanos. ==== Instalar / Actualizar / Descargar un paquete ==== pacman -S paquete pacman --overwrite "*" -S paquete # Si se muestra el mensaje de que un determinado fichero ya se encuentra dentro del sistema de ficheros ("exists on filesystem"). # Instalar paquetes del repositorio testing (debe estar activado en /etc/pacman.conf). pacman -S testing/paquete # Instalar grupo de paquetes. pacman -S gnome # Descargar paquete sin instalarlo. pacman -Sw paquete # Instalar un paquete local o remoto desde una URL. pacman -U /home/XX/paquete.tar.xz pacman -U http://www.XXX/repo/paquete.tar.xz # Reinstalar todos los paquetes excluyendo los que no se instalaron desde repositorios (pacman -Qmq). pacman -S $(pacman -Qq | grep -v "$(pacman -Qmq)") # Hacer un "downgrade" (desactualización) de una aplicación (NO para el Kernel). cd /var/cache/pacman/pkg/ pacman -U paquete # NOTA: Si tiene dependencias actualizadas hay que bajarlas de versión también. ==== Desinstalar paquetes ==== # Quitar un paquete con las dependencias que no están siendo usadas por otros paquetes. pacman -Rs paquete # Quitar un paquete con todas las dependencias. pacman -Rcns paquete # Elimina dependencias más profundas (ser cuidadoso). pacman -Rsc paquete # Elimina dependencias # Quitar un paquete con sus archivos de configuración. pacman -Rn paquete # Forzar desinstalación aunque el paquete sea dependencia importante de otra aplicación. pacman -Rdd paquete ==== Buscar / Listar paquetes en los repositorios (-S) ==== # Buscar paquete para instalar (+ paquetes asociados). pacman -Ss paquete # Información sobre un paquete de los repositorios / Saber a qué repositorio pertenece un paquete. pacman -Sii paquete # Si se omite nombre de paquete listará toda la información de todos los paquetes. # Listar grupos de paquetes / Listar aplicaciones pertenecientes a un grupo de paquetes. pacman -Sg pacman -Sg base qt # Lista los paquetes de los grupos. # Listar todos los paquetes disponibles en un repositorio notificando si alguno está instalado. pacman -Sl # Lista todos los paquetes de todos los repositorios. pacman -Sl community # Lista los paquetes dentro del repositorio community. # Lista los ficheros pertenecientes a paquetes de los repositorios. pkgfile -l paquete # Si hay varios paquetes diferentes se debe especificar (ej. extra/nginx, extra/nginx-mainline, community/gitlab) # Lista paquetes que contengan un fichero o directorio con la cadena "vim" (extra/gvim extra/vim, community/radare2) pacman -Fs vim # Buscando por nombre mostrando información como la versión y ficheros. pkgfile vim # Busca por nombre pero solo muestra el nombre de los paquetes. # Listar dependencias de paquetes. pactree nmap # Muestra las dependencias de un paquete en forma de árbol. pactree -r paquete # Muestra todos los paquetes que depende del paquete propuesto. pacman -Si paquete1 paquete2 | awk -F'[:<=>]' '/^Depends/ {print $2}' | xargs -n1 | sort -u # Listar dependencias de una lista de paquetes. NOTA: Atención al idioma de la terminal, en este ejemplo inglés. ==== Buscar a qué paquete pertenece un fichero (-F) ==== # Actualizar la base de datos. pacman -Fy # Buscar a qué paquete partenece un fichero. pacman -F fstrim.service core/util-linux 2.36-2 [instalado] usr/lib/systemd/system/fstrim.service # Buscar por nombre de ficherp pero usando expresiones regulares (-x). pacman -Fx fstrim.s* core/util-linux 2.36-2 [instalado] usr/lib/systemd/system/fstrim.service usr/lib/systemd/system/fstrim.timer usr/share/man/man8/fstrim.8.gz community/libguestfs 1.42.0-4 usr/include/guestfs-gobject/optargs-fstrim.h community/man-pages-de 2.16-2 usr/share/man/de/man8/fstrim.8.gz ==== Buscar / Listar paquetes en local (-Q) ==== # Muestra los paquetes instalados. pacman -Qs # Lista todos los paquetes instalados. pacmab -Qe # Lista únicamente los paquetes instalados de manera explícita. # Buscar qué paquete contiene un determinado fichero en los repositorios. pacman -Fo /*/*/pacman # Buscando por ruta. # Información de un paquete. pacman -Q # Lista todos los paquetes instalados. pacman -Qs nmap # Solo muestra la descripción del paquete instalado. pacman -Qii nmap # Muestra más información del paquete instalado como modificaciones sobre archivos de respaldo (configuraciones de aplicaciones que no son borradas al desinstalar la aplicación). pacman -Qiikk filesystem # Muestra la misma información del comando anterior pero además indica qué cambios se realizaron sobre qué ficheros (El identificador de grupo GID / Los permisos / La fecha de modificación / tamaño no concuerda) # NOTA: Este último comandos es muy útil para conocer qué ficheros no han sido todavía sustituidos por su nueva versión ".pacnew". # También si se quiere averiguar qué permisos implementaba un archivo de manera predeterminada. # Recordemos que esta información está solo disponible si se instaló la aplicación mediante paquetería (Información /var/lib/pacman/local/XXX/mtree) # Consultas sobre ficheros instalados por los paquetes. pacman -Qo # Averiguar a qué paquete instalado pertenece un determinado fichero. pacman -Ql # Lista los ficheros de un paquete instalado en el sistema. pacman -Qlq paquete | grep -v '/$' | xargs du -h | sort -h # Lo mismo pero ordenando y mostrando el tamaño de los ficheros. # Buscar paquetes instalados manualmente (paquetes que no estén en la base de datos de sincronización, por ejemplo los instalados desde yaourt, aurman, etc.). pacman -Qm # Lista paquetes instalados (>= 1MiB) ordenados por tamaño. pacman -Qi | grep 'Nombre\|Tamaño' | cut -d: -f2 | paste - - | awk -F'\t' '{ print $2, "\t", $1, "\t", $3 }' | grep MiB | sort -h # NOTA: Atención al idioma de la terminal, en este ejemplo español. # Muestra paquetes instalados que no son requeridos por ningún otro paquete. pacman -Qqte # Buscar ficheros de paquetes instalados que hayan sido modificados (normalmente son ficheros de configuración). pacman -Qii | awk '/^MODIFIED/ {print $2}' ==== Clonar conjunto de paquetes instalados entre dos sistemas Arch ==== pacman -Qqe > pkglist.txt # Copiar lista de paquetes del PC "A". pacman -S - < pkglist.txt # Instalar en "B" listado de paquetes del PC "A". ==== Historial de pacman ==== Todo los comandos de pacman se registran en el fichero de log /var/log/pacman.log, lo cual nos permite poder obtener cualquier tipo e información, incluso cuando se ejecutaron comandos con paquetes inexistentes. # Mostrar comandos que realmente instalaron algo. grep -B 1 "transaction started" /var/log/pacman.log | grep "pacman -S" # Buscar por una fecha concreta. grep -i 2018-03-25 /var/log/pacman.log ==== Crear un paquete a partir de un PKGBUILD ==== wget https://aur.archlinux.org/.../PKGBUILD makepkg sudo pacman -U path-to-generated.tar.xz ==== Administrar mirrors de repositorios ==== **URL con el estado de todos los mirrors**: [[https://www.archlinux.org/mirrors/status/]] Obtener todos los repositorios de un país, ej. "Spain". awk '/^## Spain$/{f=1}f==0{next}/^$/{exit}{print substr($0, 2)}' /etc/pacman.d/mirrorlist Crear un fichero mirrorlist cuando no se tiene ninguno. # Descargar la lista de todos los mirrors. curl -o /etc/pacman.d/mirrorlist https://www.archlinux.org/mirrorlist/all/ # Se debe descomentar el/los mirror/s que se quieran utilizar primeramente. pacman -Syu pacman-mirrorlist NOTA: En cada actualización que se haga del sistema (pacman -Syu) suele renovarse la lista de mirrors de repositorios. Suele ser conveniente renombrar el nuevo fichero "/etc/pacman.d/mirrorlist.pacnew" a "/etc/pacman.d/mirrorlist". Sin olvidar descomentar los servidores deseados posteriormente. ==== Repositorios snapshot (ALA) / Downgrade de todos los paquetes referenciando una fecha concreta ==== Al estilo de los repositorio snapshot del mundo debian, en arch es posible definir una fecha concreta para instalar unas versiones concretas de la distribución. Esto es útil para probar actualizaciones en sistemas de pruebas antes de aplicarlas en producción. Pero también es algo que puede se usado para resolver problemas en determinadas situaciones. **Arch Linux Archive**: https://wiki.archlinux.org/title/Arch_Linux_Archive Esto por supuesto tiene algunos riesgos, Arch es rolling release y eso significa, que configurar una imagen de repositorio del pasado puede romper algunas aplicaciones que hayan sido actualizadas. Esto es debido a que sus ficheros/directorios de configuración no sean ya compatibles con versiones anteriores, algo que por ejemplo pasa mucho con Firefox. Aunque en estas cosas la suerte juega un papel importante, cuanto más software se tenga instalado y más lejos nos vayamos en el pasado, más riesgo de problemas. Por lo tanto se recomienda hacer uso de esta técnica solo en casos de necesidad. Normalmente una actualización del sistema puede tener una versión concreta de un paquete, por ejemplo el kernel, que es el problemático y es este el que se recomienda reinstalar en una versión anterior (downgrade) para resolver el problema de forma temporal si no se puede esperar a la siguiente versión. En la página de Arch suelen estar bien documentados los problemas con determinados paquetes. Si pese a ello se quiere hacer un downgrade de todo el sistema en base a una fecha, simplemente se deben hacer lo siguiente. Fichero /etc/pacman.d/mirrorlist con un repositorio snapshot de la fecha "11/04/2024" Server=https://archive.archlinux.org/repos/2024/04/11/$repo/os/$arch Hacer un downgrade de todos los paquetes a las versiones de la fecha 11/04/2024 Spacman -Syyuu En el fichero "/var/log/pacman.log" se tiene información sobre las fechas de actualizaciones del sistema, por lo que siempre puede referenciarse la ultima fecha en la que se sabe que el sistema no tenía problemas para configurar el repositorio. ==== Paquetes de python en Arch ==== Los paquetes de python se pueden instalar a mano, desde pacman o desde pip. Suele darse el caso de que un determinado módulo no está en los repositorios oficiales y sí en los repositorios que usa Pip. No hay ninguna norma general y cada usuario administra sus paquetes como considera oportuno, aquí se dan a conocer algunos consejos que pueden ser de ayuda para algunos usuarios principiantes. Cuando el modulo es usado por el usuario y no root, se puede instalar en el entorno del usuario ($HOME/.local/lib/pythonX.X/site-package). De esa forma nunca habrá un conflicto con el administrador de paquetes del sistema. Mostrar directorios usados por python (para el entorno de usuario es configurable mediante la variable PYTHONUSERBASE). python -m site pip install --user packagename **Buscar todas las versiones disponibles de un paquete con Pip** (Python 3) # Ejemplo para visualizar todas las versiones de Ansible disponibles mediante pip. pip install --use-deprecated=legacy-resolver ansible== ERROR: Could not find a version that satisfies the requirement ansible== (from versions: 1.0, 1.1, 1.2, 1.2.1, 1.2.2, 1.2.3, 1.3.0, 1.3.1, 1.3.2, 1.3.3, 1.3.4, 1.4, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.4.5, 1.5, 1.5.1, 1.5.2, 1.5.3, 1.5.4, 1.5.5, 1.6, 1.6.1, 1.6.2, 1.6.3, 1.6.4, 1.6.5, 1.6.6, 1.6.7, 1.6.8, 1.6.9, 1.6.10, 1.7, 1.7.1, 1.7.2, 1.8, 1.8.1, 1.8.2, 1.8.3, 1.8.4, 1.9.0.1, 1.9.1, 1.9.2, 1.9.3, 1.9.4, 1.9.5, 1.9.6, 2.0.0.0, 2.0.0.1, 2.0.0.2, 2.0.1.0, 2.0.2.0, 2.1.0.0, 2.1.1.0, 2.1.2.0, 2.1.3.0, 2.1.4.0, 2.1.5.0, 2.1.6.0, 2.2.0.0, 2.2.1.0, 2.2.2.0, 2.2.3.0, 2.3.0.0, 2.3.1.0, 2.3.2.0, 2.3.3.0, 2.4.0.0, 2.4.1.0, 2.4.2.0, 2.4.3.0, 2.4.4.0, 2.4.5.0, 2.4.6.0, 2.5.0a1, 2.5.0b1, 2.5.0b2, 2.5.0rc1, 2.5.0rc2, 2.5.0rc3, 2.5.0, 2.5.1, 2.5.2, 2.5.3, 2.5.4, 2.5.5, 2.5.6, 2.5.7, 2.5.8, 2.5.9, 2.5.10, 2.5.11, 2.5.12, 2.5.13, 2.5.14, 2.5.15, 2.6.0a1, 2.6.0a2, 2.6.0rc1, 2.6.0rc2, 2.6.0rc3, 2.6.0rc4, 2.6.0rc5, 2.6.0, 2.6.1, 2.6.2, 2.6.3, 2.6.4, 2.6.5, 2.6.6, 2.6.7, 2.6.8, 2.6.9, 2.6.10, 2.6.11, 2.6.12, 2.6.13, 2.6.14, 2.6.15, 2.6.16, 2.6.17, 2.6.18, 2.6.19, 2.6.20, 2.7.0.dev0, 2.7.0a1, 2.7.0b1, 2.7.0rc1, 2.7.0rc2, 2.7.0rc3, 2.7.0rc4, 2.7.0, 2.7.1, 2.7.2, 2.7.3, 2.7.4, 2.7.5, 2.7.6, 2.7.7, 2.7.8, 2.7.9, 2.7.10, 2.7.11, 2.7.12, 2.7.13, 2.7.14, 2.7.15, 2.7.16, 2.7.17, 2.7.18, 2.8.0a1, 2.8.0b1, 2.8.0rc1, 2.8.0rc2, 2.8.0rc3, 2.8.0, 2.8.1, 2.8.2, 2.8.3, 2.8.4, 2.8.5, 2.8.6, 2.8.7, 2.8.8, 2.8.9, 2.8.10, 2.8.11, 2.8.12, 2.8.13, 2.8.14, 2.8.15, 2.8.16rc1, 2.8.16, 2.8.17rc1, 2.8.17, 2.8.18rc1, 2.8.18, 2.8.19rc1, 2.8.19, 2.9.0b1, 2.9.0rc1, 2.9.0rc2, 2.9.0rc3, 2.9.0rc4, 2.9.0rc5, 2.9.0, 2.9.1, 2.9.2, 2.9.3, 2.9.4, 2.9.5, 2.9.6, 2.9.7, 2.9.8, 2.9.9, 2.9.10, 2.9.11, 2.9.12, 2.9.13, 2.9.14rc1, 2.9.14, 2.9.15rc1, 2.9.15, 2.9.16rc1, 2.9.16, 2.9.17rc1, 2.9.17, 2.9.18rc1, 2.9.18, 2.10.0a1, 2.10.0a2, 2.10.0a3, 2.10.0a4, 2.10.0a5, 2.10.0a6, 2.10.0a7, 2.10.0a8, 2.10.0a9, 2.10.0b1, 2.10.0b2, 2.10.0rc1, 2.10.0, 2.10.1, 2.10.2, 2.10.3, 2.10.4, 2.10.5, 2.10.6, 2.10.7, 3.0.0b1, 3.0.0rc1, 3.0.0) ERROR: No matching distribution found for ansible== ==== Solventar problemas de llaves GPG al instalar aplicaciones con pacman ==== # El error "==> ERROR: A specified local key could not be updated from a keyserver." indica que el servidor predeterminado de llaves no funciona. Se puede cambiar el servidor usado mediante --keyserver pacman-key --refresh-keys --keyserver hkp://keys.gnupg.net pacman -S archlinux-keyring # El error "error: key "7258734B41C31549" could not be looked up remotely" puede ser solventado al importar la llave desde un servidor GPG. pacman-key -r 7258734B41C31549 3B94A80E50A477C7 --keyserver hkp://pool.sks-keyservers.net ==== Solucionar "Pacman está en uso, espere." ==== Si no está el proceso pacman activo, entonces se debe eliminar el fichero de bloqueo db.lck. A veces se generan este tipo de ficheros al haberse finalizado el proceso pacman de manera forzada. Error: # Inglés: error: failed to synchronize all databases (unable to lock database) # Español: error: no se han podido sincronizar todas las bases de datos (no se pudo bloquear la base de datos) Solución: rm /var/lib/pacman/db.lck ==== Solucionar "error: no se pudo realizar la operación (archivos en conflicto)" ==== La solución es renombrar / eliminar el / los ficheros problemáticos. **Causas**. * Instalaciones de aplicaciones de manera manual. * Corrupción de la base de datos. * Por defecto, Arch no sobrescribe ficheros que no deberían estar en directorios de instalación destino. Pero se puede dar, entre otros casos, que la versión antigua creara un fichero o enlace simbólico después de instalarse, y la nueva incluya el fichero propiamente dicho en el paquete para su instalación. En esos casos Arch avisa de manera predeterminada. ==== Solucionar error al actualizar: "invalid or corrupted package (PGP signature)" ==== Ejemplo. :: File /var/cache/pacman/pkg/libtiff-4.0.10-1-x86_64.pkg.tar.xz is corrupted (invalid or corrupted package (PGP signature)). pacman -Sy archlinux-keyring && pacman -Syyu NOTA: A veces es necesario usar el ultimo fichero /etc/pacman.d/mirrorlist disponible con los repositorios más actualizados. Ya que puede estar usandose un repositorio considerado "deprecated". ==== Problemas con la ejecución de los "post-transaction hooks" al finalizar una actualización de Arch ==== Este es un problema que puede suceder cuando ha pasado demasiado tiempo desde la última actualización del equipo. error: hook /usr/share/libalpm/hooks/90-mkinitcpio-install.hook line 2: invalid value Path error: hook /usr/share/libalpm/hooks/30-systemd-tmpfiles.hook line 2: invalid value Path error: hook /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook line 2: invalid value Path error: hook /usr/share/libalpm/hooks/30-systemd-udev-reload.hook line 2: invalid value Path error: hook /usr/share/libalpm/hooks/20-systemd-sysusers.hook line 2: invalid value Path ... Si se reinicia el equipo sin ejecutar los hooks, lo normal es que el sistema no arranque y se necesite montar el disco desde una imagen de arch para solucionar el problema. Esto se debe a que esos triggers (post-transaction hooks) instalan partes del sistema esenciales. Si no se ha reiniciado, es posible simplemente reinstalando systemd para que ejecute de nuevo esos hooks y ya no debería haber más problema. pacman -S systemd # También se puede optar por una reinstalación completa de todos los paquetes. # pacman -S $(pacman -Qq) ==== Problemas al actualizar con paquetes en conflicto ==== :: Synchronizing package databases... core is up to date extra is up to date :: Starting full system upgrade... :: Replace libblockdev-utils with extra/libblockdev? [Y/n] Y resolving dependencies... looking for conflicting packages... error: unresolvable package conflicts detected error: failed to prepare transaction (conflicting dependencies) :: libblockdev and libblockdev-utils are in conflict Solución: Actualizar el sistema ignorando el paquete que será sustituido. pacman -Syu --ignore libblockdev-utils ==== Recomendaciones típicas para usar pacman ==== Evite realizar actualizaciones parciales. En otras palabras, nunca ejecute pacman -Sy; en su lugar, siempre pacman -Syu. Antes de instalar algo, mejor actualizar el sistema completamente (para no entrar en las actualizaciones parciales) Actualizar de manera regular para no dar saltos demasiado grandes entre versiones. Visualizar atentamente qué paquetes se van a actualizar y los avisos una vez están siendo instalados por si se necesita / recomienda realizar algo a posteriori. Visitar la web de arch previamente a actualizar para percatarse de posibles problemas con paquetes que puedan requerir mantenimiento manual al actualizar el sistema. Es aconsejable antes de actualizar el sistema, esperar a tener tiempo suficiente para poder hacer frente a posibles problemas posteriores a la actualización. El script de bash "checkupdates", incluido con el paquete pacman-contrib, proporciona una forma segura de comprobar las actualizaciones de los paquetes instalados sin ejecutar una actualización del sistema al mismo tiempo. Cuando se ejecuta pacman, pueden crearse archivos .pacnew y .pacsave. Pacman proporciona avisos cuando esto sucede y los usuarios deben tratar estos archivos con prontitud. Si el sistema tiene paquetes instalados manualmente (siempre debería hacerse mediante makepkg), los usuarios tendrán que reconstruirlos cuando sus dependencias reciban una advertencia soname (bumps). Si se ha creado un escenario de actualización parcial y se rompen los binarios porque no pueden encontrar las bibliotecas a las que están vinculadas, NO solucione el problema simplemente mediante enlaces simbólicos. Las bibliotecas reciben advertencias soname(bumps) cuando no son compatibles con versiones anteriores. Simplemente actualice usando pacman -Syu para solucionar el problema. ==== Enlaces de interés ==== * **Visualizar paquetes instalados por orden de instalación**:[[ordenar_por_fecha_de_instalacion_en_pacman| Leer]] * **Aplicaciones para instalar paquetes de AUR**: [[https://wiki.archlinux.org/index.php/AUR_helpers]]