it-swarm.cn

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

每当我输入Sudo apt-get remove然后按下 Tab 自动完成的密钥我收到以下消息:

grep-status: /var/lib/dpkg/status:15945: expected a colon
.

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

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

26
Ramón

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

修复涉及到实际格式化中断的grepping并手动修复它们。它并不像听起来那么难。

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

7
Oli

您应该能够使用以前已知的良好状态文件并从那里进行更新。每次进行安装或更新时,状态文件都会保存到/ var/backups下的gzipped备份中。在目录上执行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

还有一个名为status-old的/ var/lib/dpkg /目录中创建的文件的备份。在目录上执行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

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

1.备份损坏的状态文件

mv /var/lib/dpkg/status /var/lib/dpkg/status_bkup

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

或者

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

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

.然后运行apt-get update :

Sudo apt-get update

应该这样做。

19
Jim

尝试使用“dpkg -P”作为违规套餐。这将从本地存储库中清除它,删除所有跟踪。在我的系统上,这是产生该错误的已删除(但尚未清除)的软件包的修复程序。

6
ordually

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

Sudo dpkg -r handbrake-cli

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

6
gap

在这种情况下,我会备份损坏的/var/lib/dpkg/status文件,然后使用以下信息手动更正(在1888和9550行)

apt-cache show libssl0.9.8
apt-cache show udev
5
arrange

这是一个错误(应该修复): Launchpad Bug 613018

上游: Debian Bug 590885

这应该是一种解决方法(备份,“修复”版本字符串):

cp /var/lib/dpkg/status ~/dpkg-status.back
Sudo sed -i "s/56127_Ubuntu_karmic/56127Ubuntukarmic/" /var/lib/dpkg/status
3
htorque

的儿子...

好吧,实际的错误是在15266线,尽管报告了大约700线进一步下降。状态文件中有问题的条目是由于我安装了deb以使我的Lexmark打印机很久以前工作。该条目用于包lexmark-inkjet-08-driver。 Description字段在换行符处没有.。这导致解析错误。

为了找到这个,我采用了猎枪故障排除方法,并开始随意尝试。我的一个愚蠢的尝试是grep-status -P e,认为e是字母表中最常见的字母。愚蠢,我知道,但是在它抱怨冒号缺失之前打印出的最后状态记录是lexmark包,我注意到在几分钟的屏幕盯着后缺少.字符。

如果可能的话,我想要另一个答案,可以描述一种更好的方法来找到这种问题,以防将来遇到类似的问题。谢谢。

2
Ramón

因为我的状态旧即使使用apt-get update也有问题,

这对我很有用:

(以root身份)

cd /var/lib/dpkg 

cp -avf status status.corrupt

tr -cd '\11\12\15\40-\176' < status.corrupt > status

此命令使用tr命令的-c和-d参数从输入流中删除除单引号之间显示的ASCII八进制值之外的所有字符。此命令特别允许以下字符通过此Unix过滤器:

八进制11:选项卡

八进制12:换行

八进制15:回车

八进制40到八进制176:所有“好”的键盘字符

所有其他二进制字符 - 文件中的“垃圾”字符 - 在此转换过程中将被删除。

信用: http://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix

如果你很好奇发生了什么变化或损害在哪里:(可能很长)

diff /var/lib/dpkg/{status-old,status} |less
2
Marcos