Знайдіть (і перевстановіть) пакети із пошкодженими файлами (не порушуючи нічого)


35

Зазвичай я вважаю за краще виправити систему Linux, ніж перевстановити з нуля. Мої комп'ютери побачили багато оновлень дистрибуції та список PPA або сторонніх сховищ. APT зазвичай гарантує, що все працює в підсумку. Однак той факт, що менеджер пакунків вважає, що всі необхідні пакети «встановлені», не гарантує наявності всіх файлів у файловій системі.

Така така ситуація може виникнути, якщо вам доведеться подолати проблеми залежності dpkg --force-*. Можна також відтворити таку ситуацію, видаливши файл із /usrroot.

Чи існує простий спосіб перевірити наявність усіх файлів, що належать до встановленого пакету?

Якщо такий пакет проблем виявлено, aptitude reinstallусуває проблему.

Відповіді:


47

На debsumsчоловіковій сторінці:

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

Я просто запустив це в своїй системі, оскільки вміст диска був випадковим чином пошкоджений, коли я експериментував з бета-ОС. Ось що я зробив (і, здається, добре працював):

По-перше, я встановив "debsums" і запустив його, щоб побачити, чи є у мене пошкоджені файли в моїй системі:

$ 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

Як бачите, у мене є п'ять пошкоджених файлів, тому мені потрібно перевстановити їх. Ось як я виявив, які пакунки містять пошкоджені файли:

$ 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

Тоді я усунув корупцію, перевстановивши пошкоджені пакети:

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

Нарешті я перевірив, чи не залишилося пошкоджених файлів:

$ sudo debsums -c

Вихід з цієї команди не було, а це означає, що помилок не знайдено. :-)

Останнє зауваження: ви також повинні перевірити конфігураційні файли ваших пакетів, щоб переконатися, що вони добре. Це може бути складніше, оскільки конфігураційні файли часто змінюються, а зміни є законними, тому вам потрібно буде вручну перевірити кожен змінений конфігураційний файл, щоб визначити, чи є він справді пошкодженим. Ось як ви отримуєте список змінених конфігураційних файлів:

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

У мене не тільки пошкоджені файли, але й відсутні файли. коли я намагаюся перевстановити apt-get it aborts, оскільки dpkg дає помилку, що файл відсутній (facepalm). Те саме з apt-get remove, помилка, оскільки файл відсутній.
Марк Єронімус

Якщо у вас більше 1. Це працює і для відсутнього файлу. debsums -c | grep -P -o '/.*?\s' | xargs dpkg -S | cut -d : -f 1 | xargs apt-get install --reinstall
mikeytown2

11

Сценарій, наданий PeniWize, чудово підходить для пошкоджених файлів, але не піклується про пакети з відсутніми файлами, оскільки debsums повідомляє їх про stderr. Щоб перевстановити пакети з відсутніми файлами, це працювало для мене:

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

На питання відповіли в іншому місці:

Чи є перевірка стану здоров’я Ubuntu? : пакунки debsums можуть обчислити хеші MD5 і порівняти з пакетом deb.

Чи є безпечний спосіб перевстановити через менеджер пакунків : Так, але не рекомендується.


Якщо ваша відповідь по суті є направленням на інше питання, було б краще позначити це питання як дублікат іншого. Не забудьте проголосувати за відповіді, які ви вважаєте корисними!
Мелебій

-1

Використання програми dpkg разом із деякими сценаріями Bash повинно це зробити для вас. Єдине застереження було б, якщо хтось замінить "чисті" версії файлів на "шкідливі". Для цього вам потрібно отримати дійсні контрольні суми MD5 з незайманої упаковки. У будь-якому випадку, ось код оболонки, щоб досягти того, що ви хочете:

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

Сценарій роздруковується лише в тому випадку, якщо файл або каталог, визначені в пакеті, відсутні. Також вам потрібно буде замінити змінну "PACKAGE_NAME" на пакет, який ви хочете перевірити. Сподіваюся, це допомагає.


1
Я не впевнений, чи спрацювало б це у всіх випадках. Що dpkg -Lсаме списку? дебсули, як відповіли в інших місцях, виглядають як хороша альтернатива.
січня
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.