Réinstaller tous les paquets Debian

19

J'ai tué par erreur un processus dpkg exécuté en arrière-plan et je voudrais réinstaller tous les paquets pour être sûr que tout va bien.

Tout d'abord, j'ai essayé d'obtenir une liste de tous les packages et de les réinstaller

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

Mais il y a des messages comme:

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

J'ai essayé apt-get -f install, sans succès.

En dernier recours, j'ai réinstallé tous les programmes qui ont échoué les sommes de contrôle:

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

Que dois-je faire pour tout réinstaller?

Edit: Problème résolu. Le problème était autre chose (voir les commentaires). Je comprends que c'est quelque chose à éviter avec Debian.

alex_reader
la source
1
J'ai récemment eu un plantage en essayant d'installer un package. Lorsque j'ai redémarré et essayé de réinstaller ce package, j'ai reçu le message "E: dpkg a été interrompu, vous devez exécuter manuellement 'dpkg --configure -a' pour corriger le problème.". L'exécution de cette commande a supprimé ledit package et ses fichiers de configuration. J'ai ensuite pu installer le package à partir de zéro. Essayez d'essayer cette commande.
embedded.kyle
Cela n'a rien fait, donc je suppose que rien n'est cassé. J'essaierai plus tard de vérifier si mes problèmes de pilote sont résolus.
alex_reader
1
Réinstaller tous les packages == très mauvaise idée. (a) C'est presque toujours inutile (b) il échouera probablement (c) Si votre système est vraiment si mal gâché, réinstallez-le. Corrigez simplement les problèmes que vous voyez réellement.
Faheem Mitha

Réponses:

9

Essayez ceci, en vous rappelant que je ne l'ai pas testé:

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

Sources:

Marco Sulla
la source
Mon problème était complètement différent: je ne démarrais pas le bon noyau (!). J'accepterai votre réponse car elle semble faire ce que je voulais (mais non testée également).
alex_reader
Cela ne fonctionnera pas et cassera complètement le système. La ligne 3 désinstallera apt, il ne sera donc pas possible de tout réinstaller par la suite.
rkjnsn
@rkjnsn: J'ai mis à jour la réponse, vérifiez si cela fonctionne.
Marco Sulla
1
En essayant de faire cela, rien n'est en cours de réinstallation, bien que le fichier de sélections soit rempli: pi @ prodpi ~ $ sudo apt-get --reinstall dselect-upgrade Lecture des listes de packages ... Terminé Création de l'arborescence des dépendances Lecture des informations d'état ... Terminé 0 mis à niveau , 0 nouvellement installé, 0 à supprimer et 0 non mis à niveau. une idée?
andig
L'une des raisons pour lesquelles je pense que votre code ne fonctionnera pas est que la dpkg --get-selectionsliste de commandes désinstalle également les packages.
Ortomala Lokni
2

Au cas où, essayez de réinstaller chaque package :

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

Vous souhaiterez peut-être ajouter une réponse oui à toutes les questions.

lâche
la source
cat: list.log: Aucun fichier ou répertoire de ce type
IgorGanapolsky
2
@IgorGanapolsky Run d' dpkg --get-selections > list.logabord.
QwertyChouskie
2
list.logest tiré de la question.
Stephen Kitt
2

Dans l' une des ressources citées par Lucas Malor, j'ai trouvé un script appelé populator qui semble être proche de la solution. Si vous définissez la variable de sélection de packages sur la liste de tous vos packages

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

vous pouvez ensuite exécuter le script et réinstaller tous les packages, mais le système rencontrera probablement des problèmes. Il serait préférable de le tester d'abord sur une machine virtuelle.

Voici une variante du script à partir du lien ci-dessus:

#!/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 une erreur apparaît que des packages spécifiques ne peuvent pas être réinstallés, exécutez cette commande pour réessayer:

sudo apt-get -y autoremove
Ortomala Lokni
la source
1

Essayez plutôt car il prendra votre sortie et en fera une ligne géante avec des espaces séparant les noms de fichiers.

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)

La seule modification apportée à votre publication d'origine est l'ajout de la deuxième instruction awk, qui pourrait probablement être effectuée en ligne avec la première pour créer le fichier que vous souhaitez.

Cette modification forcera apt-get à retélécharger correctement les packages et toutes les dépendances manquantes qui n'ont pas été installées la première fois et à les réinstaller dans l'ordre.

Si nous le faisons en ligne, je pense que cela ressemblerait à ceci alors:

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

Et puis assurez-vous que le système possède les packages corrects (ou les plus récents), nettoyez le cache apt, mettez-le à jour et téléchargez à nouveau tous les fichiers (vous pouvez ignorer les deux premières étapes si vous ne voulez que ce que vous avez dans le cache réinstallé):

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

J'ai installé plus de 2 000 packages sur un système que j'ai mis à niveau et qui avait un blocage. L'utilisation de dpkg --configure -a a terminé l'installation (c'était dans la phase finale). J'ai ensuite exécuté cela pour que tout se réinstalle correctement.

Ou comme indiqué sur /superuser/298912/reinstall-debian- while - keeping - installed - packages- and- data :

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

Assurez-vous simplement de lancer un "init 2" avant toute réinstallation, car certains des composants de X ou de votre gestionnaire de fenêtres préféré peuvent ne pas aimer être réinstallés.

Lâche anonyme
la source
Sauf si vous avez modifié IFS, les $(cat file)jetons non cotés sur n'importe quel espace blanc et donnent exactement le même résultat, que le fichier soit délimité par des retours à la ligne ou des espaces. --reinstallpourrait aider mais a déjà été donné deux fois avant cela.
dave_thompson_085
1

Lorsque vous utilisez Aptitude, il existe un moyen simple et rapide de le faire:

sudo aptitude reinstall '~i'

qui réinstallera tous les packages actuellement installés.

goetzc
la source
-1

Lorsque vous utilisez RPM, dans le cas où vous causez une corruption dans la base de données du package, il existe une option pour reconstruire cette base de données, vous évitant ainsi d'avoir à effectuer essentiellement une réinstallation. Comme l'a souligné un utilisateur ici, cela se fait dans Debian par dpkg --configure -a.

mdpc
la source
1
Le rôle de dpkg --configure -aest de configurer tous les packages décompressés et non configurés. Voir les pages de manuel de dpkget dpkg-reconfigureet aussi debian.org/doc/manuals/debian-faq/ch-pkg_basics.fr.html
Ortomala Lokni