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


10

我已删除周围的一些文件/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
Braiam的答案将使您返回状态文件;但是您删除的内容/var/lib/dpkg/info也很重要。您误解了FHS和AFAIK,唯一的恢复路径是(a)从备份还原或(b)重新安装。
derobert

Answers:


13

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

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

请注意,“临时和临时”文件只是其中包含的内容之一。它还包含“假脱机目录和文件”以及“管理和日志记录数据”。您删除了重要的“管理数据”。

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

/var在此处指定以便可以挂载/usr只读。一旦进入一切/usr是系统运行过程中写入(相对于安装和软件维护)必须/var

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

进一步的章节解释了各个子目录/var; 例如,/var/lib(删除时用来存放文件的位置)保存有“与应用程序或系统有关的状态信息”,定义为“程序在运行时进行修改的数据,并且与一个特定的主机有关”。

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


我可以从另一台机器复制文件吗,或者它们是特定于机器的?
Martin Vegter 2014年

1
@MartinVegter状态列出了此特定计算机上安装了哪些软件包。您可以从包装状态完全相同的计算机上复制它(不仅安装了,而且移除了但也没有清除)。apt-get update我相信会重建。info /资料来自每个已安装的软件包,但它也同样反映了历史,至少对于旧的conf文件...但是您可能可以避免从该完全相同的软件包中进行复制)
derobert,2014年

当前文档声明“ /var/lib状态信息。程序在运行时修改的持久数据,例如数据库,包装系统元数据等。”
Mikko Rantalainen '19

8

/var/lib/dpkg/status从仅运行命令的意义上讲,您不能“重新创建” ,并且该文件会神奇地出现。否。您需要使用文件的备份,并且要学会从不删除/var/lib目录中的内容:

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

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


另请参阅/var/backups,那里有多个副本。
derobert

@Braiam-我没有老资格,/ var / backups中也没有任何内容。我可以从另一台机器复制文件吗,或者它们是特定于机器的?
Martin Vegter 2014年

1
@MartinVegter不,它不起作用。对您而言,最快的方法是备份重要文件,然后重新安装系统。顺便说一句,甚至没有/var/backups/dpkg.status.0
Braiam 2014年

8

所在的文件/var对系统至关重要。例如,/var/mail/var/spool/mail包含用户的电子邮件;与删除邻居邮箱中的火一样,删除删除的内容最多。只是其中某些子目录中/var包含或多或少/var/log具有/var/cache临时性的文件:在中登录文件,通常可以在其中重新创建的缓存,在中的临时文件(在使用时不要删除这些文件!)/var/tmp

数据输入/var/lib可能非常关键。例如,/var/lib/mysql默认情况下,通常将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')

如果丢失了/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。可能有一些例外。

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


我想说,只要从描述历史问题和解决问题的方法入手,就可以在此类系统上寻求有关软件包的帮助。有时,修复这样的系统可能会引起某些软件包管理过程中例如安全漏洞的注意,尽管处理这样的系统可能很困难,但这可能是有价值的。
Mikko Rantalainen '19

5

/var/lib/dpkg/available可以从容易的数据来重新创建。我发现使用dselect并选择更新是最简单的方法。我希望这只有在您选择了更新方法的情况下才有效。好像是dselect这样的:

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

请注意,自Debian袭击以来,情况可能已发生变化。

/var/lib/dpkg/status根据每个目录都需要在目录中添加目录这一事实来重新创建技巧/usr/share/doc。参见http://linuxmafia.com/faq/Debian/package-database-rebuild.html上的文章。提供了一个脚本,该脚本使用/ usr / share / doc的过滤列表来创建已安装软件包的列表,然后重新安装所有软件包。


1

好吧,我想您可以重新创建空文件,然后假设您知道第一次安装的内容,然后执行apt-get install long-list。

我有一个古老的脚本,基本上可以从运行apt-get的最小软件包集中进行此操作。使用它时,我最终报告了许多未声明的依赖项。

如果您不知道所安装的所有内容,请重新安装系统。


0

在Linux Mint 17上,我遇到了类似的问题。我对删除文件感到and之以鼻,发现自己对“管理->升级管理器”的看法并不满意……。

对我有用的解决方案是根据错误消息创建一个名为“ dpkg”的目录,并在其中创建一个名为“ status”的空文件。

然后,我运行更新管理器。

它对我有用:-)


0

如果您有其他用户帐户,而不是“ roo”,则可以尝试从其中一个帐户获得apt-get dist-upgrade。Apt将下载档案,但由于/ var /中缺少目录,因此无法进行安装。目录将显示。创建它们并重新运行apt-get dist-upgrade。如果从备用帐户登录到根目录n创建失败,则从那里创建目录,然后再次运行apt。系统将提示您有关logrotate配置的信息,其他一些配置只需键入Y n继续进行到最后,然后在apt dist-upgrade完成后重新启动。现在一切应该恢复正常。


0

抱歉耽搁了。轻描淡写,手动重新创建目录和文件,然后更新存储库(mkdirtouch根据显示的错误要求进行更新),然后使用dpkg --configure -a

您的系统可以正常运行,但是重要的是重新安装以确保它没有损坏。以前只是为了腾出时间安排重新安装...并注意删除/var/lib/*文件。


-2

如果您购买了树莓派3,并且遇到了问题并收到错误“无法打开已解析或打开的文件/ var / lib / dpkg / status”,那么这是对我有效的解决方法:

如何重新创建“ / var / lib / dpkg / status”文件,仅仅是因为这不是一个未使用的文件,这是一个非常重要的文件,可以保留有关您的raspbian OS中已安装的软件包的一些信息,所以这是我如何重新创建的文件:

  1. 在Raspbian系统中执行wget:

    wget http://www.doglabscs.com/recover1.sh
    
  2. 授予一些权限:

    chmod 777 recover1.sh
    
  3. 分析系统中的documentation文件夹并重新生成状态文件:

    ./recover1.sh
    
  4. 完成后,下载文件并仔细阅读。请按照文件中描述的步骤进行操作:

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

嗨!请发布代码作为答案的一部分,而不是链接。
dhag '17

警告:如果还可以,recover1.sh将在/var/lib/dpkg/status不进行测试的情况下破坏您的电流。然后,它将执行各种技巧,以尝试重建某些工作版本。除非您完全缺少文件/ var / lib / dpkg / status,否则永远不要运行以上脚本。否则,strings /var/lib/dpkg/status可能是开始重建损坏文件的更好方法。
Mikko Rantalainen '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.