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

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

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

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

我了解 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.

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

那么有没有办法重新创建已删除的文件?

答案1

如果你看一下文件系统层次结构标准中给出的 /var 的用途, 它说:

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

请注意,“瞬态和临时”文件只是它所包含的东西。它还包含“假脱机目录和文件”以及“管理和日志记录数据”。您删除了关键的“管理数据”。

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

/var此处指定是为了可以以/usr只读方式挂载。/usr在系统操作期间(而不是安装和软件维护)写入的所有内容都必须位于/var.

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

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

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

答案2

位于的文件/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是根据从互联网下载的数据构建的。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')

如果您丢失了/var/lib/dpkg/status,那么您可以通过创建一个空文件,然后apt-get install --reinstall在包列表上运行来重新创建它。还保存软件包列表的一个位置是/var/lib/apt/extended_states,至少如果您只使用过 APT 安装软件包(而不是dpkg直接安装),请使用该文件而不是/var/lib/dpkg/statusint 上面的命令。如果您也删除了它,则可以使用 重建软件包的大致列表$(cd /usr/share/doc && ls),因为大多数软件包都会在 中创建一个条目/usr/share/doc。可能有一些例外。

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

答案3

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

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

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

答案4

如果有人最终用核武器攻击了“/var/lib/dpkg”:

sudo mkdir -p /var/lib/dpkg/updates
sudo mkdir -p /var/lib/dpkg/info
sudo mkdir -p /var/lib/dpkg/alternatives

sudo cp /var/backups/dpkg.status.0 /var/lib/dpkg/status
sudo cp /var/backups/dpkg.statoverride.0 /var/lib/dpkg/statoverride
sudo cp /var/backups/dpkg.diversions.0 /var/lib/dpkg/diversions
sudo cp /var/backups/dpkg.arch.0 /var/lib/dpkg/arch

sudo dpkg --clear-avail
sudo apt update
sudo apt upgrade # If needed.

相关内容