Trova (e reinstalla) pacchetti con file danneggiati (senza interrompere nulla)


35

Di solito preferisco riparare un sistema Linux piuttosto che reinstallarlo da zero. I miei computer hanno visto molti aggiornamenti di distribuzione e un elenco di PPA o repository di terze parti. APT di solito si assicura che tutto funzioni alla fine. Tuttavia, il fatto che il gestore pacchetti pensi che tutti i pacchetti richiesti siano "installati" non garantisce che tutti i file siano presenti nel file system.

Tale situazione può verificarsi se si devono aggirare i problemi di dipendenza dpkg --force-*. Si potrebbe anche riprodurre una situazione del genere eliminando un file /usrcome root.

Esiste un modo semplice per verificare se sono presenti tutti i file appartenenti a un pacchetto installato?

Se viene trovato un pacchetto di questo tipo, aptitude reinstallrisolve il problema.

Risposte:


47

Dalla debsumspagina man:

apt-get install --reinstall $(dpkg -S $(debsums -c) | cut -d : -f 1 | sort -u)
       Reinstalls packages with changed files.

Ho appena eseguito questo sul mio sistema perché il contenuto del disco è stato danneggiato in modo casuale mentre stavo sperimentando un sistema operativo beta. Ecco cosa ho fatto (e sembra aver funzionato bene):

Innanzitutto, ho installato 'debsums' e l'ho eseguito per vedere se avevo dei file corrotti sul mio sistema:

$ sudo apt-get install debsums
$ sudo debsums_init
$ sudo debsums -cs
/usr/share/bash-completion/completions/ssh
/usr/share/icons/hicolor/scalable/actions/cheese-take-photo.svg
/usr/share/gnome/help/gnumeric/C/files-textopen.xml
/usr/share/dbus-1/services/indicator-sound.service
/lib/modules/3.11.0-12-generic/kernel/drivers/mtd/ubi/ubi.ko

Come puoi vedere, ho cinque file corrotti quindi devo reinstallarli. Ecco come ho trovato quali pacchetti contengono i file corrotti:

$ sudo debsums -c | xargs -rd '\n' -- dpkg -S | cut -d : -f 1 | sort -u
bash-completion
cheese-common
gnumeric-doc
indicator-sound
linux-image-extra-3.11.0-12-generic

Quindi ho riparato la corruzione reinstallando i pacchetti danneggiati:

$ xargs -rd '\n' -a <(sudo debsums -c | xargs -rd '\n' -- dpkg -S | cut -d : -f 1 | sort -u) -- sudo apt-get install -f --reinstall --
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  linux-image-generic
Use 'apt-get autoremove' to remove it.
0 upgraded, 0 newly installed, 5 reinstalled, 0 to remove and 0 not upgraded.
Need to get 43.9 MB of archives.
After this operation, 0 B of additional disk space will be used.
Get:1 http://us.archive.ubuntu.com/ubuntu/ saucy/main bash-completion all 1:2.0-1ubuntu3 [173 kB]
Get:2 http://us.archive.ubuntu.com/ubuntu/ saucy/main cheese-common all 3.8.3-0ubuntu1 [2,929 kB]
Get:3 http://us.archive.ubuntu.com/ubuntu/ saucy/universe gnumeric-doc all 1.12.6-1 [7,295 kB]     
Get:4 http://us.archive.ubuntu.com/ubuntu/ saucy/main linux-image-extra-3.11.0-12-generic i386 3.11.0-12.19 [33.5 MB]
Get:5 http://us.archive.ubuntu.com/ubuntu/ saucy/main indicator-sound i386 12.10.2+13.10.20131011-0ubuntu1 [55.7 kB]
Fetched 43.9 MB in 10min 23s (70.4 kB/s)                                                           
(Reading database ... 174913 files and directories currently installed.)
Preparing to replace bash-completion 1:2.0-1ubuntu3 (using .../bash-completion_1%3a2.0-1ubuntu3_all.deb) ...
Unpacking replacement bash-completion ...
Preparing to replace cheese-common 3.8.3-0ubuntu1 (using .../cheese-common_3.8.3-0ubuntu1_all.deb) ...
Unpacking replacement cheese-common ...
Preparing to replace gnumeric-doc 1.12.6-1 (using .../gnumeric-doc_1.12.6-1_all.deb) ...
Unpacking replacement gnumeric-doc ...
Preparing to replace linux-image-extra-3.11.0-12-generic 3.11.0-12.19 (using .../linux-image-extra-3.11.0-12-generic_3.11.0-12.19_i386.deb) ...
Unpacking replacement linux-image-extra-3.11.0-12-generic ...
Examining /etc/kernel/postrm.d .
run-parts: executing /etc/kernel/postrm.d/initramfs-tools 3.11.0-12-generic /boot/vmlinuz-3.11.0-12-generic
run-parts: executing /etc/kernel/postrm.d/zz-update-grub 3.11.0-12-generic /boot/vmlinuz-3.11.0-12-generic
Preparing to replace indicator-sound 12.10.2+13.10.20131011-0ubuntu1 (using .../indicator-sound_12.10.2+13.10.20131011-0ubuntu1_i386.deb) ...
Unpacking replacement indicator-sound ...
Processing triggers for man-db ...
Processing triggers for libglib2.0-0:i386 ...
No such key 'auto-launch' in schema 'com.ubuntu.update-notifier' as specified in override file '/usr/share/glib-2.0/schemas/20_xubuntu-default-settings.gschema.override'; ignoring override for this key.
Processing triggers for hicolor-icon-theme ...
Setting up bash-completion (1:2.0-1ubuntu3) ...
Setting up cheese-common (3.8.3-0ubuntu1) ...
Setting up gnumeric-doc (1.12.6-1) ...
Setting up linux-image-extra-3.11.0-12-generic (3.11.0-12.19) ...
Running depmod.
update-initramfs: deferring update (hook will be called later)
Not updating initrd symbolic links since we are being updated/reinstalled 
(3.11.0-12.19 was configured last, according to dpkg)
Not updating image symbolic links since we are being updated/reinstalled 
(3.11.0-12.19 was configured last, according to dpkg)
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 3.11.0-12-generic /boot/vmlinuz-3.11.0-12-generic
run-parts: executing /etc/kernel/postinst.d/dkms 3.11.0-12-generic /boot/vmlinuz-3.11.0-12-generic
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 3.11.0-12-generic /boot/vmlinuz-3.11.0-12-generic
update-initramfs: Generating /boot/initrd.img-3.11.0-12-generic
run-parts: executing /etc/kernel/postinst.d/pm-utils 3.11.0-12-generic /boot/vmlinuz-3.11.0-12-generic
run-parts: executing /etc/kernel/postinst.d/update-notifier 3.11.0-12-generic /boot/vmlinuz-3.11.0-12-generic
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 3.11.0-12-generic /boot/vmlinuz-3.11.0-12-generic
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.11.0-14-generic
Found initrd image: /boot/initrd.img-3.11.0-14-generic
Found linux image: /boot/vmlinuz-3.11.0-12-generic
Found initrd image: /boot/initrd.img-3.11.0-12-generic
Found memtest86+ image: /boot/memtest86+.bin
Found Windows 7 (loader) on /dev/sda1
done
Setting up indicator-sound (12.10.2+13.10.20131011-0ubuntu1) ...

Alla fine, ho verificato che non rimanessero file corrotti:

$ sudo debsums -c

Non c'è stato alcun output da questo comando, il che significa che non sono stati trovati errori. :-)

Un'ultima nota: dovresti anche controllare i file di configurazione dei tuoi pacchetti per assicurarti che siano OK. Questo può essere più difficile perché i file di configurazione cambiano spesso e le modifiche sono legittime, quindi dovrai ispezionare manualmente ogni file di configurazione modificato per determinare se è effettivamente corrotto. Ecco come ottenere un elenco di file di configurazione modificati:

$ sudo debsums -as
debsums: changed file /etc/gnome/defaults.list (from desktop-file-utils package)
debsums: changed file /etc/default/rcS (from initscripts package)
debsums: changed file /etc/subuid (from login package)
debsums: changed file /etc/subgid (from login package)
debsums: changed file /etc/sudoers (from sudo package)

Non ho solo file corrotti ma anche file mancanti. quando provo a reinstallare con apt-get si interrompe perché dpkg dà l'errore che manca un file (facepalm). Lo stesso con apt-get remove, errore perché manca il file.
Mark Jeronimus,

Se ne hai più di 1. Funziona anche con il file mancante. debsums -c | grep -P -o '/.*?\s' | xargs dpkg -S | cut -d : -f 1 | xargs apt-get install --reinstall
mikeytown2,

11

Lo script fornito da PeniWize funziona perfettamente per i file corrotti, ma non si occupa dei pacchetti con file mancanti, perché debsums li riporta a stderr. Per reinstallare i pacchetti con file mancanti, questo ha funzionato per me:

xargs -rd '\n' -a <(sudo debsums -c 2>&1 | cut -d " " -f 4 | sort -u | xargs -rd '\n' -- dpkg -S | cut -d : -f 1 | sort -u) -- sudo apt-get install -f --reinstall --

3

Alla domanda è stata data risposta altrove:

Esiste un controllo di integrità di Ubuntu? : i pacchetti debsums possono calcolare gli hash MD5 e confrontarli con il pacchetto deb.

Esiste un modo sicuro per reinstallare tramite il gestore pacchetti : Sì, ma non raccomandato.


Se la tua risposta è essenzialmente un riferimento a un'altra domanda, sarebbe meglio contrassegnare questa domanda come duplicata dell'altra. Non dimenticare di votare le risposte che hai trovato utili!
Melebio

-1

L'uso del programma dpkg insieme ad alcuni script di Bash dovrebbe essere in grado di farlo per te. L'unica avvertenza sarebbe se qualcuno sostituisse le versioni "pulite" dei file con quelle "dannose". Per questo sarebbe necessario ottenere checksum MD5 validi da un pacchetto incontaminato. Comunque, ecco il codice della shell per ottenere ciò che vuoi:

#!/bin/sh
PACKAGE_NAME="xterm"
for i in `sudo dpkg -L ${PACKAGE_NAME}`
do
    if ! [ -e $i ]; then
            echo "$i is a missing file in the $PACKAGE_NAME package."
    fi
done

Lo script verrebbe stampato solo se mancava un file o una directory definiti nel pacchetto. Inoltre, dovrai sostituire la variabile "PACKAGE_NAME" con il pacchetto che desideri ispezionare. Spero che sia di aiuto.


1
Non sono sicuro che funzionerebbe in tutti i casi. Cosa dpkg -Lelenca esattamente? Debsums come risposta altrove sembra una buona alternativa.
Jan
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.