Reinstalar paquetes con archivos faltantes / corruptos

17

Después de un cierre inmundo y un fsck colorido, un montón de archivos han desaparecido. La salida de 'rpm -Va' tiene varios cientos de líneas (en su mayoría faltan archivos, pero también algunas sumas de comprobación y otros desajustes). ¿Hay una manera fácil de reinstalar paquetes que tienen archivos faltantes y / o corruptos?

El sistema operativo en cuestión es Fedora 22.

jaymmer - Restablece a Monica
fuente
3
Ciertamente posible, pero también bastante tedioso analizar el resultado y para cada consulta de archivo el paquete que contiene ese archivo y probablemente tome algún tiempo. ¿Por qué no simplemente reinstalar todos los paquetes? yum reinstall $(rpm -qa --qf="%{N}-%{V}\n" | sort)
doktor5000
También podría ser bastante feo filtrar todos los problemas adicionales causados ​​por el preenlace, si no me equivoco, eso todavía está habilitado por defecto en Fedora de acuerdo con fedorahosted.org/fesco/ticket/1183
doktor5000
Yo de hecho acaban de volver a instalar todo - el problema era que había olvidado para permitir keep-caché para DNF, terminó la descarga de más de 2 GB de paquetes (y he tapado Internet)
jaymmer - Restablecer Monica

Respuestas:

16

A modo de referencia y completarlo, un comando que sería capaz de lograr lo que inicialmente solicitó sería algo como esto (fiddled rápidamente juntos, pero que está funcionando)

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

Aquí hay una breve explicación de las diferentes partes:

rpm -Va 2>&1

Ejecutará una verificación completa de todos los paquetes actualmente instalados / listados en la base de datos rpm. También redirigirá stderr a stdout, ya que aquí en mi cuadro algunos errores causados ​​por la activación del preenlace se informan como errores, pero los queremos en stdout.
Atención: debe ejecutarse como root para poder verificar todos los archivos, permisos y propietario / grupo.

grep -vE '^$|prelink:'

Suprime visualización de las líneas emtpy y tales de los errores prelink (ejemplo de un error de este tipo:
prelink: /tmp/#prelink#.B14JBi: Recorded 10 dependencies, now seeing -1)

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

filtrará la rpm -Vasalida para mostrar solo los nombres de archivo

rpm -qf $()

preguntará por todos los nombres de archivo obtenidos en qué paquete están contenidos, y mostrará el nombre y la versión del paquete

| sort -u

suprimirá las combinaciones duplicadas de nombre / versión del paquete.

En total, recibirá una lista de paquetes que fallaron la verificación.

rpm -Vaaún podría mostrar algunos problemas no relacionados, ya que también verifica las dependencias entre paquetes, que es posible que deba suprimirse agregando --nodeps.

doktor5000
fuente
2

Hace poco tuve un problema similar con los archivos que faltan en openSUSE 13.2 y arreglado 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

Las opciones a rpm y la llamada a awk están destinadas a ahorrar tiempo en mi caso, porque se ha producido sin corrupción.

auxsvr
fuente
1
Si no ha habido corrupción de archivos, incluso se podría añadir --nofilesy por lo tanto básicamente hace lo mismo que yum check dependenciesya que sólo verificar todos los paquetes instalados para problemas de dependencia. --nofilesahorraría mucho tiempo para instalaciones que no sean SSD, pero también omitiría la verificación de los archivos que faltan. ... solo por completo. Y por favor, tenga en cuenta, si grep para cadenas en inglés, es posible que desee prefijo con LC_ALL=C;)
doktor5000