如何重建损坏的 dpkg 状态文件?

Ram*_*món 28 dpkg bash

每当我键入sudo apt-get remove然后按Tab自动完成键时,我都会收到以下消息:

grep-status: /var/lib/dpkg/status:15945: expected a colon
.
Run Code Online (Sandbox Code Playgroud)

我在状态文件的第 15945 行没有看到任何特别奇怪的东西。这是单声道库包的描述字段中的点字符,插入冒号没有帮助。删除包含点的行也不起作用。用 status-old 覆盖文件会导致相同的消息。

有没有办法重建状态文件?

Jim*_*Jim 19

您应该能够使用以前已知的良好状态文件并从那里更新。每次进行安装或更新时,状态文件都会保存到/var/backups下的 gzip备份中。在目录上执行ls -l dpkg * 显示:

-rw-r--r-- 1 root root   2266732 2010-09-30 08:35 dpkg.status.0
-rw-r--r-- 1 root root    624182 2010-09-29 08:49 dpkg.status.1.gz
-rw-r--r-- 1 root root    623844 2010-09-28 08:55 dpkg.status.2.gz
-rw-r--r-- 1 root root    620358 2010-09-24 11:04 dpkg.status.3.gz
-rw-r--r-- 1 root root    619021 2010-09-23 15:34 dpkg.status.4.gz
-rw-r--r-- 1 root root    619013 2010-09-23 08:03 dpkg.status.5.gz
-rw-r--r-- 1 root root    618968 2010-09-21 08:33 dpkg.status.6.gz
Run Code Online (Sandbox Code Playgroud)

还有一个在 /var/lib/dpkg/ 目录中创建的名为 status-old 的文件的备份。在目录上执行ls -l status * 显示:

-rw-r--r-- 1 root root 2266732 2010-09-30 08:35 status
-rw-r--r-- 1 root root 2267191 2010-09-30 08:35 status-old
Run Code Online (Sandbox Code Playgroud)

因此,要从损坏中恢复,您应该能够执行以下操作:

1. 备份损坏的状态文件

mv /var/lib/dpkg/status /var/lib/dpkg/status_bkup
Run Code Online (Sandbox Code Playgroud)

2. 将最近的 dpkg 状态文件从上述任一来源复制到位:

任何一个

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

或者

cp /var/backups/dpkg.status.#.gz /var/lib/dpkg/
gunzip -d /var/lib/dpkg/dpkg.status.#.gz 
mv /var/lib/dpkg/dpkg.status.# /var/lib/dpkg/status
Run Code Online (Sandbox Code Playgroud)

3.然后运行apt-get更新:

sudo apt-get update
Run Code Online (Sandbox Code Playgroud)

那应该这样做。

  • 我不知道 /var/backups 中保存的状态文件。这是一个很好的信息,以防它再次发生。谢谢,吉姆。 (2认同)

Oli*_*Oli 7

我终于修复了我的系统。恢复状态文件的备份不起作用,因为我遇到这个问题已经很长时间了,它存在于我的所有备份中。

修复包括搜索实际格式中断并手动修复它们。这并不像听起来那么难。

http://thepcspy.com/read/fixing-dpkg-status-corruption/

  • @Oli 您是许可证的持有人吗?你能在这里写吗? (3认同)

小智 6

我能够通过删除状态文件中已损坏条目的包来解决此问题。

sudo dpkg -r handbrake-cli
Run Code Online (Sandbox Code Playgroud)

通过 pcregrep 接受的解决方案不起作用(pcregrep 没有找到任何东西)。


小智 6

尝试对有问题的包使用“dpkg -P”。这将从本地存储库中清除它,删除所有痕迹。在我的系统上,这是对产生该错误的已删除(但尚未清除)包的修复。


arr*_*nge 5

在这种情况下,我将备份损坏的/var/lib/dpkg/status文件,然后使用来自

apt-cache show libssl0.9.8
apt-cache show udev
Run Code Online (Sandbox Code Playgroud)