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

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

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

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

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

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

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

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

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

3.然后运行apt-get update:

 sudo apt-get update 

应该这样做。

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

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

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

 sudo dpkg -r handbrake-cli 

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

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

这是一个错误(应该修复): 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 

的儿子…

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

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

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

因为即使使用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八进制值之外的所有字符。 此命令特别允许以下字符通过此Unixfilter:

八进制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