Ubuntu – Find (and reinstall) packages with corrupted files (without breaking anything)

aptdpkgpackage-managementsystem

I usually prefer to fix a Linux system than to reinstall from scratch. My computers have seen many distribution upgrades and a list of PPAs or third-party repositories. APT usually makes sure that everything works in the end. However, the fact that the package manager thinks that all required packages are 'installed' does not guarantee that all the files are present on the file system.

Such a such situation may occur if you have to work-around dependency problems with dpkg --force-*. One could also reproduce such a situation by deleting a file from /usr as root.

Is there a simple way to verify whether all files belonging to an installed package are present?

If a such a problem package is found, aptitude reinstall fixes the problem.

Best Answer

  • From the debsums man page:

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

    I just ran this on my system because the disk content was randomly corrupted while I was experimenting with a beta OS. Here's what I did (and it seems to have worked well):

    First, I installed 'debsums' and ran it to see if I had any corrupt files on my system:

    $ 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
    

    As you can see, I have five corrupt files so I need to reinstall them. This is how I found which packages contain the corrupt files:

    $ 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
    

    Then I repaired the corruption by reinstalling the damaged packages:

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

    Finally, I checked to make sure that no corrupt files remain:

    $ sudo debsums -c
    

    There was no output from this command, which means that no errors were found. :-)

    One final note: you should also check your packages' config files to make sure they're OK. This can be more difficult because config files often change, and the changes are legitimate, so you'll need to manually inspect each changed config file to determine whether or not it's actually corrupt. This is how you get a list of changed config files:

    $ 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)
    
  • Related Question