Encontre (e reinstale) pacotes com arquivos corrompidos (sem quebrar nada)

35

Normalmente, prefiro consertar um sistema Linux do que reinstalar do zero. Meus computadores viram muitas atualizações de distribuição e uma lista de PPAs ou repositórios de terceiros. O APT geralmente garante que tudo funcione no final. No entanto, o fato de o gerenciador de pacotes achar que todos os pacotes necessários estão 'instalados' não garante que todos os arquivos estejam presentes no sistema de arquivos.

Essa situação pode ocorrer se você precisar solucionar problemas de dependência dpkg --force-*. Pode-se também reproduzir essa situação excluindo um arquivo /usrcomo raiz.

Existe uma maneira simples de verificar se todos os arquivos pertencentes a um pacote instalado estão presentes?

Se um pacote desse tipo for encontrado, aptitude reinstallo problema será corrigido.

Jan
fonte

Respostas:

47

Na debsumspágina do manual:

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

Acabei de executar isso no meu sistema porque o conteúdo do disco foi corrompido aleatoriamente enquanto eu estava experimentando um sistema operacional beta. Aqui está o que eu fiz (e parece ter funcionado bem):

Primeiro, instalei 'debsums' e executei-o para verificar se havia arquivos corrompidos no meu 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 você pode ver, eu tenho cinco arquivos corrompidos, por isso preciso reinstalá-los. Foi assim que encontrei quais pacotes contêm os arquivos corrompidos:

$ 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

Em seguida, reparei a corrupção reinstalando os pacotes danificados:

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

Por fim, verifiquei para garantir que nenhum arquivo corrompido permaneça:

$ sudo debsums -c

Não houve saída deste comando, o que significa que nenhum erro foi encontrado. :-)

Uma observação final: você também deve verificar os arquivos de configuração dos seus pacotes para garantir que eles estejam OK. Isso pode ser mais difícil porque os arquivos de configuração geralmente mudam e as alterações são legítimas; portanto, você precisará inspecionar manualmente cada arquivo de configuração alterado para determinar se ele está realmente corrompido. É assim que você obtém uma lista de arquivos de configuração alterados:

$ 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
fonte
Eu não tenho apenas arquivos corrompidos, mas também arquivos ausentes. quando tento reinstalar com o apt-get ele aborta porque o dpkg dá erro de que um arquivo está ausente (facepalm). O mesmo ocorre com o apt-get remove, erro porque o arquivo está ausente.
Mark Jeronimus
Se você tiver mais de 1. Isso também funciona para o arquivo ausente. debsums -c | grep -P -o '/.*?\s' | xargs dpkg -S | cut -d : -f 1 | xargs apt-get install --reinstall
mikeytown2
11

O script fornecido pelo PeniWize funciona muito bem para arquivos corrompidos, mas não cuida de pacotes com arquivos ausentes, porque os debsums os reportam ao stderr. Para reinstalar pacotes com arquivos ausentes, funcionou para mim:

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

O uso do programa dpkg junto com alguns scripts do Bash deve permitir isso para você. A única ressalva seria se alguém substituísse versões "limpas" dos arquivos por versões "maliciosas". Para isso, você precisaria obter somas de verificação MD5 válidas de um pacote novo. De qualquer forma, aqui está o código do shell para alcançar o que você deseja:

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

O script seria impresso apenas se um arquivo ou diretório definido no pacote estivesse ausente. Além disso, você precisaria substituir a variável 'PACKAGE_NAME' pelo pacote que você deseja inspecionar. Espero que isto ajude.

Justin Andrusk
fonte
1
Não tenho certeza se isso funcionaria em todos os casos. O que dpkg -Llista exatamente? debsums, como respondido em outros lugares, parece uma boa alternativa.
Jan