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.

alex_reader
źródło
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:

Marco Sulla
źródło
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ń.

Tchórz
źródło
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
Ortomala Lokni
źródło
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.

Anonimowy Tchórz
źródło
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.

Goetzc
źródło
-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.

mdpc
źródło
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