/var/lib/dpkg/info/ 中的许多文件已损坏;如何恢复

/var/lib/dpkg/info/ 中的许多文件已损坏;如何恢复

当我运行时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

移动_破碎_列表_文件.sh

第二个脚本循环每个 *.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

相关内容