/var/lib/dpkg/info/目录下的许多文件已损坏;如何恢复?

每当我运行sudo apt-get (任何命令)时,总是会出现这个错误:
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文件已损坏。我查看了一下这个文件,果然是损坏的——它应该是一个纯文本文件,包含一系列绝对文件路径,但现在却成了一个二进制文件。
现在我检查了同一目录中的其他文件,发现很多文件都以同样的方式损坏。这表明我的文件系统出了严重问题,导致许多文件损坏。不幸的是,其中也包括了系统文件。
那么我该如何恢复呢?
更多细节:
就在这之前,当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有同样的问题。你解决了吗? - XiaoChuan Yu
3个回答

在我的情况下,我有很多*.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。

move_broken_list_files.sh

对于每个*.list.broken文件,执行第二个脚本循环并强制重新安装该软件包。

install_missing_list.sh

有时安装失败是因为触发器的问题。
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

希望这能帮助到面临相同困境的人。

我遇到了和楼主报告的完全相同的问题。你的解决方案帮助我从这个情况中恢复过来(在Debian Sid上)。不过,我仍计划进行完整的操作系统重新安装。我仍然想知道是什么导致了所有这些文件损坏。我认为可能是我的固态硬盘出了问题或者是一个糟糕的dpkg版本发布。 - Julián Landerreche
谢谢你教我如何使用file命令——我甚至不知道它的存在!我刚刚对每个(3个)二进制文件运行了mv <NAME>.list <NAME>.list.BINARY。这些文件位于/etc/apt/sources.list.d目录下(在它们上面运行nano命令只显示了一堆^@符号)。然后我又运行了cp <NAME>.list.save <NAME>.list,看起来好像可以工作了!:D - TheTechRobo the Nerd
是的,它正在运作中 :D - TheTechRobo the Nerd
太棒了!我使用了你的两个脚本,如预期一样,成功修复了一堆损坏的文件。谢谢! - Rodrigo Hjort

备份您的损坏列表(您可以移动所有.list文件)
mkdir /tmp/damaged && mv /var/lib/dpkg/info/*.list /tmp/damaged

然后,您可以安装您的新软件包。
apt install thunderbird-gnome-support

我是这样解决的:
  • 删除有问题的文件(在 OP 的情况下是 /var/lib/dpkg/info/thunderbird-gnome-support.list
  • 使用 apt-get install --reinstall thunderbird-gnome-support 重新安装有问题的软件包

这也为我重新创建了已删除的文件列表。

当然,如果有很多文件损坏,这可能会很麻烦,但在我的情况下只有一个文件出了问题,所以解决方案非常简单。