Reinstallazione di pacchetti con file mancanti / corrotti


17

A seguito di un arresto impuro e di un fsck colorato, un sacco di file è scomparso. L'output di 'rpm -Va' è lungo diverse centinaia di righe (file per lo più mancanti ma anche alcuni checksum e altre discrepanze). C'è un modo semplice per reinstallare i pacchetti che hanno file mancanti e / o corrotti?

Il sistema operativo in questione è Fedora 22.


3
Certamente possibile, ma anche piuttosto noioso per analizzare l'output e per ogni file interrogare il pacchetto che contiene quel file e probabilmente richiede del tempo. Perché non reinstallare semplicemente tutti i pacchetti? yum reinstall $(rpm -qa --qf="%{N}-%{V}\n" | sort)
doktor5000,

Potrebbe anche essere brutto filtrare tutti i problemi aggiuntivi causati da prelink, se non sbaglio che è ancora abilitato di default su Fedora secondo fedorahosted.org/fesco/ticket/1183
doktor5000

Alla fine ho reinstallato tutto - il problema era che avevo dimenticato di abilitare keep-cache per dnf, alla fine ho scaricato oltre 2 GB di pacchetti (e ho bloccato Internet)
Jaymmer - Reinstata Monica il

Risposte:


16

Per riferimento e completezza, un comando che sarebbe in grado di ottenere ciò che inizialmente richiesto sarebbe qualcosa di simile (rapidamente armeggiato insieme, ma funziona)

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

Ecco una breve spiegazione delle varie parti:

rpm -Va 2>&1

Eseguirà una verifica completa su tutti i pacchetti attualmente installati / elencati nel database rpm. Reindirizzerà anche stderr a stdout, poiché qui sulla mia scatola alcuni errori causati dall'attivazione di prelink sono riportati come errori ma li vogliamo su stdout.
Attenzione: deve essere eseguito come root per poter controllare tutti i file, le autorizzazioni e il proprietario / gruppo.

grep -vE '^$|prelink:'

Sopprime visualizzazione delle linee emtpy e tali degli errori prelink (esempio di un tale errore:
prelink: /tmp/#prelink#.B14JBi: Recorded 10 dependencies, now seeing -1)

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

filtrerà l' rpm -Vaoutput per mostrare solo i nomi dei file

rpm -qf $()

eseguirà una query per tutti i nomi di file ottenuti in quali pacchetti sono contenuti e genererà il nome e la versione del pacchetto

| sort -u

sopprimerà le combinazioni duplicate di nome / versione del pacchetto.

Complessivamente riceverai un elenco di pacchetti che non hanno superato la verifica.

rpm -Vapotrebbe ancora mostrare alcuni problemi non correlati, poiché controlla anche le dipendenze tra i pacchetti, che potrebbe essere necessario sopprimere aggiungendo --nodeps.


2

Recentemente ho avuto un problema simile con i file mancanti su openSUSE 13.2 e risolto con:

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

Le opzioni di rpm e la chiamata a awk hanno lo scopo di risparmiare tempo nel mio caso, perché non si è verificata alcuna corruzione.


1
Se non vi è stato alcun danneggiamento dei file, è possibile anche aggiungere --nofilese quindi sostanzialmente fare lo stesso in yum check dependenciesquanto controllerà solo tutti i pacchetti rpm installati per problemi di dipendenza. --nofilesrisparmierebbe molto tempo per installazioni non SSD, ma ometteresti anche il controllo per i file mancanti. ... solo per completezza. E per favore, tieni a mente, se cerchi le stringhe inglesi, potresti voler LC_ALL=C
aggiungere un
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.