Znajdź (i zainstaluj ponownie) pakiety z uszkodzonymi plikami (bez niszczenia czegokolwiek)

35

Zwykle wolę naprawić system Linux niż zainstalować od nowa. Moje komputery widziały wiele aktualizacji dystrybucji i listę umów PPA lub repozytoriów stron trzecich. APT zwykle upewnia się, że wszystko działa w końcu. Jednak fakt, że menedżer pakietów myśli, że wszystkie wymagane pakiety są „zainstalowane”, nie gwarantuje, że wszystkie pliki są obecne w systemie plików.

Taka sytuacja może wystąpić, jeśli będziesz musiał obejść problemy dotyczące zależności dpkg --force-*. Można również odtworzyć taką sytuację, usuwając plik /usrjako root.

Czy istnieje prosty sposób sprawdzenia, czy wszystkie pliki należące do zainstalowanego pakietu są obecne?

Jeśli taki pakiet problemów zostanie znaleziony, aptitude reinstallrozwiązuje problem.

Jan
źródło

Odpowiedzi:

47

Ze strony podręcznika debsums:

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

Właśnie uruchomiłem to w moim systemie, ponieważ zawartość dysku została przypadkowo uszkodzona podczas eksperymentowania z wersją beta systemu operacyjnego. Oto, co zrobiłem (i wygląda na to, że działało dobrze):

Najpierw zainstalowałem „debsumy” i uruchomiłem go, aby sprawdzić, czy mam w systemie jakieś uszkodzone pliki:

$ 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

Jak widać, mam pięć uszkodzonych plików, więc muszę je ponownie zainstalować. W ten sposób znalazłem, które pakiety zawierają uszkodzone pliki:

$ 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

Następnie naprawiłem uszkodzenie, ponownie instalując uszkodzone pakiety:

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

Na koniec sprawdziłem, czy nie pozostały żadne uszkodzone pliki:

$ sudo debsums -c

Komenda nie otrzymała danych wyjściowych, co oznacza, że ​​nie znaleziono błędów. :-)

Ostatnia uwaga: powinieneś również sprawdzić pliki konfiguracyjne swoich pakietów, aby upewnić się, że są w porządku. Może to być trudniejsze, ponieważ pliki konfiguracyjne często się zmieniają, a zmiany są uzasadnione, więc musisz ręcznie sprawdzić każdy zmieniony plik konfiguracyjny, aby ustalić, czy rzeczywiście jest uszkodzony. Oto jak uzyskać listę zmienionych plików konfiguracyjnych:

$ 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
źródło
Mam nie tylko uszkodzone pliki, ale także brakujące pliki. gdy próbuję ponownie zainstalować za pomocą apt-get, przerywa się, ponieważ dpkg podaje błąd, że brakuje pliku (facepalm). To samo dotyczy apt-get remove, błąd, ponieważ brakuje pliku.
Mark Jeronimus
Jeśli masz więcej niż 1. To działa również w przypadku brakującego pliku. debsums -c | grep -P -o '/.*?\s' | xargs dpkg -S | cut -d : -f 1 | xargs apt-get install --reinstall
mikeytown2
11

Skrypt podany przez PeniWize działa świetnie w przypadku uszkodzonych plików, ale nie zajmuje się pakietami z brakującymi plikami, ponieważ debsums zgłasza je do stderr. Aby ponownie zainstalować pakiety z brakującymi plikami, działało to dla mnie:

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
źródło
3

Odpowiedzi na pytanie udzielono w innym miejscu:

Czy jest sprawdzian poczytalności Ubuntu? : pakiety sum mogą obliczać skróty MD5 i porównywać je z pakietem deb.

Czy istnieje bezpieczny sposób ponownej instalacji za pomocą menedżera pakietów : Tak, ale nie jest to zalecane.

Jan
źródło
Jeśli twoja odpowiedź jest zasadniczo odesłaniem do innego pytania, lepiej byłoby oflagować to pytanie jako duplikat drugiego. Nie zapomnij głosować na odpowiedzi, które uważasz za przydatne!
Melebius
-1

Korzystanie z programu dpkg i niektórych skryptów Bash powinno być w stanie to zrobić. Jedynym zastrzeżeniem byłoby, gdyby ktoś zastąpił „czyste” wersje plików „złośliwymi”. W tym celu musisz uzyskać prawidłowe sumy kontrolne MD5 z nieskazitelnego pakietu. Tak czy inaczej, oto kod powłoki, aby osiągnąć to, co chcesz:

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

Skrypt zostanie wydrukowany tylko wtedy, gdy brakuje pliku lub katalogu zdefiniowanego w pakiecie. Konieczne będzie także zastąpienie zmiennej „PACKAGE_NAME” pakietem, który chcesz sprawdzić. Mam nadzieję że to pomoże.

Justin Andrusk
źródło
1
Nie jestem pewien, czy to zadziała we wszystkich przypadkach. Co dpkg -Ldokładnie zawiera lista? debsums, na które odpowiedziano gdzie indziej, wygląda na dobrą alternatywę.
Jan