Ponowna instalacja wszystkich pakietów Debiana


19

Zabiłem przez pomyłkę proces dpkg działający w tle i chciałbym ponownie zainstalować wszystkie pakiety, aby upewnić się, że wszystko jest w porządku.

Najpierw próbowałem uzyskać listę wszystkich pakietów i zainstalować je ponownie

dpkg --get-selections | grep -v deinstall | awk '{print $1}' > list.log
apt-get install --reinstall $(cat list.log)

Ale są wiadomości takie jak:

E: Couldn't configure pre-depend debconf:i386 for console-setup:i386, probably a dependency cycle.

Próbowałem apt-get -f installbezskutecznie.

W ostateczności ponownie zainstalowałem wszystkie programy, które zawiodły w sumach kontrolnych:

dpkg -l | grep ^ii | awk '{ print $2 }' | xargs debsums -s -a

Co powinienem zrobić, aby wszystko ponownie zainstalować?

Edycja: problem rozwiązany. Problemem było coś innego (patrz komentarze). Rozumiem jednak, że należy tego unikać w Debianie.


1
Ostatnio miałem awarię podczas próby zainstalowania pakietu. Kiedy zrestartowałem komputer i próbowałem ponownie zainstalować ten pakiet, otrzymałem komunikat „E: dpkg zostało przerwane, musisz ręcznie uruchomić„ dpkg --configure -a ”, aby rozwiązać problem.” Uruchomienie tego polecenia spowodowało usunięcie wspomnianego pakietu i plików konfiguracyjnych. Byłem wtedy w stanie zainstalować pakiet od zera. Spróbuj uruchomić to polecenie.
— embedded.kyle

Nic nie zrobił, więc chyba nic się nie zepsuło. Spróbuję później sprawdzić, czy moje problemy ze sterownikami zostały rozwiązane.
— alex_reader

1
Ponowna instalacja wszystkich pakietów == naprawdę zły pomysł. (a) Prawie zawsze jest to niepotrzebne (b) prawdopodobnie zawiedzie (c) Jeśli twój system jest tak źle zepsuty, po prostu zainstaluj go ponownie. Napraw problemy, które faktycznie widzisz.
— Faheem Mitha,

Odpowiedzi:


9

Spróbuj tego, pamiętając, że go nie testowałem:

dpkg --get-selections > selections
sudo dpkg --clear-selections
sudo dpkg --set-selections < selections
sudo apt-get --reinstall dselect-upgrade

Źródła:


Mój problem był zupełnie inny: nie ładowałem poprawnego jądra (!). Zaakceptuję twoją odpowiedź, ponieważ wydaje się, że robi to, co chciałem (ale również nie przetestowano).
— alex_reader

To nie zadziała i całkowicie zepsuje system. Linia 3 odinstaluje apt, więc później nie będzie można ponownie zainstalować wszystkiego.
— rkjnsn

@rkjnsn: Zaktualizowałem odpowiedź, sprawdź, czy działa.
— Marco Sulla,

1
Próbując to zrobić, nic nie jest ponownie instalowane, chociaż plik selekcji jest zapełniony: pi @ prodpi ~ $ sudo apt-get --reinstall dselect-upgrade Czytanie list pakietów ... Gotowe Drzewo zależności budynku Odczytywanie informacji o stanie ... Gotowe 0 aktualizacja , 0 nowo zainstalowanych, 0 do usunięcia i 0 nieuaktualnionych. dowolny pomysł?
— andig

Jednym z powodów, dla których uważam, że twój kod nie będzie działał, jest to, że dpkg --get-selectionslista poleceń dezinstaluje również pakiety.
— Ortomala Lokni

2

Na wszelki wypadek spróbuj ponownie zainstalować każdy pakiet :

for i in $(cat list.log); do apt-get install --reinstall "$i"; done

Możesz również dodać odpowiedź tak do wszystkich pytań.


cat: list.log: Brak takiego pliku lub katalogu
— IgorGanapolsky 30.01.2017

2
@IgorGanapolsky Uruchom dpkg --get-selections > list.logpierwszy.
— QwertyChouskie

2
list.logpochodzi z pytania.
— Stephen Kitt,

2

W jednym z zasobów cytowanych przez Lucasa Malora znalazłem skrypt o nazwie populator, który wydaje się być blisko rozwiązania. Jeśli ustawisz zmienną wyboru pakietów na listę wszystkich swoich pakietów

PKGLIST=$(dpkg --get-selections | grep -v deinstall| cut -f1)

następnie możesz uruchomić skrypt i ponownie zainstalować wszystkie pakiety, ale system prawdopodobnie będzie miał pewne problemy. Lepiej najpierw przetestować na maszynie wirtualnej.

Oto wariant skryptu z linku powyżej:

#!/bin/bash
#
# Script to pre-populate apt-get proxy for faster later downloads.
# It uses apt-get and wget to pull all the specified packages.
#

# Make sure only root can run our script
if [[ $EUID -ne 0 ]]; then
   echo "You're not root, are you?" 1>&2
   exit 1
fi

# Specify wanted packages
PKGLIST="exaile" 

# Clears out the local repository of retrieved package files
apt-get clean

# Resynchronize the package index files from their sources
apt-get update

# Re-install specified packages at the newest version. 
apt-get install --reinstall $PKGLIST

Jeśli pojawi się błąd, że nie można ponownie zainstalować określonych pakietów, uruchom to polecenie, aby spróbować ponownie:

sudo apt-get -y autoremove

1

Spróbuj tego zamiast tego, ponieważ zajmie to wynik i sprawi, że będzie to jedna gigantyczna linia ze spacjami oddzielającymi nazwy plików.

dpkg --get-selections | grep -v deinstall | awk '{print $1}' > list.log awk '$1=$1' ORS=' ' list.log > newlist.log apt-get install --reinstall $(cat newlist.log)

Jedyną zmianą w oryginalnym poście jest dodanie drugiej instrukcji awk, która prawdopodobnie mogłaby zostać wykonana równolegle z pierwszą, aby utworzyć żądany plik.

Ta zmiana wymusi na apt-get poprawne ponowne pobranie pakietów i brakujących zależności, które nie zostały zainstalowane za pierwszym razem, i ponowne zainstalowanie ich w kolejności.

Jeśli zrobimy to inline, uważam, że wyglądałoby to tak:

dpkg --get-selections | grep -v deinstall | awk '{print $1}' | awk '$1=$1' ORS=' ' > list.log

A następnie upewnij się, że naprawdę masz system z poprawnymi pakietami (lub najnowszymi), wyczyść apt cache, zaktualizuj go, a następnie ponownie pobierz wszystkie pliki (możesz pominąć dwa pierwsze kroki, jeśli chcesz tylko to, co masz w pamięci podręcznej zainstalowany ponownie):

apt-get clean && apt-get update && apt-get install --reinstall $(cat list.log)

Miałem ponad 2k pakietów zainstalowanych w zaktualizowanym systemie z zawieszeniem się. Użycie dpkg --configure -a zakończyło instalację (była w końcowej fazie). Następnie uruchomiłem to, aby wszystko ponownie się poprawnie instalowało.

Lub jak podano na /superuser/298912/reinstall-debian-while-keeping-installed-packages-and-data :

sudo apt-get install --reinstall $(dpkg --get-selections | grep -w 'install$' | cut -f1)

Upewnij się, że najpierw uruchomisz program „init 2” przed ponowną instalacją, ponieważ niektóre składniki X lub ulubionego menedżera okien mogą nie lubić ponownej instalacji.


O ile nie zmodyfikowałeś IFS, $(cat file)niecytowany tokenizuje dowolne białe znaki i daje dokładnie taki sam wynik, niezależnie od tego, czy plik jest rozdzielany znakami nowej linii czy spacjami. --reinstallmoże pomóc, ale już wcześniej otrzymał dwa razy.
— dave_thompson_085

1

Podczas korzystania z Aptitude istnieje łatwy i szybki sposób:

sudo aptitude reinstall '~i'

która przeinstaluje wszystkie aktualnie zainstalowane pakiety.


-1

Podczas korzystania z RPM, w przypadku spowodowania uszkodzenia bazy danych pakietu, istnieje możliwość odbudowania tej bazy danych, dzięki czemu nie trzeba przeprowadzać ponownej instalacji. Jak zauważył jeden użytkownik tutaj, odbywa się to w Debianie przez dpkg --configure -a.


1
Rolą dpkg --configure -ajest skonfigurowanie wszystkich rozpakowanych i nieskonfigurowanych pakietów. Patrz strony człowiekiem dpkgi dpkg-reconfigure, a także debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html
— Ortomala Lokni
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.