Перевстановлення пакетів з відсутніми / пошкодженими файлами


17

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

Розглянута ОС - Fedora 22.


3
Безумовно, але також досить втомливо проаналізувати вихідний результат і для кожного файлу запитати пакет, який містить цей файл, і, ймовірно, потребує певного часу. Чому б просто не перевстановити всі пакети? yum reinstall $(rpm -qa --qf="%{N}-%{V}\n" | sort)
doktor5000

Також може бути досить неприємно відфільтрувати всі додаткові проблеми, викликані попереднім посиланням, якщо я не помиляюсь, що все-таки увімкнено Fedora за замовчуванням відповідно до fedorahosted.org/fesco/ticket/1183
doktor5000

Я дійсно закінчила перевстановлення всього - проблема полягала в тому, що я забув включити Keep-кеш для dnf, і в кінцевому підсумку завантажив понад 2 Гб пакетів (і я обмежив Інтернет)
jaymmer - Поновіть Моніку

Відповіді:


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.


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 мають на меті заощадити час у моєму випадку, оскільки жодної корупції не сталося.


1
Якщо файлу не було, ви можете навіть додати, --nofilesа отже, зробити те саме, yum check dependenciesщо він перевірить лише всі встановлені пакети rpm на наявність залежностей. --nofilesце дозволить заощадити багато часу для встановлення без SSD, але ви також пропустите чек на відсутні файли. ... просто заради повноти. І будь ласка, майте на увазі, якщо ви жартуєте за англійські струни, ви можете скористатися префіксом LC_ALL=C;)
doktor5000
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.