pacman (Français)/Restore local database (Français)

From ArchWiki

État de la traduction: Cet article est la version francophone de pacman/Restore local database. Date de la dernière traduction: 2024-02-29. Vous pouvez aider à synchroniser la traduction s'il y a eu des changements dans la version anglaise.

Signes indiquant que pacman a besoin d'une restauration de la base de données locale :

  • pacman -Q n'indique rien, et pacman -Syu indique à tort que le système est à jour.
  • Lorsque l'on essaie d'installer un paquet à l'aide de pacman -S package et produit une liste des dépendances déjà satisfaites.

La base de données de pacman sur les logiciels installés, /var/lib/pacman/local, a probablement été corrompue ou supprimée. Bien que cela soit un sérieux problème, il est possible de la restaurer en suivant les instructions ci-dessous.

Vérifiez tout d'abord que le fichier de log de pacman est bien présent :

$ ls /var/log/pacman.log

S'il n'existe pas, on ne pourra pas continuer avec cette méthode. Vous pouvez éventuellement utiliser le script de détection des paquets de Xyne pour recréer le base de donnée. Sinon, la solution la plus probable est de réinstaller l'ensemble du système.

Générer la liste de récupération des paquets

Attention: Si pour une raison quelconque le cache pacman ou la destination makepkg contient des paquets pour d'autres architectures, supprimez-les avant de continuer.

Installez le paquet pacman-contrib pour obtenir paclog-pkglist.

Créez le script de filtrage des logs et rendez-le exécutable :

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

Exécutez le script (en passant éventuellement des répertoires supplémentaires avec des paquets en tant que paramètres) :

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

De cette manière, deux fichiers seront créés : files.list avec les fichiers des paquets encore présents sur la machine et pkglist.orig, à partir duquel les paquets doivent être téléchargés. L'opération ultérieure peut entraîner des incohérences entre les fichiers des anciennes versions du paquet, encore présents sur la machine, et les fichiers trouvés dans la nouvelle version. Ces disparités devront être corrigées manuellement.

Voici un moyen de restreindre automatiquement la deuxième liste aux paquets disponibles dans un dépôt :

$ { cat pkglist.orig; pacman -Slq; } | sort | uniq -d > pkglist
Note: Si cela échoue avec failed to initialise alpm library, vérifiez si /var/lib/pacman/local/ALPM_DB_VERSION existe - si ce n'est pas le cas, exécutez pacman-db-upgrade en tant que root suivi de pacman -Sy puis réessayez la commande précédente.

Vérifiez si certains paquets de base sont manquants et ajoutez-les à la liste :

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

Procédez une fois que le contenu des deux listes vous semble satisfaisant, car elles seront utilisées pour restaurer la base de données des paquets installés par pacman ; /var/lib/pacman/local/.

Effectuer la récupération

Créez la fonction Bash pour la récupération :

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

--log /dev/null permet d'éviter de polluer inutilement les logs de pacman, --needed permet de gagner du temps en sautant les paquets déjà présents dans la base de données, --nodeps permet d'installer les paquets mis en cache, même si les paquets en cours d'installation dépendent de versions plus récentes. Le reste des options permet à pacman de fonctionner sans lire/écrire le système de fichiers.

Alimenter la base de données de synchronisation :

# pacman -Sy

Lancez la génération de la base de données en installant les fichiers de paquets disponibles localement à partir de files.list:

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

Installer le reste à partir de pkglist:

# recovery-pacman -S $(< pkglist)

Mettez à jour la base de données locale de manière que les paquets qui ne sont pas requis par un autre paquet soient marqués comme explicitement installés et les autres comme des dépendances. Vous devrez faire très attention à l'avenir lorsque vous supprimerez des paquets, la base de données originale ayant été perdue, c'est le mieux que nous puissions faire.

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

Facultativement, vérifier que tous les paquets installés ne sont pas corrompus :

# pacman -Qk

Accessoirement, voir pacman (Français)/Tips and tricks (Français)#Recherche des fichiers n'appartenant à aucun paquet.

Mettez à jour tous les paquets :

# pacman -Su