Finden (und erneut installieren) von Paketen mit beschädigten Dateien (ohne irgendetwas zu beschädigen)


35

Normalerweise ziehe ich es vor, ein Linux-System zu reparieren, als es von Grund auf neu zu installieren. Auf meinen Computern wurden viele Distributions-Upgrades und eine Liste von PPAs oder Repositorys von Drittanbietern durchgeführt. APT stellt normalerweise sicher, dass am Ende alles funktioniert. Die Tatsache, dass der Paketmanager der Ansicht ist, dass alle erforderlichen Pakete installiert sind, garantiert jedoch nicht, dass alle Dateien auf dem Dateisystem vorhanden sind.

Solch eine Situation kann auftreten, wenn Sie mit Abhängigkeitsproblemen umgehen müssen dpkg --force-*. Man kann eine solche Situation auch reproduzieren, indem man eine Datei /usrals root löscht .

Gibt es eine einfache Möglichkeit, um zu überprüfen, ob alle zu einem installierten Paket gehörenden Dateien vorhanden sind?

Wenn ein solches Problempaket gefunden wird, wird aptitude reinstalldas Problem behoben.

Antworten:


47

Von der debsumsManpage:

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

Ich habe dies gerade auf meinem System ausgeführt, weil der Festplatteninhalt zufällig beschädigt wurde, während ich mit einem Beta-Betriebssystem experimentierte. Folgendes habe ich getan (und es scheint gut funktioniert zu haben):

Zuerst habe ich 'debsums' installiert und ausgeführt, um festzustellen, ob auf meinem System beschädigte Dateien vorhanden sind:

$ 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

Wie Sie sehen, habe ich fünf beschädigte Dateien, die ich neu installieren muss. So habe ich herausgefunden, welche Pakete die beschädigten Dateien enthalten:

$ 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

Dann habe ich die Beschädigung durch Neuinstallation der beschädigten Pakete behoben:

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

Abschließend habe ich überprüft, ob keine beschädigten Dateien vorhanden sind:

$ sudo debsums -c

Es wurde keine Ausgabe von diesem Befehl ausgegeben, was bedeutet, dass keine Fehler gefunden wurden. :-)

Ein letzter Hinweis: Sie sollten auch die Konfigurationsdateien Ihrer Pakete überprüfen, um sicherzustellen, dass sie in Ordnung sind. Dies kann schwieriger sein, da sich Konfigurationsdateien häufig ändern und die Änderungen legitim sind. Sie müssen daher jede geänderte Konfigurationsdatei manuell überprüfen, um festzustellen, ob sie tatsächlich beschädigt ist oder nicht. So erhalten Sie eine Liste der geänderten Konfigurationsdateien:

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

Ich habe nicht nur beschädigte, sondern auch fehlende Dateien. wenn ich versuche, mit apt-get neu zu installieren, bricht es ab, weil dpkg eine Fehlermeldung ausgibt, dass eine Datei fehlt (facepalm). Gleiches gilt für apt-get remove, Fehler, da die Datei fehlt.
Mark Jeronimus

Wenn Sie mehr als 1 haben. Dies funktioniert auch für die fehlende Datei. debsums -c | grep -P -o '/.*?\s' | xargs dpkg -S | cut -d : -f 1 | xargs apt-get install --reinstall
mikeytown2

11

Das von PeniWize bereitgestellte Skript eignet sich hervorragend für beschädigte Dateien, kümmert sich jedoch nicht um Pakete mit fehlenden Dateien, da debsums diese an stderr meldet. So installieren Sie Pakete mit fehlenden Dateien neu:

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

Die Frage wurde an anderer Stelle beantwortet:

Gibt es eine Ubuntu-Überprüfung? : package debsums kann MD5-Hashes berechnen und mit dem deb-Paket vergleichen.

Gibt es eine sichere Möglichkeit zur Neuinstallation über den Paketmanager : Ja, aber nicht empfohlen.


Wenn Ihre Antwort im Wesentlichen eine Verweisung auf eine andere Frage ist, wäre es besser, Flagge diese Frage als Duplikat des anderen. Vergiss nicht, dort für die Antwort (en) zu stimmen, die du nützlich fandest!
Melebius

-1

Wenn Sie das Programm dpkg zusammen mit einigen Bash-Skripten verwenden, sollte dies für Sie möglich sein. Die einzige Einschränkung wäre, wenn jemand "saubere" Versionen der Dateien durch "böswillige" ersetzen würde. Dafür müssten Sie gültige MD5-Prüfsummen aus einem unberührten Paket erhalten. Wie auch immer, hier ist der Shell-Code, um das zu erreichen, was Sie wollen:

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

Das Skript wird nur gedruckt, wenn eine im Paket definierte Datei oder ein Verzeichnis fehlt. Außerdem müssten Sie die Variable 'PACKAGE_NAME' durch das Paket ersetzen, das Sie untersuchen möchten. Hoffe das hilft.


1
Ich bin mir nicht sicher, ob dies in allen Fällen funktionieren würde. Was heißt dpkg -Lgenau auflisten? debsums wie anderswo beantwortet sieht aus wie eine gute alternative.
Jan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.