pacman (Français)/Restore local database (Français)
Signes indiquant que pacman a besoin d'une restauration de la base de données locale :
-
pacman -Q
n'indique rien, etpacman -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
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
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