Trouver (et réinstaller) les paquets avec des fichiers corrompus (sans rien casser)

35

Je préfère généralement réparer un système Linux que de le réinstaller à partir de zéro. Mes ordinateurs ont vu de nombreuses mises à niveau de distribution et une liste de PPA ou de référentiels tiers. APT s'assure généralement que tout fonctionne à la fin. Cependant, le fait que le gestionnaire de packages pense que tous les packages requis sont "installés" ne garantit pas que tous les fichiers sont présents sur le système de fichiers.

Une telle situation peut se produire si vous devez contourner des problèmes de dépendance dpkg --force-*. On pourrait aussi reproduire une telle situation en supprimant un fichier en /usrtant que root.

Existe-t-il un moyen simple de vérifier si tous les fichiers appartenant à un package installé sont présents?

Si un tel problème est détecté, aptitude reinstallcorrige le problème.

Jan
la source

Réponses:

47

De la debsumspage de manuel:

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

Je viens d'exécuter ceci sur mon système parce que le contenu du disque était corrompu de manière aléatoire alors que j'essayais avec un système d'exploitation bêta. Voici ce que j'ai fait (et cela semble avoir bien fonctionné):

Tout d'abord, j'ai installé 'debsums' et je l'ai lancé pour voir si j'avais des fichiers corrompus sur mon système:

$ 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

Comme vous pouvez le constater, j'ai cinq fichiers corrompus et je dois donc les réinstaller. Voici comment j'ai trouvé quels paquets contiennent les fichiers corrompus:

$ 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

Puis j'ai réparé la corruption en réinstallant les paquets endommagés:

$ 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) ...

Enfin, j'ai vérifié pour s'assurer qu'il ne restait aucun fichier corrompu:

$ sudo debsums -c

Il n'y a pas eu de sortie de cette commande, ce qui signifie qu'aucune erreur n'a été trouvée. :-)

Une dernière remarque: vous devriez également vérifier les fichiers de configuration de vos paquets pour vous assurer qu'ils sont corrects. Cela peut être plus difficile car les fichiers de configuration changent souvent et que les modifications sont légitimes. Vous devez donc inspecter manuellement chaque fichier de configuration modifié pour déterminer s'il est réellement corrompu. Voici comment obtenir une liste des fichiers de configuration modifiés:

$ 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)
PeniWize
la source
J'ai non seulement des fichiers corrompus, mais aussi des fichiers manquants. quand j'essaye de réinstaller avec apt-get it abandonne parce que dpkg donne l'erreur qu'un fichier est manquant (facepalm). Idem avec apt-get remove, erreur car le fichier est manquant.
Marc Jéronimus
Si vous avez plus de 1. Cela fonctionne aussi pour le fichier manquant. debsums -c | grep -P -o '/.*?\s' | xargs dpkg -S | cut -d : -f 1 | xargs apt-get install --reinstall
mikeytown2
11

Le script donné par PeniWize fonctionne très bien pour les fichiers corrompus, mais ne s’occupe pas des paquets contenant des fichiers manquants, car debsums les signale à stderr. Pour réinstaller les paquets avec les fichiers manquants, cela a fonctionné pour moi:

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 --
ajn
la source
3

La question a été répondue ailleurs:

Existe-t-il un contrôle de santé Ubuntu? : les paquets debsums peuvent calculer les hachages MD5 et les comparer au paquet deb.

Existe-t-il un moyen sûr de réinstaller via le gestionnaire de paquets : Oui, mais pas recommandé.

Jan
la source
Si votre réponse est essentiellement un renvoi à une autre question, il serait préférable de signaler cette question comme un doublon de l'autre. N'oubliez pas de voter pour la ou les réponses que vous avez trouvées utiles!
Melebius
-1

Utiliser le programme dpkg avec certains scripts Bash devrait vous permettre de le faire. Le seul inconvénient serait que quelqu'un remplace les versions "propres" des fichiers par des fichiers "malveillants". Pour cela, vous devez obtenir des sommes de contrôle MD5 valables à partir d’un paquet vierge. Quoi qu'il en soit, voici le code shell pour réaliser ce que vous voulez:

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

Le script n'imprimerait que si un fichier ou un répertoire défini dans le package était manquant. Vous devez également remplacer la variable "PACKAGE_NAME" par le package que vous souhaitez inspecter. J'espère que cela t'aides.

Justin Andrusk
la source
1
Je ne suis pas sûr que cela fonctionnerait dans tous les cas. Qu'est-ce que la dpkg -Lliste exactement? les déboires, comme on le dit ailleurs, semblent être une bonne alternative.
Jan