Переустановка пакетов с отсутствующими / поврежденными файлами

17

После нечистого выключения и красочного fsck пропала целая куча файлов. Вывод 'rpm -Va' - это несколько сотен строк (в основном пропускаются файлы, а также некоторые контрольные суммы и другие несоответствия). Есть ли простой способ переустановить пакеты, в которых отсутствуют и / или повреждены файлы?

Рассматриваемая ОС - Fedora 22.

Jaymmer - Восстановить Монику
источник
3
Конечно, возможно, но также довольно утомительно анализировать вывод и для каждого запроса файла пакет, который содержит этот файл и, вероятно, занимает некоторое время. Почему бы просто не переустановить все пакеты? yum reinstall $(rpm -qa --qf="%{N}-%{V}\n" | sort)
doktor5000
Также может быть довольно уродливо отфильтровывать все дополнительные проблемы, вызванные предварительной
связью
Я действительно закончил тем, что переустановил все - проблема была в том, что я забыл включить keep-cache для dnf, он закончил загрузкой более 2 ГБ пакетов (и я ограничил Интернет)
jaymmer - Восстановите Monica

Ответы:

16

Для справки и полноты, одна команда, которая сможет достичь того, о чем изначально просили, будет выглядеть примерно так (быстро возиться вместе, но она работает)

rpm -qf $(rpm -Va 2>&1 | grep -vE '^$|prelink:' | sed 's|.* /|/|') | sort -u

Вот краткое объяснение различных частей:

rpm -Va 2>&1

Будет выполнена полная проверка всех пакетов, установленных в настоящее время / перечисленных в базе данных rpm. Он также перенаправит stderr в stdout, так как здесь, на моем блоке, некоторые ошибки, вызванные включением предварительной ссылки, отображаются как ошибки, но мы хотим, чтобы они были в stdout.
Внимание: необходимо запустить от имени пользователя root, чтобы иметь возможность проверить все файлы, разрешения и владельца / группу.

grep -vE '^$|prelink:'

Подавляет вывод линий и пуста такого из Prelink ошибок (пример такой ошибки:
prelink: /tmp/#prelink#.B14JBi: Recorded 10 dependencies, now seeing -1)

sed 's|.* /|/|')

отфильтрует rpm -Vaвывод, чтобы показать только имена файлов

rpm -qf $()

запросит все полученные имена файлов, в которых они содержатся, и выведет имя и версию пакета

| sort -u

будет подавлять дубликаты комбинаций имя / версия пакета.

Всего вы получите список пакетов, которые не прошли проверку.

rpm -Vaможет по-прежнему показывать некоторые не связанные с этим проблемы, так как он также проверяет зависимости между пакетами, которые, возможно, придется подавлять путем добавления --nodeps.

doktor5000
источник
2

Недавно у меня была похожая проблема с отсутствующими файлами в openSUSE 13.2, и я исправил ее:

rpm -Va --nodeps --nodigest --noscripts --nosignature --nofiledigest --nosize --nomode --nordev --nouser --nogroup --nomtime\
| awk -e '($1=="missing") && ($2=="d") {system("rpm -qf "$3);}; ($1=="missing") && ($2!="d") && ($2!="c") {system("rpm -qf "$2);}'\
| sort -u | xargs zypper in -f

Опции для rpm и вызова awk в моем случае предназначены для экономии времени, потому что не было никакого искажения.

auxsvr
источник
1
Если не было никакого повреждения файла, вы могли бы даже добавить --nofilesи, следовательно, в основном сделать то же самое, yum check dependenciesпоскольку он будет только проверять все установленные пакеты rpm на наличие проблем с зависимостями. --nofilesсэкономит много времени для установки без SSD, но вы также пропустите проверку файлов, которые отсутствуют. ... просто ради полноты. И, пожалуйста, имейте в виду, что если вы grep для английских строк, вы можете использовать префикс LC_ALL=C;)
doktor5000