Ponowna instalacja pakietów z brakującymi / uszkodzonymi plikami

17

Po nieczystym zamknięciu i kolorowym fsck zaginęła cała masa plików. Wyjście „rpm -Va” ma kilkaset wierszy (głównie brakujące pliki, ale także pewna suma kontrolna i inne niedopasowania). Czy istnieje prosty sposób na ponowną instalację pakietów z brakującymi i / lub uszkodzonymi plikami?

System operacyjny to Fedora 22.

jaymmer - Przywróć Monikę
źródło
3
Z pewnością możliwe, ale także dość żmudne analizowanie danych wyjściowych i dla każdego zapytania o plik pakiet zawierający ten plik i prawdopodobnie zajmuje to trochę czasu. Dlaczego nie po prostu ponownie zainstalować wszystkich pakietów? yum reinstall $(rpm -qa --qf="%{N}-%{V}\n" | sort)
doktor5000,
Filtrowanie wszystkich dodatkowych problemów spowodowanych przez link
wstępny
Naprawdę skończyło się to ponowną instalacją wszystkiego - problem polegał na tym, że zapomniałem włączyć pamięć podręczną dla dnf, skończyło się to pobraniem ponad 2 GB pakietów (i ograniczyłem internet)
jaymmer - Przywróć Monikę

Odpowiedzi:

16

Dla odniesienia i kompletności, jedno polecenie, które byłoby w stanie osiągnąć to, o co początkowo prosiło, byłoby coś takiego (szybko bawił się razem, ale działa)

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

Oto krótkie wyjaśnienie różnych części:

rpm -Va 2>&1

Przeprowadzi pełną weryfikację wszystkich pakietów aktualnie zainstalowanych / wymienionych w bazie danych rpm. Przekieruje również stderr na stdout, ponieważ tutaj na moim pudełku niektóre błędy, które są spowodowane włączeniem prelink, są zgłaszane jako błędy, ale chcemy je na stdout.
Uwaga: Musi działać jako root, aby móc sprawdzić wszystkie pliki, uprawnienia i właściciela / grupę.

grep -vE '^$|prelink:'

Pomija wyświetlanie od emtpy linii i tak z prelink błędów (przykład takiego błędu:
prelink: /tmp/#prelink#.B14JBi: Recorded 10 dependencies, now seeing -1)

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

przefiltruje dane rpm -Vawyjściowe, aby wyświetlić tylko nazwy plików

rpm -qf $()

wyśle ​​zapytanie o wszystkie uzyskane nazwy plików, w których pakiet jest zawarty, i wyświetli nazwę i wersję pakietu

| sort -u

usunie duplikaty kombinacji nazwa / wersja pakietu.

W sumie otrzymasz listę pakietów, których weryfikacja nie powiodła się.

rpm -Vamoże nadal wykazywać pewne niepowiązane ze sobą problemy, ponieważ sprawdza również zależności między pakietami, które mogą wymagać usunięcia przez dodanie --nodeps.

doktor5000
źródło
2

Niedawno miałem podobny problem z brakującymi plikami w openSUSE 13.2 i naprawiłem to za pomocą:

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

Opcje rpm i wywołanie awk mają w moim przypadku zaoszczędzić czas, ponieważ nie doszło do uszkodzenia.

auxsvr
źródło
1
Jeśli nie doszło do uszkodzenia pliku, możesz nawet dodać, --nofilesa zatem w zasadzie zrobić to samo, ponieważ yum check dependenciesbędzie on sprawdzał tylko wszystkie zainstalowane pakiety rpm pod kątem problemów z zależnościami. --nofileszaoszczędziłoby dużo czasu w przypadku instalacji innych niż SSD, ale można by również pominąć sprawdzanie brakujących plików. ... tylko ze względu na kompletność. I pamiętajcie, jeśli chcecie angielskich ciągów znaków, możecie chcieć LC_ALL=C
użyć