Reinstalar todos los paquetes de Debian

19

Eliminé por error un proceso dpkg ejecutándose en segundo plano y me gustaría reinstalar todos los paquetes para asegurarme de que todo esté bien.

Primero, intenté obtener una lista de todos los paquetes y reinstalarlos

dpkg --get-selections | grep -v deinstall | awk '{print $1}' > list.log
apt-get install --reinstall $(cat list.log)

Pero hay mensajes como:

E: Couldn't configure pre-depend debconf:i386 for console-setup:i386, probably a dependency cycle.

Lo intenté apt-get -f install, sin éxito.

Como último recurso, reinstalé todos los programas que fallaron las sumas de verificación:

dpkg -l | grep ^ii | awk '{ print $2 }' | xargs debsums -s -a

¿Qué debo hacer para reinstalar todo?

Editar: Problema resuelto. El problema era otra cosa (ver los comentarios). Sin embargo, entiendo que es algo que se debe evitar con Debian.

alex_reader
fuente
1
Recientemente tuve un bloqueo al intentar instalar un paquete. Cuando reinicié e intenté reinstalar ese paquete, recibí el mensaje "E: dpkg fue interrumpido, debe ejecutar manualmente 'dpkg --configure -a' para corregir el problema". La ejecución de ese comando eliminó dicho paquete y sus archivos de configuración. Luego pude instalar el paquete desde cero. Intenta darle una oportunidad a ese comando.
embedded.kyle
No hizo nada, así que supongo que nada está roto. Intentaré más tarde verificar si mis problemas con el controlador están resueltos.
alex_reader
1
Reinstalar todos los paquetes == idea realmente mala. (a) Casi siempre es innecesario (b) probablemente fallará (c) Si su sistema está realmente tan mal, simplemente vuelva a instalarlo. Solo arregle los problemas que realmente ve.
Faheem Mitha

Respuestas:

9

Prueba esto, recordando que no lo probé:

dpkg --get-selections > selections
sudo dpkg --clear-selections
sudo dpkg --set-selections < selections
sudo apt-get --reinstall dselect-upgrade

Fuentes:

Marco Sulla
fuente
Mi problema era completamente diferente: no estaba arrancando el núcleo correcto (!). Aceptaré tu respuesta, ya que parece hacer lo que quería (pero también no probado).
alex_reader
Esto no funcionará y romperá completamente el sistema. Line 3 desinstalará apt, por lo que no será posible reinstalar todo después.
rkjnsn
@rkjnsn: Actualicé la respuesta, verifique si funciona.
Marco Sulla
1
Intentando hacer esto, no se reinstala nada, aunque el archivo de selecciones se completa: pi @ prodpi ~ $ sudo apt-get --reinstall dselect-upgrade Lectura de listas de paquetes ... Hecho Creación del árbol de dependencias Lectura de información de estado ... Hecho 0 actualizado , 0 recién instalado, 0 para eliminar y 0 no actualizado. ¿alguna idea?
andig
Una razón por la que creo que su código no funcionará es porque la dpkg --get-selectionslista de comandos también desinstala paquetes.
Ortomala Lokni
2

Por si acaso, intente reinstalar cada paquete :

for i in $(cat list.log); do apt-get install --reinstall "$i"; done

Es posible que también desee agregar la respuesta sí a todas las preguntas.

Cobarde
fuente
cat: list.log: No existe tal archivo o directorio
IgorGanapolsky
2
@IgorGanapolsky Corre dpkg --get-selections > list.logprimero.
QwertyChouskie
2
list.logestá tomado de la pregunta.
Stephen Kitt
2

En uno de los recursos citados por Lucas Malor encontré un script llamado populator que parece estar cerca de la solución. Si configura la variable de selección de paquetes en la lista de todos sus paquetes

PKGLIST=$(dpkg --get-selections | grep -v deinstall| cut -f1)

luego puede ejecutar el script y reinstalar todos los paquetes, pero el sistema probablemente tendrá algunos problemas. Sería mejor probarlo primero en una máquina virtual.

Aquí hay una variante del script del enlace de arriba:

#!/bin/bash
#
# Script to pre-populate apt-get proxy for faster later downloads.
# It uses apt-get and wget to pull all the specified packages.
#

# Make sure only root can run our script
if [[ $EUID -ne 0 ]]; then
   echo "You're not root, are you?" 1>&2
   exit 1
fi

# Specify wanted packages
PKGLIST="exaile" 

# Clears out the local repository of retrieved package files
apt-get clean

# Resynchronize the package index files from their sources
apt-get update

# Re-install specified packages at the newest version. 
apt-get install --reinstall $PKGLIST

Si se muestra el error de que no se pueden reinstalar paquetes específicos, ejecute este comando para volver a intentarlo:

sudo apt-get -y autoremove
Ortomala Lokni
fuente
1

Intente esto, ya que tomará su salida y la convertirá en una línea gigante con espacios que separan los nombres de los archivos.

dpkg --get-selections | grep -v deinstall | awk '{print $1}' > list.log awk '$1=$1' ORS=' ' list.log > newlist.log apt-get install --reinstall $(cat newlist.log)

El único cambio en su publicación original es agregar la segunda declaración awk, que probablemente podría hacerse en línea con la primera para crear el archivo que desea.

Este cambio obligará a apt-get a volver a descargar correctamente los paquetes y las dependencias faltantes que no se instalaron la primera vez y volver a instalarlos en orden.

Si lo hacemos en línea, creo que se vería así:

dpkg --get-selections | grep -v deinstall | awk '{print $1}' | awk '$1=$1' ORS=' ' > list.log

Y luego asegúrese de que realmente el sistema tenga los paquetes correctos (o más recientes), limpie el caché apto, actualícelo y luego vuelva a descargar todos los archivos (puede omitir los primeros dos pasos si solo quiere lo que tiene en el caché reinstalado):

apt-get clean && apt-get update && apt-get install --reinstall $(cat list.log)

Tenía más de 2k paquetes instalados en un sistema que actualicé que tenía un bloqueo. Usando dpkg --configure -a terminó la instalación (estaba en la fase final). Luego ejecuté esto para que todo se reinstale correctamente.

O como se indica en /superuser/298912/reinstall-debian-while-keeping-installed-packages-and-data :

sudo apt-get install --reinstall $(dpkg --get-selections | grep -w 'install$' | cut -f1)

Solo asegúrese de ejecutar primero un "init 2" antes de volver a instalar, ya que algunos de los componentes de X o su administrador de ventanas favorito pueden no gustarle la reinstalación.

Cobarde anónimo
fuente
A menos que haya modificado IFS, los $(cat file)tokens sin comillas en cualquier espacio en blanco y dan exactamente el mismo resultado si el archivo está delimitado por líneas nuevas o espacios. --reinstallpodría ayudar, pero ya se le dio dos veces antes de esto.
dave_thompson_085
1

Al usar Aptitude, hay una manera fácil y rápida de hacerlo:

sudo aptitude reinstall '~i'

que reinstalará todos los paquetes instalados actualmente.

goetzc
fuente
-1

Cuando se usa RPM, en caso de que se produzca una corrupción en la base de datos del paquete, existe una opción para reconstruir esta base de datos, evitando así que tenga que realizar básicamente una reinstalación. Como un usuario señaló aquí, esto se hace en Debian dpkg --configure -a.

mdpc
fuente
1
La función de dpkg --configure -aes configurar todos los paquetes desempaquetados y no configurados. Vea las páginas de manual de dpkgy dpkg-reconfiguretambién debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html
Ortomala Lokni