如何重新创建/var/lib/dpkg/status?

Mar*_*ter 14 dpkg apt directory-structure package-management

我删除了周围的一些文件/var/lib/dpkg/,即:

/var/lib/dpkg/status
/var/lib/dpkg/available
/var/lib/dpkg/info/*
Run Code Online (Sandbox Code Playgroud)

我知道 Debian 使用这些文件来保存有关已安装软件包的一些信息。现在,当我这样做时apt-get update,出现以下错误:

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.
Run Code Online (Sandbox Code Playgroud)

据我了解FHS,位于的文件/var不应该是系统关键的。评分者应该是临时文件、日志、缓存等。

因此,有没有办法重新创建已删除的文件?

der*_*ert 16

如果您查看Filesystem Hierarchy Standard 中给出的 /var的用途,它会说:

/var包含可变数据文件。这包括假脱机目录和文件、管理和日志数据以及瞬态和临时文件。

需要注意的是“短暂和临时的”文件只是一个它所包含的东西。它还包含“假脱机目录和文件”以及“管理和日志数据”。您删除了关键的“管理数据”。

它继续解释为什么/var存在:

/var在这里指定是为了可以以/usr只读方式安装。/usr在系统操作(与安装和软件维护相对)期间写入的所有内容都必须在/var.

这就是关键/var:其中的数据会发生变化,不像/usr(只有在添加/删除/更新软件时才会发生变化)。

进一步的部分解释了 的各个子目录/var;例如,/var/lib(您删除的文件曾经存在的地方)包含“与应用程序或系统有关的状态信息”,定义为“程序在运行时修改的数据,并且与特定主机有关。”

您真的不应该在不知道特定文件的用途的情况下删除文件。有了您删除,除非你有这些文件的备份文件,我认为唯一剩下要做的就是把备份/home,/etc等并重新安装。在您这样做之前,您将无法使用dpkg(以及 APT 等)。除此之外,系统应该继续运行。


Gil*_*il' 9

位于 中的文件对/var系统非常重要。例如,/var/mail或/var/spool/mail包含用户的电子邮件;你不会删除它,就像你在邻居的邮箱里生火一样。只有某些子目录中的/var文件包含或多或少是暂时的文件: 中的日志文件/var/log、通常可以在 中重新创建的缓存、 中的/var/cache临时文件(在使用时不应删除它们!)/var/tmp。

输入的数据/var/lib可能非常关键。例如,MySQL 通常被配置为/var/lib/mysql默认存储它的数据库:如果你删除它,你就会擦除你的数据库。dpkg 也将自己的数据库放在下面/var/lib;/var/lib/dpkg/status是一个。

/var/lib/dpkg/status包含有关已安装软件包的信息。如果你已经删除了它,你应该从备份中恢复它。如果您的备份不是完全最新的,请在 下/var/log/apt和 中检查最近的包操作日志/var/log/dpkg.log。您需要先创建该文件才能dpkg工作。

/var/lib/dpkg/available是根据从 Internet 下载的数据构建的。apt-get update应该重建它。

/var/lib/dpkg/info包含 Debian 软件包附带的文件。您只需重新安装软件包即可恢复这些文件。当然,您需要一个已安装软件包的列表。如果您已经恢复/var/lib/dpkg/status,那么您可以从那里提取软件包列表。

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

如果您丢失了/var/lib/dpkg/status,那么您可以通过创建一个空文件,然后apt-get install --reinstall在包列表上运行来重新创建它。一个包列表也被保存的地方是/var/lib/apt/extended_states,至少如果你只使用过 APT 来安装包(而不是dpkg直接)——使用该文件而不是/var/lib/dpkg/status上面的命令。如果你也删除了它,你可以用 重建一个近似的包列表$(cd /usr/share/doc && ls),因为大多数包在/usr/share/doc. 可能有几个例外。

不要在此系统上寻求有关包管理的任何帮助。从系统关键文件的删除中恢复并不是一门精确的科学。如果您无法从备份中恢复,您应该尽快安装一个新的、干净的系统。


Bra*_*iam 8

你不能“重新创建”/var/lib/dpkg/status仅仅运行一个命令并且文件神奇地出现。不。您需要使用文件的备份,并学会永远不要删除/var/lib目录中的内容:

sudo cp /var/lib/dpkg/status-old /var/lib/dpkg/status
Run Code Online (Sandbox Code Playgroud)

这将为您提供前一天的包裹状态。开始祈祷它没有破坏其他东西。

  • 另请参阅“/var/backups”,那里有多个副本。 (2认同)
  • @MartinVegter 不,它不会起作用。对您来说最快的方法是备份重要文件,然后重新安装系统。顺便说一句,甚至不是“/var/backups/dpkg.status.0”? (2认同)

小智 5

该/var/lib/dpkg/available可以从容易的数据来重新创建。我找到的最简单的方法是使用dselect和选择更新来做到这一点。我希望这仅在您选择作为更新方法时才有效。似乎dselect做了一个:

/bin/bash /usr/lib/dpkg/methods/apt/update /var/lib/dpkg apt apt
Run Code Online (Sandbox Code Playgroud)

请注意,自 Debian sarge 以来,情况可能已经发生了变化。

/var/lib/dpkg/status基于每个包都需要在目录中添加目录这一事实,有一些技巧可以重新创建/usr/share/doc。请参阅http://linuxmafia.com/faq/Debian/package-database-rebuild.html 上的帖子。提供了一个脚本,它使用 /usr/share/doc 的过滤列表来创建已安装的软件包列表,然后重新安装它们。