Encuentra (y reinstala) paquetes con archivos corruptos (sin romper nada)

35

Por lo general, prefiero arreglar un sistema Linux que reinstalar desde cero. Mis computadoras han visto muchas actualizaciones de distribución y una lista de PPA o repositorios de terceros. APT generalmente se asegura de que todo funcione al final. Sin embargo, el hecho de que el administrador de paquetes piense que todos los paquetes necesarios están 'instalados' no garantiza que todos los archivos estén presentes en el sistema de archivos.

Tal situación puede ocurrir si tiene que solucionar problemas de dependencia dpkg --force-*. También se podría reproducir tal situación eliminando un archivo /usrcomo root.

¿Hay una manera simple de verificar si todos los archivos que pertenecen a un paquete instalado están presentes?

Si se encuentra un paquete de este tipo de problemas, aptitude reinstallcorrige el problema.

ene
fuente

Respuestas:

47

Desde la debsumspágina del manual:

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

Acabo de ejecutar esto en mi sistema porque el contenido del disco se corrompió aleatoriamente mientras estaba experimentando con un sistema operativo beta. Esto es lo que hice (y parece que funcionó bien):

Primero, instalé 'debsums' y lo ejecuté para ver si tenía archivos corruptos en mi 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

Como puede ver, tengo cinco archivos corruptos, así que necesito reinstalarlos. Así es como encontré qué paquetes contienen los archivos corruptos:

$ 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

Luego reparé la corrupción reinstalando los paquetes dañados:

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

Finalmente, verifiqué para asegurarme de que no queden archivos corruptos:

$ sudo debsums -c

No hubo salida de este comando, lo que significa que no se encontraron errores. :-)

Una nota final: también debe verificar los archivos de configuración de sus paquetes para asegurarse de que estén bien. Esto puede ser más difícil porque los archivos de configuración a menudo cambian y los cambios son legítimos, por lo que deberá inspeccionar manualmente cada archivo de configuración modificado para determinar si realmente está dañado o no. Así es como obtienes una lista de archivos de configuración modificados:

$ 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
fuente
No solo he dañado los archivos, sino también los archivos que faltan. cuando trato de reinstalar con apt-get se anula porque dpkg da un error de que falta un archivo (facepalm). Lo mismo con apt-get remove, error porque falta el archivo.
Mark Jeronimus
Si tiene más de 1. Esto también funciona para el archivo faltante. debsums -c | grep -P -o '/.*?\s' | xargs dpkg -S | cut -d : -f 1 | xargs apt-get install --reinstall
mikeytown2
11

El script proporcionado por PeniWize funciona muy bien para archivos corruptos, pero no se ocupa de los paquetes con archivos faltantes, porque debsums los informa a stderr. Para reinstalar paquetes con archivos faltantes, esto funcionó para mí:

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
fuente
-1

El uso del programa dpkg junto con algunas secuencias de comandos Bash debería poder hacerlo por usted. La única advertencia sería si alguien reemplaza las versiones "limpias" de los archivos con versiones "maliciosas". Para eso, necesitaría obtener sumas de verificación MD5 válidas de un paquete original. De todos modos, aquí está el código de shell para lograr lo que quieres:

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

El script solo se imprimirá si falta un archivo o directorio que se definió en el paquete. También deberá reemplazar la variable 'PACKAGE_NAME' con el paquete que desea inspeccionar. Espero que esto ayude.

Justin Andrusk
fuente
1
No estoy seguro de si esto funcionaría en todos los casos. ¿Qué dpkg -Lenumera exactamente? debsums como se respondió en otra parte parece una buena alternativa.
Jan