Come ricostruire un file di stato dpkg corrotto?


26

Ogni volta che scrivo sudo apt-get removee quindi premo il Tabtasto per il completamento automatico ricevo il seguente messaggio:

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

Non vedo nulla di particolarmente strano nella riga 15945 nel file di stato. È un carattere punto nel campo della descrizione di un pacchetto di libreria mono e l'inserimento di due punti non ha aiutato. Anche la rimozione della linea contenente il punto non ha funzionato. La sovrascrittura del file con status-old ha prodotto lo stesso messaggio.

C'è un modo per ricostruire il file di stato?


3
Non penso che tu possa ricostruire completamente il statusfile: è una fonte primaria di informazioni, e sebbene molte di esse siano ridondanti, non tutte lo sono. Tuttavia è probabilmente possibile riparare il file manualmente. Pubblica un pezzo del file attorno alla linea problematica, ad esempio 20–40 righe, compresa almeno una Package:riga prima e dopo la riga 15945.
Gilles 'SO- smetti di essere malvagio',

Da allora ho provato a disinstallare mono ma tutto ciò che ha fatto è stato modificare il numero di riga che viene segnalato come errore. Se segui il link incolla, il numero di riga offensivo è 25, "Sezione: python" paste.ubuntu.com/501929
Ramón

@ Ramón Quindi, apt-get, dpkge gli amici funzionano ancora in modo corretto, e ciò che è fuori erroring è auto-completamento?
Riccardo Murri,

Corretta. Sembra che si verifichino problemi durante l'analisi del file di stato quando si utilizza il completamento automatico. Altrimenti posso installare e rimuovere i pacchetti senza errori apparenti.
Ramón,

Ottenere lo stesso problema. Non credo che usare ciecamente una vecchia versione del database di apt sia la cosa giusta da fare qui, indipendentemente dal fatto che risolva questo problema.
Oli

Risposte:


7

Ho finalmente risolto il mio sistema di questo. Il ripristino di un backup del file di stato non ha funzionato in quanto ho avuto il problema per così tanto tempo, è in tutti i miei backup.

La correzione comporta il grepping per le interruzioni di formattazione effettive e la correzione manuale. Non è così difficile come sembra.

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


Sono contento che tu abbia trovato una soluzione, Oli e grazie per averlo condiviso. Nel mio caso, oltre al problematico deb Lexmark, anche un deb Webmin presentava una descrizione errata ma in quel caso non causava problemi di analisi durante l'esecuzione di un completamento automatico. Strano.
Ramón,

3
@Oli sei titolare della licenza? Puoi scriverlo qui?
Braiam,

Questo è vero, bene che ho letto il tuo post. Ho avuto un missing package namee ho scoperto che, per qualche strana ragione, è meglio non perdere tempo a scoprirlo, ho avuto una linea Packaga: landscape-commonche è stata risolta in modo ortografico e bam, risolto il problema. Il fatto è che non ho mai toccato questo file, né nessun altro. Come può un computer sbagliare con un errore di ortografia?
Severo Raz,

La risposta effettiva dovrebbe essere anche qui, per evitare che sia una risposta di solo collegamento [se l'errore proviene da una riga vuota che non precede "Pacchetto:" quindi aggiungere un .a quella riga vuota].
Xen2050,

20

Dovresti essere in grado di lavorare con un precedente file di stato valido e aggiornarlo da lì. Ogni volta che si esegue un'installazione o un aggiornamento, il file di stato viene salvato in un backup compresso in / var / backups . Fare un ls -l dpkg * nella directory mostra:

-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

C'è anche un backup del file creato nella directory / var / lib / dpkg / chiamata status-old. Fare uno stato ls -l * nella directory mostra:

-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

Quindi, per recuperare da una corruzione, dovresti essere in grado di fare quanto segue:

1. Eseguire un backup del file di stato corrotto :

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

2. Copia un recente file di stato di dpkg in posizione da una delle fonti sopra:

o

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

o

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. Quindi eseguire apt-get update:

sudo apt-get update

Questo dovrebbe farlo.


2
Non sapevo dei file di stato conservati in / var / backups. Questa è una buona informazione da avere nel caso succeda di nuovo. Grazie Jim.
Ramón,

Ma è sicuro usare una versione precedente? Voglio dire, sicuramente non è solo il completamento automatico che utilizza questo file e l'utilizzo di una versione precedente con informazioni sul pacchetto precedenti rovinerà altre cose, molto più importanti ... come apt stesso.
Oli

@Oli non ne sono sicuro. Ho dovuto farlo solo una volta. Penso che dovessi reinstallare l'app che stava causando il problema, ma andando avanti ha funzionato. Come con tutti i consigli su Internet (o almeno i miei consigli su Internet), questo ha funzionato per me. Ciò non significa che funzionerà necessariamente per te. Lo offro senza garanzia e senza una conoscenza esplicita di come si comporterà sul tuo sistema. Il tuo chilometraggio può variare. Prova a tuo rischio.
Jim,

Questa soluzione sembra aver risolto i miei problemi. Aggiornerò se sorgono problemi dall'utilizzo di un vecchio file di stato.
Matteo,

Nel vecchio file potrebbero mancare alcune modifiche al pacchetto apportate al sistema, ma per lo più andrà bene. Ciò sudo apt update && sudo apt dist-upgradedovrebbe risolvere la maggior parte dei problemi che il vecchio statusfile potrebbe causare. Se il tuo sistema ha un pasticcio più grande, sudo aptitude dist-upgradeinvece di a sudo apt ...volte può suggerire modi migliori per riparare la rottura.
Mikko Rantalainen,

6

Sono stato in grado di risolvere questo problema rimuovendo i pacchetti che avevano voci danneggiate nel file di stato.

sudo dpkg -r handbrake-cli

La soluzione accettata tramite pcregrep non ha funzionato (pcregrep non ha trovato nulla).


Grazie mille funziona per me e in effetti è l'approccio giusto Grazie
user2671192

6

Prova un "dpkg -P" per il pacchetto offensivo. Ciò lo eliminerà dal repository locale, rimuovendo tutte le tracce. Sul mio sistema, quella era la correzione per i pacchetti rimossi (ma non ancora eliminati) che producevano quell'errore.


5

In questo caso, esegui il backup del /var/lib/dpkg/statusfile danneggiato e lo correggo manualmente (attorno alle righe 1888 e 9550) utilizzando le informazioni da

apt-cache show libssl0.9.8
apt-cache show udev

Capito . apt-get ora funziona senza problemi.
ændrük,

3

Questo è stato un bug (dovrebbe essere corretto): Launchpad Bug 613018

A monte: Debian Bug 590885

Questa dovrebbe essere una soluzione alternativa (backup, stringa di versione "fix"):

cp /var/lib/dpkg/status ~/dpkg-status.back
sudo sed -i "s/56127_Ubuntu_karmic/56127Ubuntukarmic/" /var/lib/dpkg/status

2

Figlio di un...

Va bene, l'errore reale era sulla riga 15266 nonostante fosse riportato circa 700 righe più in basso. La voce problematica nel file di stato è stata causata da un deb che ho installato per far funzionare la mia stampante Lexmark molto tempo fa. La voce era per il pacchetto lexmark-inkjet-08-driver. Il campo Descrizione non aveva un .al posto di un'interruzione di riga. Ciò ha causato l'errore di analisi.

Per trovarlo, ho fatto ricorso a un metodo di risoluzione dei problemi del fucile da caccia e ho iniziato a provare le cose in modo quasi casuale. Uno dei miei sciocchi tentativi era grep-status -P ecapire che e fosse la lettera più comune dell'alfabeto. Scemo, lo so, ma l'ultimo record di stato stampato prima che si lamentasse di due punti mancanti era per il pacchetto lexmark e ho notato la mancanza di un .personaggio dopo pochi minuti a fissare lo schermo.

Se possibile, vorrei un'altra risposta che potesse descrivere un metodo migliore per trovare questo tipo di problema nel caso in cui qualcuno dovesse riscontrare un problema simile in futuro. Grazie.


grep-status -r -P ^deve sempre corrispondere a qualsiasi pacchetto, quindi dovrebbe analizzare l'intero file e interrompere se non può analizzarlo.
Mikko Rantalainen,

2

Poiché il mio vecchio status era troppo problematico anche con apt-get update,

Questo ha funzionato abbastanza bene per me:

(come root)

cd /var/lib/dpkg 

cp -avf status status.corrupt

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

Questo comando usa gli argomenti -c e -d per il comando tr per rimuovere tutti i caratteri dal flusso di input diversi dai valori ottali ASCII mostrati tra virgolette singole. Questo comando consente specificamente ai seguenti caratteri di passare attraverso questo filtro Unix:

ott 11: tab

ott 12: avanzamento riga

15 ottale: rientro in carrozza

da ottale 40 a ottale 176: tutti i caratteri "buoni" della tastiera

Tutti gli altri caratteri binari - i caratteri "spazzatura" nel tuo file - vengono rimossi durante questo processo di traduzione.

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

Se sei curioso di sapere cosa è cambiato o dove sarebbe il danno: (possibilmente lungo)

diff /var/lib/dpkg/{status-old,status} |less
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.