Comment recréer / var / lib / dpkg / status?

10

J'ai supprimé certains fichiers /var/lib/dpkg/, à savoir:

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

Je comprends que Debian utilise ces fichiers pour conserver des informations sur les paquets installés. Maintenant, quand je le fais apt-get update, j'obtiens l'erreur suivante:

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.

Si je comprends bien le FHS , les fichiers situés dans /varne sont pas censés être critiques pour le système. Estimez que ces fichiers doivent être temporaires, journaux, caches et similaires.

Existe-t-il donc un moyen de recréer les fichiers supprimés?

Martin Vegter
la source
1
La réponse de Braiam vous ramènera le fichier de statut; mais les éléments que vous avez supprimés /var/lib/dpkg/infosont également très importants. Vous avez mal compris le FHS et AFAIK, les seuls chemins de récupération sont (a) restaurer à partir d'une sauvegarde ou (b) réinstaller.
derobert

Réponses:

13

Si vous regardez l' objectif de / var comme indiqué dans la norme de hiérarchie du système de fichiers , il dit:

/varcontient des fichiers de données variables. Cela inclut les répertoires et fichiers spoule, les données administratives et de journalisation, ainsi que les fichiers transitoires et temporaires.

Notez que les fichiers "transitoires et temporaires" ne sont que l' une des choses qu'il contient. Il contient également des "répertoires et fichiers spoule" et des "données administratives et de journalisation". Vous avez supprimé les "données administratives" critiques.

Il explique ensuite pourquoi /varexiste:

/varest spécifié ici afin de permettre un montage en /usrlecture seule. Tout ce /usrqui a été écrit une fois pendant le fonctionnement du système (par opposition à l'installation et à la maintenance du logiciel) doit être présent /var.

C'est l'essentiel /var: les données qu'elles contiennent changent, contrairement à /usr(qui ne change que lorsque vous ajoutez / supprimez / mettez à jour un logiciel).

D'autres sections expliquent les différents sous-répertoires de /var; par exemple, /var/lib(où les fichiers que vous avez supprimés résidaient auparavant) contient des «informations d'état relatives à une application ou au système», définies comme «des données que les programmes modifient pendant leur exécution et qui concernent un hôte spécifique».

Vous ne devriez vraiment pas supprimer des fichiers sans savoir à quoi sert le fichier spécifique. Avec les fichiers que vous avez supprimés, sauf si vous avez une sauvegarde de ces fichiers, je pense que la seule chose qui reste à faire est de prendre une sauvegarde de /home, /etcetc. et de réinstaller. Jusqu'à ce que vous le fassiez, vous ne pourrez pas utiliser dpkg(et APT, etc.). À part cela, le système devrait continuer de fonctionner.

derobert
la source
Puis-je copier les fichiers depuis une autre machine ou sont-ils spécifiques à la machine?
Martin Vegter
1
@MartinVegter status répertorie les packages installés sur cette machine particulière. Vous pouvez le copier à partir d'une machine avec les mêmes états de package exacts (non seulement installés, mais également supprimés mais non purgés). apt-get updateva reconstruire disponible, je crois. Les informations / éléments proviennent de chaque package installé, mais elles reflètent également l'historique, au moins pour les anciens fichiers de conf ... mais vous pourriez probablement vous en tirer avec la copie de cette même machine de packages)
derobert
La documentation actuelle déclare "les /var/libinformations d'état. Les données persistantes modifiées par les programmes pendant leur exécution, par exemple, les bases de données, les métadonnées du système de conditionnement, etc."
Mikko Rantalainen
8

Vous ne pouvez pas "recréer" /var/lib/dpkg/statusdans le sens de simplement exécuter une commande et le fichier apparaît comme par magie. Non. Vous devez utiliser une sauvegarde du fichier et apprendre à ne jamais supprimer les éléments du /var/librépertoire:

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

Cela vous donnerait l'état du colis de la veille. Commencez à prier pour que cela ne brise pas autre chose.

Braiam
la source
voyez aussi /var/backups, il y a plusieurs copies là-bas.
derobert
@Braiam - Je n'ai pas d'ancien état, ni rien dans / var / backups. Puis-je copier les fichiers depuis une autre machine ou sont-ils spécifiques à la machine?
Martin Vegter
1
@MartinVegter non, cela ne fonctionnera pas. Le moyen le plus rapide pour vous est de sauvegarder vos fichiers importants et de réinstaller le système. BTW, même pas /var/backups/dpkg.status.0?
Braiam
8

Les fichiers situés dans /varsont très critiques pour le système. Par exemple, /var/mailou /var/spool/mailcontient l'e-mail des utilisateurs; vous ne supprimeriez pas cela plus que vous allumiez un feu dans la boîte aux lettres de votre voisin. Ce ne sont que des fichiers dans certains sous-répertoires /varqui contiennent des fichiers plus ou moins transitoires: des fichiers journaux /var/log, des caches qui peuvent généralement être recréés /var/cache, des fichiers temporaires (que vous ne devez pas supprimer pendant leur utilisation!) Dans /var/tmp.

Les données /var/libpeuvent être assez critiques. Par exemple, MySQL est généralement configuré pour stocker ses bases de données /var/lib/mysqlpar défaut: si vous effacez cela, vous effacez vos bases de données. Dpkg place également ses propres bases de données /var/lib; /var/lib/dpkg/statusest une.

/var/lib/dpkg/statuscontient des informations sur les packages installés. Si vous avez effacé cela, vous devez le restaurer à partir d'une sauvegarde. Si votre sauvegarde n'est pas entièrement à jour, consultez les journaux des dernières manipulations de packages sous /var/log/aptet dans /var/log/dpkg.log. Vous devrez créer ce fichier avant de dpkgfonctionner.

/var/lib/dpkg/availableest construit à partir de données téléchargées sur Internet. apt-get updatedevrait le reconstruire.

/var/lib/dpkg/infocontient des fichiers livrés avec les paquets Debian. Vous pouvez restaurer ces fichiers simplement en réinstallant les packages. Bien sûr, vous aurez besoin d'une liste de packages installés pour cela. Si vous avez restauré /var/lib/dpkg/status, vous pouvez alors extraire la liste des packages.

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

Si vous avez perdu /var/lib/dpkg/status, vous pourrez peut-être le recréer en créant un fichier vide, puis en exécutant apt-get install --reinstallla liste des packages. Un endroit où la liste des packages est également enregistrée est /var/lib/apt/extended_states, au moins si vous n'avez utilisé APT que pour installer des packages (par opposition à dpkgdirectement) - utilisez ce fichier au lieu de /var/lib/dpkg/statusla commande ci-dessus. Si vous l'avez également supprimé, vous pouvez reconstruire une liste approximative de packages avec $(cd /usr/share/doc && ls), car la plupart des packages créent une entrée dans /usr/share/doc. Il y a probablement quelques exceptions.

Ne demandez aucune assistance sur la gestion des packages sur ce système. La récupération après la suppression de fichiers critiques pour le système n'est pas une science exacte. Si vous ne pouvez pas restaurer à partir de sauvegardes, vous devez installer un nouveau système propre dès que possible.

Gilles 'SO- arrête d'être méchant'
la source
Je dirais que c'est correct de demander de l'aide sur les paquets sur un tel système tant que vous commencez par décrire le problème historique et la façon dont vous l'avez résolu . Parfois, la réparation de tels systèmes peut permettre de remarquer, par exemple, des vulnérabilités de sécurité dans certains processus de gestion de paquets et cela peut être utile malgré le fait que traiter avec un tel système peut être difficile.
Mikko Rantalainen
5

Le /var/lib/dpkg/availablepeut être recréé à partir des données apt. La façon la plus simple que j'ai trouvée de le faire est d'utiliser dselectet de choisir la mise à jour. J'espère que cela ne fonctionnera que si vous avez choisi comme méthode de mise à jour. On dirait que dselectfait un:

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

Notez que les choses ont peut-être changé depuis la mise à jour de Debian.

Il existe des astuces à recréer en /var/lib/dpkg/statusfonction du fait que chaque package est nécessaire pour ajouter un répertoire dans le /usr/share/docrépertoire. Voir l'article à http://linuxmafia.com/faq/Debian/package-database-rebuild.html . Un script présenté utilise une liste filtrée de / usr / share / doc pour créer une liste des packages installés, puis les réinstalle tous.

Chris Gibson
la source
1

Eh bien, je suppose que vous pouvez recréer le fichier vide, puis faire la liste longue d'apt-get install, en supposant que vous savez ce que vous avez installé la première fois.

J'ai un ancien script qui fait essentiellement cela à partir du plus petit ensemble de packages pouvant exécuter apt-get. En l'utilisant, j'ai fini par rapporter des dizaines de dépendances non déclarées.

Si vous ne savez pas tout ce que vous avez installé, réinstallez le système.

Joshua
la source
0

Sur Linux Mint 17, j'ai rencontré un problème de sondage similaire. J'étais zélé dans la suppression de fichiers et je me suis retrouvé là où le "Administration -> Upgrade Manager" ne semblait tout simplement pas heureux .......

La solution qui a fonctionné pour moi a été de créer un répertoire appelé "dpkg" selon le message d'erreur, et d'y créer un fichier vide appelé "status".

J'ai ensuite exécuté Update Manager.

Cela a fonctionné pour moi :-)

Bluegerbil
la source
0

Si vous aviez d'autres comptes d'utilisateurs que 'roo't', vous pouvez essayer apt-get dist-upgrade depuis l'un d'eux. Apt téléchargera les archives mais s'arrêtera de les installer en raison de certains répertoires manquants dans / var /. Les répertoires seront affichés. créez-les et exécutez à nouveau apt-get dist-upgrade. dans le cas où leur création échoue à partir du journal de compte alternatif vers la racine n créez les répertoires à partir de là, puis exécutez à nouveau apt. vous serez invité à propos de la configuration logrotate et quelques autres configurations tapez simplement Y n continuez jusqu'à la fin puis redémarrez lorsque apt dist-upgrade est terminé. tout devrait maintenant redevenir normal.

Celui
la source
0

Désolé pour le retard. Briam, recréez les répertoires et les fichiers manuellement, puis mettez à jour les dépôts ( mkdiret touch, comme requis par l'erreur affichée), et utilisez dpkg --configure -a.

Votre système fonctionnerait bien, mais il est important de réinstaller pour vous assurer qu'il n'est pas corrompu; le précédent n'est que pour gagner du temps pour planifier une réinstallation ... et prendre soin de supprimer les /var/lib/*fichiers.

Daniel Ospitia
la source
-2

Si vous avez acheté un Raspberry Pi 3 et que vous avez rencontré le problème et que l'erreur "Impossible d'ouvrir le fichier / var / lib / dpkg / status analysé ou ouvert" est une solution de contournement qui a fonctionné pour moi:

Comment recréer le fichier "/ var / lib / dpkg / status"?, Juste parce que ce n'est pas un fichier inutile, c'est un fichier très important qui conserve des informations sur les packages installés dans votre système d'exploitation raspbian, alors voici comment j'ai été recréé :

  1. Effectuez un wget dans votre système Raspbian:

    wget http://www.doglabscs.com/recover1.sh
    
  2. Accordez des autorisations:

    chmod 777 recover1.sh
    
  3. Analysez le dossier de documentation de votre système et régénérez le fichier d'état:

    ./recover1.sh
    
  4. une fois terminé, téléchargez le fichier et lisez attentivement. Suivez les étapes décrites dans le fichier:

    wget http://www.doglabscs.com/recover2.txt
    cat recover2.txt
    
Dog Labs Corporation
la source
Salut! Veuillez publier le code dans vos réponses plutôt que sous forme de liens.
dhag
Avertissement: recover1.shdétruira votre courant /var/lib/dpkg/statussans le tester s'il est déjà correct. Ensuite, il exécutera un mélange de trucs pour essayer de reconstruire une version quelque peu fonctionnelle. N'exécutez jamais le script ci-dessus à moins que le fichier / var / lib / dpkg / status ne vous manque totalement. Sinon, cela strings /var/lib/dpkg/statuspourrait être une meilleure façon de commencer à reconstruire le fichier corrompu.
Mikko Rantalainen