Réinstallation de packages avec des fichiers manquants / corrompus

17

Après un arrêt impur et un fsck coloré, tout un tas de fichiers ont disparu. La sortie de 'rpm -Va' est longue de plusieurs centaines de lignes (principalement des fichiers manquants mais aussi une somme de contrôle et d'autres incompatibilités). Existe-t-il un moyen simple de réinstaller des packages dont les fichiers sont manquants et / ou corrompus?

L'OS en question est Fedora 22.

jaymmer - Réintégrer Monica
la source
3
Certainement possible, mais aussi assez fastidieux pour analyser la sortie et pour chaque fichier interroger le package qui contient ce fichier et prend probablement un certain temps. Pourquoi ne pas simplement réinstaller tous les packages? yum reinstall $(rpm -qa --qf="%{N}-%{V}\n" | sort)
doktor5000
Il pourrait également être assez moche de filtrer tous les problèmes supplémentaires causés par le lien préalable, si je ne me trompe pas, qui est toujours activé par défaut sur Fedora selon fedorahosted.org/fesco/ticket/1183
doktor5000
J'ai en effet fini par tout réinstaller - le problème était que j'avais oublié d'activer keep-cache pour dnf, il a fini par télécharger plus de 2 Go de paquets (et j'ai plafonné Internet)
jaymmer - Reinstate Monica

Réponses:

16

Par souci de référence et d'exhaustivité, une commande qui serait en mesure de réaliser ce qui était initialement demandé serait quelque chose comme ça (rapidement bricolé, mais ça marche)

rpm -qf $(rpm -Va 2>&1 | grep -vE '^$|prelink:' | sed 's|.* /|/|') | sort -u

Voici une courte explication des différentes parties:

rpm -Va 2>&1

Exécute une vérification complète de tous les packages actuellement installés / répertoriés dans la base de données rpm. Il redirigera également stderr vers stdout, car ici sur ma boîte, certaines erreurs causées par l'activation de la préconnexion sont signalées comme des erreurs, mais nous les voulons sur stdout.
Attention: doit être exécuté en tant que root pour pouvoir vérifier tous les fichiers, les autorisations et le propriétaire / groupe.

grep -vE '^$|prelink:'

supprime l' affichage des lignes Emtpy et ceux des erreurs prelink (exemple d'une telle erreur:
prelink: /tmp/#prelink#.B14JBi: Recorded 10 dependencies, now seeing -1)

sed 's|.* /|/|')

filtrera la rpm -Vasortie pour n'afficher que les noms de fichiers

rpm -qf $()

recherchera tous les noms de fichiers obtenus dans lesquels les packages sont contenus, et affichera le nom et la version du package

| sort -u

supprimera les combinaisons nom / version de package en double.

Au total, vous recevrez une liste de packages dont la vérification a échoué.

rpm -Vapeut encore montrer des problèmes non liés, car il vérifie également les dépendances entre les packages, qui peuvent devoir être supprimées en ajoutant --nodeps.

doktor5000
la source
2

J'ai récemment rencontré un problème similaire avec des fichiers manquants sur openSUSE 13.2 et l'ai résolu avec:

rpm -Va --nodeps --nodigest --noscripts --nosignature --nofiledigest --nosize --nomode --nordev --nouser --nogroup --nomtime\
| awk -e '($1=="missing") && ($2=="d") {system("rpm -qf "$3);}; ($1=="missing") && ($2!="d") && ($2!="c") {system("rpm -qf "$2);}'\
| sort -u | xargs zypper in -f

Les options de rpm et l'appel à awk sont destinés à gagner du temps dans mon cas, car aucune corruption ne s'est produite.

auxsvr
la source
1
S'il n'y a pas eu de corruption de fichier, vous pouvez même ajouter --nofileset donc faire la même chose yum check dependenciescar il ne vérifiera que tous les packages rpm installés pour les problèmes de dépendance. --nofilespermettrait d'économiser beaucoup de temps pour les installations non SSD, mais vous omettriez également la vérification des fichiers manquants. ... juste par souci d'exhaustivité. Et s'il vous plaît gardez à l'esprit, si vous grep pour les chaînes anglaises, vous voudrez peut-être préfixer avec LC_ALL=C;)
doktor5000