当我运行时sudo apt-get (anything)
,我总是收到此错误:
dpkg: unrecoverable fatal error, aborting:
files list file for package 'thunderbird-gnome-support' is missing final newline
E: Sub-process /usr/bin/dpkg returned an error code (2)
经过一番谷歌搜索,我了解到这是因为/var/lib/dpkg/info/thunderbird-gnome-support.list
文件已损坏。我cat
找到了那个文件,它肯定已损坏 - 它应该是一个包含绝对文件路径列表的纯文本文件,但它却是一个二进制文件。
现在我检查了同一目录中的其他文件,发现其中许多文件也以同样的方式损坏了。这表明我的文件系统出现了严重错误,导致许多文件损坏。不幸的是,它恰好影响了系统文件。
我该如何恢复呢?
更多细节:
在此之前,我按照 Ubuntu 的提示安装了一个例行更新。这是一个新的 Linux 内核和一些系统文件头。
重新启动后,我的规格如下:
操作系统规格:
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 13.10
Release: 13.10
Codename: saucy
$ uname -a
Linux brendang-linux 3.11.0-24-generic #41-Ubuntu SMP Mon Jun 9 20:36:00 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
第一次重启后,整个文件系统似乎被挂载为只读(以前没有这种情况)。随后我不得不重启几次系统才能正常工作。我touch /forcefsck
在这期间做了许多工作以确保系统fsck
运行,但不确定还需要做什么。
答案1
在我的案例中,我有很多 *.list 文件损坏了。如果你
file /var/lib/dpkg/info/<package_name>.list
你通常会得到:
/var/lib/dpkg/info/<package_name>.list: ASCII text
但如果您的列表文件已损坏,您将得到:
/var/lib/dpkg/info/<package_name>.list: data
我编写了两个脚本来解决这个问题。
第一个脚本检查这一点,并将每个损坏的 .list 文件重命名为 *.list.broken
第二个脚本循环每个 *.list.broken 文件并强制重新安装包。
有时安装会由于触发器问题而失败:
fgets gave an empty string from '/var/lib/dpkg/info/libnih1:amd64.triggers'
在这种情况下,您必须移动/重命名该文件,例如:
mv /var/lib/dpkg/info/libnih1:amd64.triggers /var/lib/dpkg/info/libnih1:amd64.triggers.broken
希望这能帮助面临同样困境的人。
答案2
我按照如下方式解决了这个问题:
- 删除有问题的文件(在 OP 案例中
/var/lib/dpkg/info/thunderbird-gnome-support.list
- 使用重新安装有问题的软件包
apt-get install --reinstall thunderbird-gnome-support
这也为我重新创建了已删除的文件列表。
当然,如果很多文件都损坏了,这可能会很麻烦,但就我而言,这只是一个文件损坏,解决方案非常简单。
答案3
备份损坏的列表(您可以移动所有 .list 文件)
mkdir /tmp/damaged && mv /var/lib/dpkg/info/*.list /tmp/damaged
然后你可以安装新的包
apt install thunderbird-gnome-support