如何重建损坏的dpkg状态文件?
每当我键入sudo apt-get remove
然后按Tab键进行自动完成时,我会收到以下消息:
grep-status: /var/lib/dpkg/status:15945: expected a colon .
我没有在状态文件中的第15945行看到任何特别奇怪的内容。 它是单声道程序包的描述字段中的点字符,插入冒号没有帮助。 删除包含点的行也不起作用。 使用status-old覆盖文件会产生相同的消息。
有没有办法重建状态文件?
我终于修复了我的系统。 恢复状态文件的备份不起作用,因为我有这么长时间的问题,它在我的所有备份中。
该修复涉及到实际格式化中断的grepping并手动修复它们。 它并不像听起来那么难。
您应该能够使用以前已知的良好状态文件并从那里进行更新。 每次执行安装或更新时,状态文件都会保存到/ 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