Come ricreare / var / lib / dpkg / status?


10

Ho eliminato alcuni file in giro /var/lib/dpkg/, vale a dire:

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

Comprendo che Debian usa questi file per conservare alcune informazioni sui pacchetti installati. Ora quando lo faccio apt-get update, ottengo il seguente errore:

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.

A quanto ho capito , il file FHS/var non dovrebbe essere critico per il sistema. Rater questi dovrebbero essere file temporanei, registri, cache e simili.

Esiste quindi un modo per ricreare i file eliminati?


1
La risposta di Braiam ti riporterà il file di stato; ma anche le cose che hai eliminato /var/lib/dpkg/infosono abbastanza importanti. Hai compreso male l'FHS e AFAIK gli unici percorsi di recupero sono (a) il ripristino dal backup o (b) la reinstallazione.
derobert,

Risposte:


13

Se osservi lo scopo di / var come indicato nello Standard della gerarchia dei filesystem , dice:

/varcontiene file di dati variabili. Ciò include directory e file di spooling, dati amministrativi e di registrazione e file temporanei e temporanei.

Si noti che i file "temporanei e temporanei" sono solo una delle cose che contiene. Contiene anche "directory e file di spool" e "dati amministrativi e di registrazione". Hai eliminato "dati amministrativi" critici.

Continua spiegando perché /varesiste:

/varviene specificato qui per consentire il montaggio /usrin sola lettura. Tutto ciò /usrche è stato scritto in una volta durante il funzionamento del sistema (al contrario dell'installazione e della manutenzione del software) deve essere incluso /var.

Questa è la cosa fondamentale /var: i dati in esso cambiano, a differenza /usr(che cambia solo quando aggiungi / rimuovi / aggiorni software).

Ulteriori sezioni spiegano le varie sottodirectory di /var; ad esempio, /var/lib(in cui i file eliminati erano utilizzati per vivere) contiene "informazioni sullo stato relative a un'applicazione o al sistema", definite come "dati che i programmi modificano durante l'esecuzione e che riguardano un host specifico".

Non dovresti davvero eliminare i file senza sapere a cosa serve il file specifico. Con i file che hai eliminato, a meno che tu non abbia un backup di questi file, penso che l'unica cosa che resta da fare sia fare un backup /home, /etcecc. E reinstallarlo. Fino a quando non lo fai, non sarai in grado di usare dpkg(e APT, ecc.). A parte questo, il sistema dovrebbe continuare a funzionare.


Posso copiare i file da un'altra macchina o sono specifici della macchina?
Martin Vegter,

1
@MartinVegter elenca quali pacchetti sono installati su questo particolare computer. Si potrebbe copiarlo da una macchina con gli esatti stessi stati dei pacchetti (non solo installati, ma rimossi ma non eliminati pure). apt-get updatericostruirò disponibile, credo. Le informazioni / cose provengono da ogni pacchetto installato, ma riflettono anche la cronologia, almeno per i vecchi file conf ... ma probabilmente potresti scappare con la copia dallo stesso identico pacchetto di pacchetti)
derobert

La documentazione attuale dichiara " /var/libInformazioni sullo stato. Dati persistenti modificati dai programmi durante l'esecuzione, ad esempio database, metadati del sistema di imballaggio, ecc."
Mikko Rantalainen,

8

Non è possibile "ricreare" /var/lib/dpkg/statusnel senso di eseguire semplicemente un comando e il file appare magicamente. No. È necessario utilizzare un backup del file e imparare a non andare in giro eliminando cose dalla /var/libdirectory:

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

Questo ti darebbe lo stato del pacchetto del giorno prima. Inizia a pregare che non abbia rotto qualcos'altro.


vedi anche /var/backups, ci sono più copie lì.
derobert,

@Braiam - Non ho status-old, né ho nulla in / var / backups. Posso copiare i file da un'altra macchina o sono specifici della macchina?
Martin Vegter,

1
@MartinVegter no, non funzionerà. Il modo più veloce per te è il backup dei tuoi file importanti e reinstallare il sistema. A proposito, nemmeno /var/backups/dpkg.status.0?
Braiam,

8

I file che si trovano in /varsono molto critici per il sistema. Ad esempio, /var/mailo /var/spool/mailcontiene l'e-mail degli utenti; non lo elimineresti più di quanto accenderesti un incendio nella casella di posta del tuo vicino. Sono solo i file in alcune sottodirectory /varche contengono file che sono più o meno transitori: file di log in /var/log, cache che di solito possono essere ricreati /var/cache, file temporanei (che non dovresti eliminare mentre sono in uso!) In /var/tmp.

I dati in /var/libpossono essere piuttosto critici. Ad esempio, MySQL è in genere configurato per archiviare i suoi database in modo /var/lib/mysqlpredefinito: se lo cancelli, cancelli i tuoi database. Dpkg inserisce anche i propri database /var/lib; /var/lib/dpkg/statusè uno.

/var/lib/dpkg/statuscontiene informazioni sui pacchetti installati. Se lo hai cancellato, dovresti ripristinarlo da un backup. Se il backup non è completamente aggiornato, controllare i registri delle manipolazioni dei pacchetti recenti in /var/log/apte in /var/log/dpkg.log. Dovrai creare quel file prima dpkgche funzioni.

/var/lib/dpkg/availableè costruito dai dati scaricati da Internet. apt-get updatedovrebbe ricostruirlo.

/var/lib/dpkg/infocontiene file forniti con i pacchetti Debian. È possibile ripristinare questi file semplicemente reinstallando i pacchetti. Naturalmente, avrai bisogno di un elenco di pacchetti installati per quello. Se hai ripristinato /var/lib/dpkg/status, puoi estrarre l'elenco di pacchetti da lì.

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

Se hai perso /var/lib/dpkg/status, potresti essere in grado di ricrearlo creando un file vuoto, quindi eseguendo apt-get install --reinstalll'elenco dei pacchetti. Un punto in cui viene salvato anche l'elenco dei pacchetti è /var/lib/apt/extended_states, almeno se hai sempre usato APT per installare i pacchetti (anziché dpkgdirettamente) - usa quel file invece di /var/lib/dpkg/statusint nel comando sopra. Se lo hai eliminato anche tu, puoi ricostruire un elenco approssimativo di pacchetti con $(cd /usr/share/doc && ls), poiché la maggior parte dei pacchetti crea una voce in /usr/share/doc. Probabilmente ci sono alcune eccezioni.

Non richiedere assistenza per la gestione dei pacchetti su questo sistema. Il recupero dalla cancellazione di file critici di sistema non è una scienza esatta. Se non è possibile ripristinare dai backup, è necessario installare al più presto un nuovo sistema pulito.


Direi che va bene chiedere assistenza sui pacchetti su un tale sistema purché inizi a descrivere il problema storico e il modo in cui lo hai risolto . A volte la riparazione di tali sistemi può consentire di rilevare, ad esempio, le vulnerabilità della sicurezza in alcuni processi di gestione dei pacchetti e può essere utile nonostante il fatto che gestire un sistema di questo tipo possa essere difficile.
Mikko Rantalainen,

5

Il /var/lib/dpkg/availablepuò essere ricreato dai dati apt. Il modo più semplice che ho trovato per farlo ci utilizza dselecte scegliendo l'aggiornamento. Mi aspetto che funzionerà solo se hai scelto apt come metodo di aggiornamento. Sembra che dselectfaccia un:

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

Nota che le cose potrebbero essere cambiate da quando Debian sarge.

Ci sono trucchi da ricreare in /var/lib/dpkg/statusbase al fatto che ogni pacchetto è necessario per aggiungere una directory nella /usr/share/docdirectory. Vedi post su http://linuxmafia.com/faq/Debian/package-database-rebuild.html . È stato presentato uno script che utilizza un elenco filtrato di / usr / share / doc per creare un elenco di pacchetti installati, quindi reinstallarli tutti.


1

Beh, suppongo che potresti ricreare il file vuoto e quindi fare apt-get install long-list, supponendo che tu sappia cosa hai installato la prima volta.

Ho uno script antico che fondamentalmente fa questo dal più piccolo set di pacchetti che può eseguire apt-get. Usandolo ho finito per segnalare dozzine di dipendenze non dichiarate.

Se non sai tutto quello che hai installato, reinstalla il sistema.


0

Su Linux Mint 17 ho riscontrato un problema di suono simile. Ero zeleous nell'eliminazione dei file e mi sono trovato dove "Amministrazione -> Gestione aggiornamenti" non sembrava felice .......

La soluzione che ha funzionato per me è stata quella di creare una directory chiamata "dpkg" come da messaggio di errore, e in essa creare un file vuoto chiamato "status".

Ho quindi eseguito Update Manager.

Ha funzionato per me :-)


0

Se avessi altri account utente diversi da "roo't", potresti provare apt-get dist-upgrade da uno di essi. Apt scaricherà gli archivi ma si fermerà durante l'installazione a causa di alcune directory mancanti in / var /. Verranno visualizzate le directory. crearli ed eseguire di nuovo apt-get dist-upgrade. nel caso in cui la loro creazione non riesca dal registro degli account alternativo alla radice n crea le directory da lì, quindi esegui di nuovo apt. ti verrà chiesto di accedere alla configurazione di logrotate e alcune altre configurazioni basta digitare Y n procedere fino alla fine, quindi riavviare al termine di apt dist-upgrade. ora tutto dovrebbe tornare alla normalità.


0

Scusa per il ritardo. Briam, ricreare le directory e i file manualmente, quindi aggiornare i repository ( mkdire touch, come richiesto dall'errore visualizzato), e utilizzare dpkg --configure -a.

Il sistema funzionerebbe correttamente, ma è importante reinstallare per assicurarsi che non sia danneggiato; precedente è solo quello di guadagnare tempo per pianificare una reinstallazione ... e occuparsi di eliminare i /var/lib/*file.


-2

Se hai acquistato un raspberry pi 3 e hai riscontrato il problema e si è verificato l'errore "impossibile aprire il file / var / lib / dpkg / status analizzato o aperto" questa è una soluzione alternativa che ha funzionato per me:

Come ricreare il file "/ var / lib / dpkg / status"? Solo perché questo non è un file inutile, questo è un file molto importante che conserva alcune informazioni sui pacchetti installati nel tuo sistema operativo raspbian, quindi ecco come sono stato ricreato :

  1. Esegui una scommessa sul tuo sistema Raspbian:

    wget http://www.doglabscs.com/recover1.sh
    
  2. Concedi alcune autorizzazioni:

    chmod 777 recover1.sh
    
  3. Analizza la cartella della documentazione nel tuo sistema e rigenera il file di stato:

    ./recover1.sh
    
  4. una volta fatto, scarica il file e leggi attentamente. Seguire i passaggi descritti nel file:

    wget http://www.doglabscs.com/recover2.txt
    cat recover2.txt
    

Ciao! Si prega di pubblicare il codice come parte delle risposte anziché come collegamenti.
dhag,

Attenzione: recover1.shdistruggerà la tua corrente /var/lib/dpkg/statussenza test se è già a posto. Quindi eseguirà un mix di trucchi per provare a ricostruire una versione un po 'funzionante. Non eseguire mai lo script sopra a meno che non ti manchi completamente il file / var / lib / dpkg / status. Altrimenti strings /var/lib/dpkg/statuspotrebbe essere un modo migliore per iniziare a ricostruire il file danneggiato.
Mikko Rantalainen,
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.