Pacman (Español)/Restore local database (Español)

From ArchWiki
Estado de la traducción: esta traducción de Pacman/Restore local database fue revisada el 2018-11-24. Si existen cambios puede actualizarla o avisar al equipo de traducción.

Señales de que pacman necesita una restauración de la base de datos local:

  • pacman -Q no da absolutamente ninguna salida, y pacman -Syu informa erróneamente que el sistema está actualizado.
  • Al intentar instalar un paquete utilizando pacman -S paquete, se genera una lista de dependencias ya satisfechas.

Lo más probable es que esto se deba a que la base de datos de software instalado por pacman, /var/lib/pacman/local, se haya corrompido o eliminado. Si bien este es un problema grave, puede restaurarse siguiendo las instrucciones siguientes.

En primer lugar, asegúrese de que el archivo de registro de pacman esté presente:

$ ls /var/log/pacman.log

Si no existe, no será posible continuar con este método. Puede usar el script de detección de paquetes de Xyne para recrear la base de datos. Si no es así, entonces la solución más factible será reinstalar todo el sistema.

Generar la lista de recuperación de paquetes

Advertencia: si por algún motivo la memoria caché de pacman (Español) de destino de paquetes de makepkg (Español) contiene paquetes para otras arquitecturas, elimínelos antes de continuar.

Instale el paquete pacutils para obtener paclog.

Cree un script de filtro de registro y hágalo ejecutable:

pacrecover
#!/bin/bash -e

. /etc/makepkg.conf

PKGCACHE=$((grep -m 1 '^CacheDir' /etc/pacman.conf || echo 'CacheDir = /var/cache/pacman/pkg') | sed 's/CacheDir = //')

pkgdirs=("$@" "$PKGDEST" "$PKGCACHE")

while read -r -a parampart; do
  pkgname="${parampart[0]}-${parampart[1]}-*.pkg.tar.{xz,zst}"
  for pkgdir in ${pkgdirs[@]}; do
    pkgpath="$pkgdir"/$pkgname
    [ -f $pkgpath ] && { echo $pkgpath; break; };
  done || echo ${parampart[0]} 1>&2
done

Ejecute el script (opcionalmente, pasando directorios adicionales con paquetes como parámetros):

$ paclog --pkglist --logfile=/var/log/pacman.log | ./pacrecover >files.list 2>pkglist.orig

De esta manera, se crearán dos archivos: files.list con los archivos de paquetes que todavía están presentes en el equipo, y pkglist.orig, paquetes que se deben descargar. La operación posterior puede dar lugar a discrepancia entres los archivos de versiones anteriores aún presentes en el equipo, y los archivos que se encuentran con una nueva versión. Dichos desajustes deberán ser arreglados manualmente.

He aquí una forma de restringir automáticamente la segunda lista a los paquetes disponibles en un repositorio:

$ { cat pkglist.orig; pacman -Slq; } | sort | uniq -d > pkglist
Nota: si esto falla mostrando failed to initialise alpm library, verifique si /var/lib/pacman/local/ALPM_DB_VERSION existe. En caso contrario, ejecute pacman-db-upgrade como root, seguido de pacman -Sy y luego repita la orden anterior.

Compruebe si falta algún paquete base importante y agréguelo a la lista:

$ comm -23 <(pacman -Sgq base | sort) pkglist.orig >> pkglist

Continúe una vez que el contenido de ambas listas sea satisfactorio, ya que se utilizarán para restaurar la base de datos de paquetes instalada por pacman (/var/lib/pacman/local/).

Realizar la recuperación

Defina una función de bash para fines de recuperación:

 recovery-pacman() {
    pacman "$@"       \
    --log /dev/null   \
    --noscriptlet     \
    --dbonly          \
    --overwrite "*"   \
    --nodeps          \
    --needed
}

--log /dev/null permite evitar la saturación innecesaria del registro de pacman, --needed ahorrará tiempo al omitir instalar paquetes ya presentes en la base de datos, --nodeps permitirá la instalación de paquetes almacenados en caché, incluso si los paquetes que se instalan dependen de versiones más nuevas. El resto de opciones permitirá que pacman funcione sin leer/escribir el sistema de archivos.

Refresque la base de datos:

# pacman -Sy

Inicie la generación de la base de datos instalando archivos de paquetes disponibles localmente desde files.list:

# recovery-pacman -U $(< files.list)

Instale el resto desde pkglist:

# recovery-pacman -S $(< pkglist)

Actualice la base de datos local para que los paquetes que no son requeridos por cualquier otro paquete se marquen como instalados explícitamente y el resto como dependencias. Necesitará tener más cuidado en el futuro al eliminar paquetes, pero con la base de datos original perdida es lo mejor que podemos hacer.

# pacman -D --asdeps $(pacman -Qq)
# pacman -D --asexplicit $(pacman -Qtq)

Opcionalmente, compruebe todos los paquetes instalados con daños:

# pacman -Qk

Opcionalmente Pacman/Tips and tricks (Español)#Identificar archivos que no pertenecen a ningún paquete.

Actualice todos los paquetes:

# pacman -Su