Jak odtworzyć / var / lib / dpkg / status?

10

Usunąłem niektóre pliki /var/lib/dpkg/, a mianowicie:

/var/lib/dpkg/status
/var/lib/dpkg/available
/var/lib/dpkg/info/*

Rozumiem, że Debian używa tych plików do przechowywania niektórych informacji o zainstalowanych pakietach. Teraz, gdy to zrobię apt-get update, pojawia się następujący błąd:

Reading package lists... Error!
E: Could not open file /var/lib/dpkg/status - open 
(2: No such file or directory)
E: The package lists or status file could not be parsed or opened.

Jak rozumiem FHS , pliki w nim zlokalizowane /varnie powinny mieć krytycznego znaczenia dla systemu. W dalszej kolejności powinny to być pliki tymczasowe, dzienniki, pamięci podręczne i tym podobne.

Czy istnieje zatem sposób na odtworzenie usuniętych plików?

Martin Vegter
źródło
1
Odpowiedź Braiam odzyska plik statusu; ale rzeczy, które usunąłeś, /var/lib/dpkg/infosą również dość ważne. Źle zrozumiałeś FHS i AFAIK jedynymi ścieżkami odzyskiwania są (a) przywrócenie z kopii zapasowej lub (b) ponowna instalacja.
derobert

Odpowiedzi:

13

Jeśli spojrzysz na cel / var podany w Hierarchii Standardów Systemu Plików , powie:

/varzawiera zmienne pliki danych. Obejmuje to katalogi i pliki buforowania, dane administracyjne i rejestrujące oraz pliki przejściowe i tymczasowe.

Pamiętaj, że pliki „przejściowe i tymczasowe” to tylko jedna z rzeczy, które zawiera. Zawiera także „katalogi i pliki buforowania” oraz „dane administracyjne i rejestrujące”. Usunąłeś krytyczne „dane administracyjne”.

Następnie wyjaśnia, dlaczego /varistnieje:

/varjest tutaj podany, aby umożliwić montaż /usrtylko do odczytu. Wszystko, co kiedyś się w /usrto zapisało, jest zapisywane podczas działania systemu (w przeciwieństwie do instalacji i konserwacji oprogramowania) musi się znajdować /var.

To jest najważniejsze /var: zmiany w nim danych, w przeciwieństwie do /usr(które zmieniają się tylko po dodaniu / usunięciu / aktualizacji oprogramowania).

Dalsze sekcje wyjaśniają różne podkatalogi /var; na przykład /var/lib(gdzie pliki, które usunąłeś, były obecne) zawierają „informacje o stanie dotyczące aplikacji lub systemu”, zdefiniowane jako „dane, które programy modyfikują podczas działania i które dotyczą jednego określonego hosta”.

Ty naprawdę nie należy usuwać pliki, nie wiedząc, co jest specyficzne dla pliku. Z plikami usunięte, chyba że masz kopię zapasową tych plików, myślę, że jedyną rzeczą do zrobienia jest zrobić kopię zapasową /home, /etcitd. I ponownie zainstalować. Dopóki tego nie zrobisz, nie będziesz mógł używać dpkg(i APT itp.). Poza tym system powinien nadal działać.

derobert
źródło
Czy mogę skopiować pliki z innego komputera, czy są one specyficzne dla danego komputera?
Martin Vegter
1
Status @MartinVegter wyświetla listę pakietów zainstalowanych na tym konkretnym komputerze. Możesz skopiować go z komputera z dokładnie tymi samymi stanami pakietów (nie tylko zainstalowany, ale także usunięty, ale nie wyczyszczony). apt-get updateodbuduje dostępne, jak sądzę. Informacje / rzeczy pochodzą z każdego zainstalowanego pakietu, ale także odzwierciedlają historię, przynajmniej w przypadku starych plików conf ... ale prawdopodobnie można uniknąć kopiowania z tego samego komputera z pakietami)
derobert
Obecna dokumentacja deklaruje „ /var/libInformacje o stanie. Trwałe dane modyfikowane przez uruchamiane programy, np. Bazy danych, metadane systemu pakowania itp.”
Mikko Rantalainen,
8

Nie można „odtworzyć” /var/lib/dpkg/statusw tym sensie, że wystarczy uruchomić polecenie, a plik pojawia się magicznie. Nie. Musisz użyć kopii zapasowej pliku i nauczyć się, jak nie usuwać elementów /var/libkatalogu:

sudo cp /var/lib/dpkg/status-old /var/lib/dpkg/status

To da ci status paczki z dnia poprzedniego. Zacznijcie modlić się, żeby nie złamało to nic innego.

Braiam
źródło
zobacz także /var/backups, istnieje wiele kopii.
derobert
@Braiam - nie mam starego statusu ani nic w / var / backups. Czy mogę skopiować pliki z innego komputera, czy są one specyficzne dla danego komputera?
Martin Vegter
1
@MartinVegter nie, to nie zadziała. Najszybszym sposobem jest utworzenie kopii zapasowych ważnych plików i ponowna instalacja systemu. BTW, nawet nie /var/backups/dpkg.status.0?
Braiam
8

Pliki znajdujące się w /varsą bardzo krytyczne dla systemu. Na przykład, /var/mailczy /var/spool/mailzawiera e-mail użytkowników; nie usunąłbyś tego więcej niż rozpaliłbyś ogień w skrzynce pocztowej sąsiada. Są to tylko pliki w niektórych podkatalogach, /varktóre zawierają pliki, które są mniej lub bardziej przejściowe: pliki dziennika /var/log, pamięci podręczne, które zwykle można odtworzyć /var/cache, pliki tymczasowe (których nie należy usuwać, gdy są używane!) /var/tmp.

Dane wejściowe /var/libmogą być dość krytyczne. Na przykład MySQL jest zwykle skonfigurowany do /var/lib/mysqldomyślnego przechowywania baz danych : jeśli go usuniesz, wyczyścisz bazy danych. Dpkg również umieszcza własne bazy danych /var/lib; /var/lib/dpkg/statusjest jeden.

/var/lib/dpkg/statuszawiera informacje o zainstalowanych pakietach. Jeśli to wyczyściłeś, powinieneś przywrócić go z kopii zapasowej. Jeśli twoja kopia zapasowa nie jest w pełni aktualna, sprawdź dzienniki ostatnich manipulacji pakietami pod /var/log/apti wewnątrz /var/log/dpkg.log. Najpierw musisz utworzyć ten plik dpkg.

/var/lib/dpkg/availablejest zbudowany z danych pobranych z Internetu. apt-get updatepowinien go odbudować.

/var/lib/dpkg/infozawiera pliki dostarczane z pakietami Debiana. Możesz przywrócić te pliki po prostu ponownie instalując pakiety. Oczywiście potrzebujesz do tego listy zainstalowanych pakietów. Po przywróceniu /var/lib/dpkg/statusmożesz wyodrębnić stamtąd listę pakietów.

apt-get install --reinstall $(</var/lib/dpkg/status sed -n 's/^Package://p')

Jeśli się zgubiłeś /var/lib/dpkg/status, możesz być w stanie odtworzyć go, tworząc pusty plik, a następnie uruchamiając go apt-get install --reinstallna liście pakietów. Jednym z miejsc, w których zapisywana jest również lista pakietów, jest to /var/lib/apt/extended_states, przynajmniej jeśli kiedykolwiek używałeś APT do instalowania pakietów (w przeciwieństwie do dpkgbezpośredniego) - użyj tego pliku zamiast /var/lib/dpkg/statusint powyższej komendy. Jeśli to również usunąłeś, możesz odbudować przybliżoną listę pakietów $(cd /usr/share/doc && ls), ponieważ większość pakietów tworzy wpis w /usr/share/doc. Jest chyba kilka wyjątków.

Nie proś o pomoc dotyczącą zarządzania pakietami w tym systemie. Odzyskiwanie po usunięciu plików krytycznych dla systemu nie jest nauką ścisłą. Jeśli nie można przywrócić z kopii zapasowych, należy jak najszybciej zainstalować nowy, czysty system.

Gilles „SO- przestań być zły”
źródło
Powiedziałbym, że można poprosić o pomoc dotyczącą pakietów w takim systemie, o ile zaczniesz od opisu problemu historycznego i sposobu jego rozwiązania . Czasami naprawa takich systemów może pozwolić na zauważenie np. Luk w zabezpieczeniach w niektórych procesach zarządzania pakietami i może być cenna, mimo że radzenie sobie z takim systemem może być trudne.
Mikko Rantalainen
5

/var/lib/dpkg/availableMogą być odtworzone z danych apt. Najłatwiejszy sposób, w jaki to zrobiłem, to użycie dselecti wybranie aktualizacji. Spodziewam się, że to zadziała tylko, jeśli wybrałeś jako metodę aktualizacji. Wydaje się, dselectże:

/bin/bash /usr/lib/dpkg/methods/apt/update /var/lib/dpkg apt apt

Zauważ jednak, że rzeczy mogły się zmienić od czasu Debiana sarge.

Istnieją sztuczki do odtworzenia w /var/lib/dpkg/statusoparciu o fakt, że każdy pakiet jest wymagany, aby dodać katalog do /usr/share/dockatalogu. Zobacz post na http://linuxmafia.com/faq/Debian/package-database-rebuild.html . Przedstawiono skrypt, który używa przefiltrowanej listy / usr / share / doc do utworzenia listy zainstalowanych pakietów, a następnie ponownie je wszystkie instaluje.

Chris Gibson
źródło
1

Przypuszczam, że możesz odtworzyć plik pusty, a następnie zrobić apt-get install długą listę, zakładając, że wiesz, co zainstalowałeś po raz pierwszy.

Mam starożytny skrypt, który robi to w zasadzie z najmniejszego zestawu pakietów, które można uruchomić apt-get. Podczas korzystania z niego ostatecznie zgłosiłem dziesiątki niezadeklarowanych zależności.

Jeśli nie wiesz wszystkiego, co zainstalowałeś, zainstaluj ponownie system.

Jozuego
źródło
0

W Linux Mint 17 napotkałem podobny problem z brzmieniem. Usunąłem pliki i znalazłem się w sytuacji, w której „Administracja -> Menedżer aktualizacji” po prostu nie wyglądał na szczęśliwego .......

Rozwiązaniem, które działało dla mnie, było utworzenie katalogu o nazwie „dpkg” zgodnie z komunikatem o błędzie i utworzenie w nim pustego pliku o nazwie „status”.

Następnie uruchomiłem Menedżera aktualizacji.

To zadziałało dla mnie :-)

Bluegerbil
źródło
0

Jeśli masz inne konta użytkowników niż „roo”, możesz spróbować apt-get dist-upgrade z jednego z nich. Apt pobierze archiwa, ale opóźni się przy instalacji z powodu niektórych brakujących katalogów w / var /. Katalogi zostaną wyświetlone. utwórz je i uruchom ponownie apt-get dist-upgrade. incase ich utworzenie kończy się niepowodzeniem z alternatywnego dziennika konta z powrotem do katalogu głównego n stwórz katalog stamtąd, a następnie uruchom ponownie apt. zostaniesz zapytany o konfigurację logrotate i kilka innych konfiguracji po prostu wpisz Y n kontynuuj do końca, a następnie uruchom ponownie po zakończeniu apt dist-upgrade. wszystko powinno teraz wrócić do normy.

Jeden
źródło
0

Przepraszam za opóźnienie. Briam, ręcznie utwórz katalogi i pliki ręcznie, a następnie zaktualizuj repozytorium ( mkdiri touchzgodnie z wymaganiami wyświetlanego błędu) i użyj dpkg --configure -a.

Twój system działałby dobrze, ale ważne jest, aby zainstalować ponownie, aby upewnić się, że nie jest uszkodzony; poprzedni to tylko czas, aby zaplanować ponowną instalację ... i zająć się usuwaniem /var/lib/*plików.

Daniel Ospitia
źródło
-2

Jeśli kupiłeś Raspberry Pi 3 i napotkałeś problem i pojawił się błąd „nie można otworzyć pliku / var / lib / dpkg / status przeanalizowanego lub otwartego” to jest obejście, które zadziałało dla mnie:

Jak odtworzyć plik „/ var / lib / dpkg / status”? Tylko dlatego, że nie jest to niepotrzebny plik, jest to bardzo ważny plik, który przechowuje pewne informacje o zainstalowanych pakietach w twoim systemie operacyjnym Raspbian, więc oto jak odtworzyłem :

  1. Wykonaj wget w swoim systemie Raspbian:

    wget http://www.doglabscs.com/recover1.sh
    
  2. Przyznaj uprawnienia:

    chmod 777 recover1.sh
    
  3. Przeanalizuj folder dokumentacji w systemie i ponownie wygeneruj plik statusu:

    ./recover1.sh
    
  4. po zakończeniu pobierz plik i przeczytaj uważnie. Postępuj zgodnie z instrukcjami opisanymi w pliku:

    wget http://www.doglabscs.com/recover2.txt
    cat recover2.txt
    
Dog Labs Corporation
źródło
Cześć! Opublikuj kod jako część swoich odpowiedzi, a nie jako linki.
dhag
Ostrzeżenie: recover1.shzniszczy Twój prąd /var/lib/dpkg/statusbez testowania, jeśli jest już w porządku. Następnie wykona mieszany zestaw sztuczek, aby spróbować odbudować nieco działającą wersję. Nigdy nie uruchamiaj powyższego skryptu, chyba że całkowicie brakuje Ci pliku / var / lib / dpkg / status. W przeciwnym razie strings /var/lib/dpkg/statusmoże być lepszym sposobem na rozpoczęcie odbudowywania uszkodzonego pliku.
Mikko Rantalainen