Найти (и переустановить) пакеты с поврежденными файлами (ничего не нарушая)

35

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

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

Есть ли простой способ проверить, все ли файлы принадлежат установленному пакету?

Если такой проблемный пакет найден, 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)
PeniWize
источник
У меня есть не только поврежденные файлы, но и отсутствующие файлы. когда я пытаюсь переустановить с помощью apt-get, он прерывается, потому что 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 --
AJN
источник
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именно список? Дебсум, как ответили в другом месте, выглядит хорошей альтернативой.
января