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

bgu*_*uiz 6 updates filesystem apt dpkg kernel

当我运行时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)
Run Code Online (Sandbox Code Playgroud)

经过一番谷歌搜索,我了解到这是因为/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
Run Code Online (Sandbox Code Playgroud)

第一次重新启动后,整个文件系统似乎以只读方式挂载(以前不是这种情况)。随后,在系统工作之前,我不得不重新启动几次。我已经touch /forcefsck在它们之间完成以确保fsck运行,但不确定还需要做什么。

小智 6

就我而言,我有很多 *.list 文件损坏。如果你这样做

file /var/lib/dpkg/info/<package_name>.list
Run Code Online (Sandbox Code Playgroud)

你通常应该得到:

/var/lib/dpkg/info/<package_name>.list: ASCII text
Run Code Online (Sandbox Code Playgroud)

但如果您的列表文件已损坏,您将得到:

/var/lib/dpkg/info/<package_name>.list: data
Run Code Online (Sandbox Code Playgroud)

我制作了两个脚本来解决这个问题。

第一个脚本检查这一点并将每个损坏的 .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'
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您必须移动/重命名该文件,例如:

mv /var/lib/dpkg/info/libnih1:amd64.triggers /var/lib/dpkg/info/libnih1:amd64.triggers.broken
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助面临同样困境的人。


小智 0

我解决这个问题如下:

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

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

当然,如果很多文件都损坏了,这可能会很麻烦,但在我的例子中,它只是一个文件,并且在这种情况下解决方案非常简单。


小智 0

备份损坏的列表(您可以移动所有 .list 文件)

mkdir /tmp/damaged && mv /var/lib/dpkg/info/*.list /tmp/damaged
Run Code Online (Sandbox Code Playgroud)

然后,您可以安装新软件包

apt install thunderbird-gnome-support
Run Code Online (Sandbox Code Playgroud)