Reinstallare tutti i pacchetti Debian


19

Ho interrotto per errore un processo di dpkg in esecuzione in background e vorrei reinstallare tutti i pacchetti per essere sicuro che tutto andasse bene.

Innanzitutto, ho cercato di ottenere un elenco di tutti i pacchetti e reinstallarli

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

Ma ci sono messaggi come:

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

Ci ho provato apt-get -f install, senza successo.

Come ultima risorsa, ho reinstallato tutti i programmi che non hanno superato i checksum:

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

Cosa devo fare per reinstallare tutto?

Modifica: problema risolto. Il problema era qualcos'altro (vedi i commenti). Capisco che è qualcosa da evitare con Debian.


1
Di recente ho avuto un arresto anomalo durante il tentativo di installare un pacchetto. Quando ho riavviato e ho provato a reinstallare quel pacchetto, ho ricevuto il messaggio "E: dpkg è stato interrotto, è necessario eseguire manualmente 'dpkg --configure -a' per correggere il problema.". L'esecuzione di quel comando ha rimosso il pacchetto e i file di configurazione. Sono stato quindi in grado di installare il pacchetto da zero. Prova a dare quel comando.
embedded.kyle

Non ha fatto nulla, quindi suppongo che nulla sia rotto. Proverò più tardi a verificare se i miei problemi di driver sono risolti.
alex_reader,

1
Reinstallazione di tutti i pacchetti == idea davvero pessima. (a) È quasi sempre inutile (b) probabilmente fallirà (c) Se il tuo sistema è davvero così incasinato, reinstallalo. Risolvi i problemi che vedi effettivamente.
Faheem Mitha,

Risposte:


9

Prova questo, ricordando che non l' ho provato:

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

fonti:


Il mio problema era completamente diverso: non stavo avviando il kernel corretto (!). Accetterò la tua risposta come sembra fare quello che volevo (ma anche non testato).
alex_reader,

Questo non funzionerà e romperà completamente il sistema. La riga 3 disinstallerà apt, quindi non sarà possibile reinstallare tutto in seguito.
rkjnsn,

@rkjnsn: ho aggiornato la risposta, controlla se funziona.
Marco Sulla

1
Tentativo di eseguire questa operazione non viene reinstallato nulla, anche se viene popolato il file di selezione: pi @ prodpi ~ $ sudo apt-get --reinstall dselect-upgrade Lettura degli elenchi di pacchetti ... Fine Creazione dell'albero delle dipendenze Lettura delle informazioni sullo stato ... Fatto 0 aggiornato , 0 appena installati, 0 da rimuovere e 0 non aggiornati. qualche idea?
Andig

Un motivo per cui penso che il tuo codice non funzionerà è perché l' dpkg --get-selectionselenco dei comandi disinstalla anche i pacchetti.
Ortomala Lokni,

2

Per ogni evenienza, prova a reinstallare ogni pacchetto :

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

Potresti voler aggiungere la risposta sì anche a tutte le domande.


cat: list.log: nessun file o directory di questo tipo
IgorGanapolsky

2
@IgorGanapolsky Esegui dpkg --get-selections > list.logprima.
QwertyChouskie,

2
list.logè tratto dalla domanda.
Stephen Kitt,

2

In una delle risorse citate da Lucas Malor ho trovato uno script chiamato populator che sembra essere vicino alla soluzione. Se si imposta la variabile di selezione dei pacchetti sull'elenco di tutti i pacchetti

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

è quindi possibile eseguire lo script e reinstallare tutti i pacchetti, ma il sistema avrà probabilmente dei problemi. Sarebbe meglio testarlo prima in una macchina virtuale.

Ecco una variante dello script dal link sopra:

#!/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

Se viene visualizzato l'errore che non è possibile reinstallare pacchetti specifici, eseguire questo comando per riprovare:

sudo apt-get -y autoremove

1

Prova questo invece poiché prenderà il tuo output e lo renderà una linea gigante con spazi che separano i nomi dei file.

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)

L'unica modifica al tuo post originale è l'aggiunta nella seconda istruzione awk, che probabilmente potrebbe essere fatta in linea con la prima per creare il file desiderato.

Questa modifica forzerà apt-get a scaricare nuovamente correttamente i pacchetti e tutte le dipendenze mancanti che non sono state installate la prima volta e reinstallarli in ordine.

Se lo rendiamo in linea, credo che sarebbe simile a questo allora:

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

E quindi assicurati di avere davvero il sistema con i pacchetti corretti (o più recenti), pulisci la cache apt, aggiornala e quindi scarica nuovamente tutti i file (puoi saltare i primi due passaggi se vuoi solo quello che hai nella cache reinstallato):

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

Avevo installato oltre 2k pacchetti su un sistema che avevo aggiornato con un hangup. Usando dpkg --configure -a ha terminato l'installazione (era nella fase finale). Ho quindi eseguito questo per rendere tutto reinstallare correttamente.

O come indicato su /superuser/298912/reinstall-debian-while-keeping-installed-packages-and-data :

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

Assicurati di eseguire un "init 2" prima di qualsiasi reinstallazione, poiché alcuni dei componenti di X o del tuo gestore di finestre preferito potrebbero non essere reinstallati.


A meno che tu non abbia modificato IFS, i $(cat file)token non quotati su qualsiasi spazio bianco e danno esattamente lo stesso risultato se il file è delimitato da newline o spazi. --reinstallpotrebbe aiutare, ma è già stato dato due volte prima di questo.
dave_thompson_085

1

Quando si utilizza Aptitude c'è un modo semplice e veloce per farlo:

sudo aptitude reinstall '~i'

che reinstallerà tutti i pacchetti attualmente installati.


-1

Quando si utilizza RPM, nel caso si verifichi un danneggiamento nel database dei pacchetti, esiste un'opzione per ricostruire questo database, evitando così di dover eseguire sostanzialmente una reinstallazione. Come ha sottolineato un utente, questo è fatto in Debian da dpkg --configure -a.


1
Il ruolo di dpkg --configure -aè configurare tutti i pacchetti non compressi e non configurati. Vedere le pagine man di dpkge dpkg-reconfigureed anche debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html
Ortomala Lokni
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.