Jak odbudować uszkodzony plik statusu dpkg?

26

Za każdym razem, gdy piszę, sudo apt-get removea następnie wciskam Tabklawisz autouzupełniania, pojawia się następujący komunikat:

grep-status: /var/lib/dpkg/status:15945: expected a colon
.

W pliku statusu nie widzę nic szczególnie dziwnego w linii 15945. Jest to kropka w polu opisu pakietu biblioteki mono, a wstawienie dwukropka nie pomogło. Usunięcie linii zawierającej kropkę również nie działało. Nadpisanie pliku starym statusem spowodowało wyświetlenie tego samego komunikatu.

Czy istnieje jakiś sposób na odbudowanie pliku statusu?

Ramón
źródło
3
Nie sądzę, aby można było w pełni odbudować statusplik: jest to podstawowe źródło informacji i chociaż wiele z nich jest zbędnych, nie wszystkie z nich są. Jednak prawdopodobnie możliwe jest ręczne naprawienie pliku. Opublikuj fragment pliku wokół problematycznej linii, powiedzmy 20–40 linii, w tym co najmniej jedną Package:linię przed i po linii 15945.
Gilles „SO- przestań być zły”
Od tamtej pory próbowałem odinstalować mono, ale wszystko, co zrobiłem, to zmiana numeru linii, który jest zgłaszany jako błąd. Jeśli podążysz za linkiem wklej, obrażający numer linii to 25, „Sekcja: python” paste.ubuntu.com/501929
Ramón
@ Ramón Więc apt-get, dpkgi przyjaciele nadal działać poprawnie, a co erroring out jest autouzupełnianie?
Riccardo Murri
Poprawny. Wygląda na to, że występują problemy tylko z analizą pliku statusu podczas korzystania z automatycznego uzupełniania. W przeciwnym razie mogę instalować i usuwać pakiety bez widocznych błędów.
Ramón
Uzyskanie tego samego problemu. Nie sądzę, aby ślepe korzystanie ze starej wersji bazy danych apt było właściwą rzeczą, niezależnie od tego, czy naprawia ten problem.
Oli

Odpowiedzi:

7

W końcu naprawiłem swój system tego. Przywracanie kopii zapasowej pliku stanu nie działało, ponieważ miałem problem od tak dawna, jest on we wszystkich moich kopiach zapasowych.

Poprawka obejmuje grepowanie dla faktycznych przerw formatowania i naprawianie ich ręcznie. To nie jest tak trudne, jak się wydaje.

http://thepcspy.com/read/fixing-dpkg-status-corruption/

Oli
źródło
Cieszę się, że znalazłeś rozwiązanie, Oli i dziękuję za udostępnienie. W moim przypadku, oprócz problematycznego debetu Lexmarka, również debet Webmina miał zniekształcony opis, ale w tym przypadku nie spowodował żadnych problemów z analizą podczas wykonywania autouzupełniania. Dziwne.
Ramón
3
@Oli jesteś posiadaczem licencji? Czy możesz to tutaj napisać?
Braiam
To prawda, dobrze, że przeczytałem twój post. Miałem missing package namei dowiedziałem się, że z jakiegoś dziwnego powodu lepiej nie marnować czasu na dowiadywanie się, miałem linię, Packaga: landscape-commonktóra została naprawiona ortograficznie i bam, problem rozwiązany. Chodzi o to, że nigdy nie dotknąłem tego pliku ani nikogo innego. Jak komputer może zepsuć się błędem w pisowni?
Severo Raz
Rzeczywista odpowiedź również powinna być tutaj, aby uniknąć odpowiedzi tylko z linkiem [jeśli błąd pochodzi z pustej linii, która nie poprzedza „Pakietu:”, a następnie dodaj .do tej pustej linii].
Xen2050,
20

Powinieneś być w stanie pracować z poprzednim znanym plikiem dobrego stanu i aktualizować stamtąd. Za każdym razem, gdy wykonujesz instalację lub aktualizację, plik statusu jest zapisywany w kopii zapasowej gzip w folderze / var / backups . Wykonanie polecenia ls -l dpkg * w katalogu pokazuje:

-rw-r--r-- 1 root root   2266732 2010-09-30 08:35 dpkg.status.0
-rw-r--r-- 1 root root    624182 2010-09-29 08:49 dpkg.status.1.gz
-rw-r--r-- 1 root root    623844 2010-09-28 08:55 dpkg.status.2.gz
-rw-r--r-- 1 root root    620358 2010-09-24 11:04 dpkg.status.3.gz
-rw-r--r-- 1 root root    619021 2010-09-23 15:34 dpkg.status.4.gz
-rw-r--r-- 1 root root    619013 2010-09-23 08:03 dpkg.status.5.gz
-rw-r--r-- 1 root root    618968 2010-09-21 08:33 dpkg.status.6.gz

Istnieje również kopia zapasowa pliku utworzonego w katalogu / var / lib / dpkg / o nazwie status-old. Wykonanie statusu ls -l * w katalogu pokazuje:

-rw-r--r-- 1 root root 2266732 2010-09-30 08:35 status
-rw-r--r-- 1 root root 2267191 2010-09-30 08:35 status-old

Tak więc, aby wyjść z korupcji, powinieneś być w stanie wykonać następujące czynności:

1. Wykonaj kopię zapasową uszkodzonego pliku statusu :

mv /var/lib/dpkg/status /var/lib/dpkg/status_bkup

2. Skopiuj najnowszy plik statusu dpkg na jedno z powyższych źródeł:

zarówno

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

lub

cp /var/backups/dpkg.status.#.gz /var/lib/dpkg/
gunzip -d /var/lib/dpkg/dpkg.status.#.gz 
mv /var/lib/dpkg/dpkg.status.# /var/lib/dpkg/status

3. Następnie uruchom aktualizację apt-get:

sudo apt-get update

Że należy to zrobić.

Jim
źródło
2
Nie wiedziałem o plikach statusu przechowywanych w / var / backups. To dobra informacja na wypadek, gdyby to się powtórzyło. Dzięki, Jim.
Ramón
Ale czy korzystanie ze starej wersji jest bezpieczne? Chodzi mi o to, że na pewno nie tylko autouzupełnianie korzysta z tego pliku, a używanie starej wersji ze starszymi informacjami o pakiecie spieprzy inne, o wiele ważniejsze rzeczy ... jak sam apt.
Oli
@Oli Nie jestem pewien. Musiałem to zrobić tylko raz. Myślę, że musiałem ponownie zainstalować aplikację, która była przyczyną problemu, ale w dalszym ciągu działała. Tak jak w przypadku wszystkich porad w Internecie (a przynajmniej porad ode mnie w Internecie), zadziałało to dla mnie. To nie znaczy, że to na pewno zadziała. Oferuję go bez gwarancji i bez wyraźnej wiedzy o tym, jak zachowa się w twoim systemie. Twój przebieg może się różnić. Spróbuj na własne ryzyko.
Jim,
Wydaje się, że to rozwiązanie rozwiązało moje problemy. Będę aktualizować, jeśli pojawią się jakiekolwiek problemy z użyciem starego pliku statusu.
Matthew
W starym pliku może brakować niektórych zmian pakietu dokonanych w systemie, ale w większości będzie to w porządku. Robi sudo apt update && sudo apt dist-upgradepowinno rozwiązać większość problemów, które stary statusplik może spowodować. Jeśli twój system ma większy bałagan, sudo aptitude dist-upgradezamiast sudo apt ...czasami sugerować lepsze sposoby naprawienia awarii.
Mikko Rantalainen
6

Byłem w stanie rozwiązać ten problem, usuwając pakiety, które miały uszkodzone wpisy w pliku statusu.

sudo dpkg -r handbrake-cli

Akceptowane rozwiązanie przez pcregrep nie działało (pcregrep niczego nie znalazł).

luka
źródło
Dziękuję bardzo, że to działa dla mnie i faktycznie jest to właściwe podejście. Dzięki
user2671192
6

Wypróbuj „dpkg -P” dla pakietu naruszającego prawo. To usunie go z lokalnego repozytorium, usuwając wszystkie ślady. W moim systemie była to poprawka dla usuniętych (ale jeszcze nie wyczyszczonych) pakietów, które spowodowały ten błąd.

zwykle
źródło
5

W takim przypadku utworzę kopię zapasową uszkodzonego /var/lib/dpkg/statuspliku, a następnie poprawię go ręcznie (wokół linii 1888 i 9550), korzystając z informacji z

apt-cache show libssl0.9.8
apt-cache show udev
zorganizować
źródło
Got it . apt-get działa teraz płynnie.
ændrük
3

To był błąd (który powinien zostać naprawiony): Launchpad Bug 613018

W górę: Debian Bug 590885

Powinno to być obejście problemu (kopia zapasowa, ciąg wersji „fix”):

cp /var/lib/dpkg/status ~/dpkg-status.back
sudo sed -i "s/56127_Ubuntu_karmic/56127Ubuntukarmic/" /var/lib/dpkg/status
htorque
źródło
2

Syn...

OK, rzeczywisty błąd był na linii 15266, pomimo że zgłoszono około 700 linii dalej. Problematyczny wpis w pliku stanu został spowodowany przez deb, który zainstalowałem, aby moja drukarka Lexmark działała dawno temu. Wpis dotyczył paczki lexmark-inkjet-08-driver. Pole Opis nie miało znaku .zastępującego linię. Spowodowało to błąd analizy.

Aby to znaleźć, skorzystałem z metody rozwiązywania problemów ze strzelbą i zacząłem próbować rzeczy dość losowo. Jedną z moich głupich prób było grep-status -P eustalenie, że e jest najczęstszą literą w alfabecie. Głupi, wiem, ale ostatni rekord statusu wydrukowany zanim narzekał na brakujący dwukropek dotyczył pakietu Lexmark i zauważyłem brak .znaku po kilku minutach wpatrywania się w ekran.

Jeśli to możliwe, chciałbym uzyskać inną odpowiedź, która mogłaby opisać lepszą metodę znalezienia tego rodzaju problemu na wypadek, gdyby ktoś napotkał podobny problem w przyszłości. Dzięki.

Ramón
źródło
grep-status -r -P ^powinien zawsze pasować do dowolnego pakietu, więc powinien przeanalizować cały plik i przerwać, jeśli nie może go przeanalizować.
Mikko Rantalainen
2

Ponieważ mój stary status był zbyt problematyczny nawet z apt-get update,

Działa to dla mnie całkiem dobrze:

(jako root)

cd /var/lib/dpkg 

cp -avf status status.corrupt

tr -cd '\11\12\15\40-\176' < status.corrupt > status

Ta komenda używa argumentów -c i -d komendy tr do usunięcia wszystkich znaków ze strumienia wejściowego innych niż wartości ósemkowe ASCII, które są wyświetlane między pojedynczymi cudzysłowami. To polecenie pozwala na przejście następujących znaków przez ten filtr uniksowy:

octal 11: tab

ósemkowy 12: podawanie linii

octal 15: powrót karetki

octal 40 do octal 176: wszystkie „dobre” znaki na klawiaturze

Wszystkie pozostałe znaki binarne - znaki „śmieci” w twoim pliku - są usuwane podczas tego procesu tłumaczenia.

KREDYT: http://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix

Jeśli jesteś ciekaw, co się zmieniło lub gdzie byłyby obrażenia: (być może długie)

diff /var/lib/dpkg/{status-old,status} |less
Marcos
źródło