我删除了一些文件/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/status
int 上面的命令。如果您也删除了它,则可以使用 重建软件包的大致列表$(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.