当尝试进行更新时,如何修复“MergeList问题”或“无法解析状态文件”的错误?

电脑在窗口中给了我这个输出结果:
E: Encountered a section with no Package: header
E: Problem with MergeList /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_natty_main_binary-i386_Packages
E: The package lists or status file could not be parsed or opened.

怎么修复这个问题?

8这个操作系统更新的处理方式让我感到困惑,尤其是在没有用户不当使用的情况下,仍然存在类似问题需要解决。 - matanster
10个回答

这些终端命令应该能解决你的问题:
首先,通过打开终端(按下Ctrl+Alt+T启动)并运行以下命令*来删除合并列表:

sudo rm -vf /var/lib/apt/lists/*

接下来,通过运行一个简单的更新操作来生成一个新的。
sudo apt-get update

这里是错误报告(以及另一个)关于这个问题的。问题已经修复,所以不应该再创建新的格式错误文件。然而,如果您已经有了格式错误的文件,您需要按照这篇帖子中的说明将它们删除。
*用于rm的选项有-v详细模式

-v, --verbose 解释正在执行的操作

-f强制模式

-f, --force 忽略不存在的文件和参数,不提示

如果您对命令行或使用的选项有任何疑问,请始终参考该命令的手册页面。可以通过在互联网上搜索man和命令来访问这些页面,例如man rm,或者您可以在终端中键入完全相同的命令,例如man rm,退出页面的指令将显示在终端底部,如下所示

picture of man page options


8有一个人发现他不得不多次执行这两个步骤,但最终它起作用了。 - John S Gruber
这对于 Ubuntu 13.04(sources.list 从未手动编辑过)的出厂设置也适用于错误“读取软件包列表... 错误!E: Description-md5 行格式不正确;包含无效字符 'fc1f7600accbcc"07ef9954ba3306c14' E: 无法解析或打开软件包列表或状态文件。”。 - Nicolas Raoul
5rm命令的末尾加上-vf是很奇怪的。 - Keith Thompson
不是rm,而是更倾向于使用apt-get clean吗? - Pablo Hoffman
9对我来说,这并没有解决问题。更新仍然显示着那个错误。 - marines
@KeithThompson 对我来说也很奇怪,但实际上在最后添加强制选项-f是非常聪明的做法,尤其是如果rm命令中有一个*,而且可能会意外地在/var/lib/apt/lists/*之间输入了一个空格 - Volker Siegel
3我必须像这里所示的那样同时执行这两个操作:https://askubuntu.com/questions/410045/the-package-lists-or-status-file-could-not-be-parsed-or-opened,并删除状态文件。 - SDsolar


1-vf是什么作用? - speedox
5根据man rm-v表示“详细模式”,-f表示“强制模式”。换句话说,删除所有指定的文件时不需要提示,并告知用户正在进行的操作。 - fouric
在我的情况下,只需执行sudo apt-get update命令就解决了问题。我想Allan提到过更新版本的apt会自动修复这个问题,所以你可以先尝试执行更新命令。 - ThorSummoner

当你编辑了/var/lib/dpkg/status时,你搞砸了。从你编辑之前的备份中恢复它。当然,你做了备份,对吧?

既然你没有做备份,那就小心地再次编辑它。尽量不要造成更多损害。

你可以使用/var/lib/dpkg/status.old作为参考点。这是在上一次运行dpkg之前的status文件的备份。运行

diff /var/lib/dpkg/status.old /var/lib/dpkg/status

查看差异。撤销您手动进行的更改,并保留由最后一个 dpkg 运行所做的更改。

如果您真的无法修复该文件,请将 /var/lib/dpkg/status.old 复制到 /var/lib/dpkg/status。您将得到一个格式良好但过时的软件包数据库。

在正常操作中,您永远不需要编辑 /var/lib/dpkg/status。即使出现严重问题,/var/lib/dpkg/status 也不是需要管理员干预的内容。无论您对 crossplatformui 的问题是什么,可能有更好的解决方法。我只有在上游的 Packages 文件损坏时才需要编辑 /var/lib/dpkg/status


我也想知道你提到的更好的方法来移除crossplatformui,如果你能帮忙的话。 因为我已经尝试了各种可能的方式来移除它,并且寻找了许多解决方案,但只有我提到的那个方法有效。 - Nirmik
1@Nirmik 关于“crossplatformui”我不清楚。请将其作为一个独立的问题提出来。我可以告诉你,十多年来使用“dpkg”,包括许多非官方来源,我非常非常少需要编辑“status”文件,只有在存在损坏的第三方软件源时才会需要编辑。 - Gilles 'SO- stop being evil'
好的...再次非常感谢....如你建议的,我会将它作为一个新问题发布 :) 另外,由于你似乎是一个非常高级的用户,我想问一下你是否了解如何使不起作用的热键正常工作? (我的无线键不起作用) - Nirmik
尝试将旧的放在新的位置,对我来说没有修复好。 :-( - Stéphane Gourichon
1关于您编辑了 /var/lib/dpkg/status 文件的问题,我并没有碰过这个文件,所以并不是我的问题。然而,在我的情况下,这是唯一解决问题的方法。谢谢。 - ruslo

我做了。
sudo apt-get clean
sudo apt-get update

而且它起作用了。

2没有为我修好。 :-( - Stéphane Gourichon

按照软件包管理器故障排除程序中的2-5步骤通常可以解决此问题。

对于第二步,请禁用所有的PPA。您可以以与取消一个PPA相同的方式在“软件源”中取消选中它们;请参阅如何禁用特定的PPA?。您稍后可以重新启用它们。

对于第三步,请关闭您可以关闭的任何打开的程序。保持您的网络浏览器打开是安全的,这样您就可以在面前有着相关指示。但是特别重要的是确保没有正在运行的软件包管理器。这包括软件中心、软件更新(旧版Ubuntu中的“更新管理器”)、Synaptic和Gdebi。还包括命令行软件包管理实用工具,如apt-getdpkgaptitude

请注意,如果同时有其他用户登录,他们应该尽可能退出。

对于第四步,请打开一个终端窗口。无论您使用什么桌面环境,都可以通过按下Ctrl+Alt+T的方式来做到这一点。

在终端窗口中运行以下命令,以完成第5步
ubuntu-support-status
sudo grep -R proxy /etc/apt/*
grep proxy  /etc/environment
echo $http_proxy
echo $ftp_proxy
grep proxy /etc/bash.bashrc
grep proxy ~/.bashrc
cat /etc/apt/apt.conf
sudo fuser -vvv /var/lib/dpkg/lock
sudo fuser -vvv /var/cache/apt/archives/lock
cat /etc/lsb-release
uname -a
sudo rm /var/lib/apt/lists/lock 
sudo rm  /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
sudo cp -arf /var/lib/dpkg /var/lib/dpkg.backup
sudo mv /var/lib/dpkg/status /var/lib/dpkg/status-bad
sudo cp /var/lib/dpkg/status-old /var/lib/dpkg/status  ||  sudo cp /var/backups/apt.extended_states.0 /var/lib/dpkg/status
sudo mv /var/lib/dpkg/available /var/lib/dpkg/available-bad
sudo cp /var/lib/dpkg/available-old /var/lib/dpkg/available
sudo rm -rf /var/lib/dpkg/updates/*
sudo rm -rf /var/lib/apt/lists
sudo rm /var/cache/apt/*.bin
sudo mkdir /var/lib/apt/lists
sudo mkdir /var/lib/apt/lists/partial
LANG=C;sudo apt-get clean
LANG=C;sudo apt-get autoclean
LANG=C;sudo apt-get --purge autoremove
LANG=C;sudo apt-get --fix-missing update -o APT::Cache-Limit=100000000
sudo dpkg --configure -a
sudo dpkg --clear-avail
LANG=C;sudo apt-get -f install
LANG=C;sudo apt-get --fix-missing install
LANG=C;sudo apt-get update -o APT::Cache-Limit=100000000 && sudo apt-get dist-upgrade
find /etc/apt -name '*.list' -exec bash -c 'echo -e "\n$1\n"; cat -n "$1"' _ '{}' \;

我在2014年3月2日从PackageManagementTroubleshoootingProcedure中直接复制了这段文字。这些命令在过去已经发生了变化,并且该文章中推荐的命令可能会在未来再次改变或扩展。因此,你可能希望从那里的第5步开始操作。(这篇文章由“Ubuntu文档维基的贡献者”(特别是Mark Rijckenberg创建/编辑,以CC-BY-SA 3.0许可证发布,允许在适当归属的情况下在这里包含。)
有些命令试图修复问题(并且可能显示诊断信息);其他命令则提供有关问题的有价值信息,您可以将其包含在您的问题中或提供给帮助您的人。根据您的技能,它们还可以帮助您诊断和解决问题。
通常情况下,这些命令可以修复问题,但如果不能修复,它们通常会提供足够的信息来解决问题。
您不必手动输入这些命令,您可以复制并粘贴它们。我建议逐个粘贴并运行每个命令,这样可以清楚地知道哪个命令产生了哪些输出。

我把整个代码块复制粘贴了,而不是一个一个地运行。虽然其中有几个命令是无用的,有些还失败了,但最终它确实对我的情况有所帮助。 - phuclv

我也见过这个问题发生在你的仓库中有太多源的情况下。
尝试上面发布的解决方案,或者也许还可以尝试一下在launchpad上有时推荐的方法。
sudo mv /var/lib/apt/lists /var/lib/apt/lists-old
sudo mkdir -p /var/lib/apt/lists/partial
sudo apt-get update

让我们知道你的进展情况。

谢谢!即使没有makedir,这也无法在DSL上运行。 - Doug

我遇到了同样的问题,并尝试了其他答案中提到的所有故障排除方法。奇怪的是,唯一的解决办法是另一个步骤:
1. 打开“软件和更新” -> “Ubuntu软件” -> “下载自” -> “其他” -> “选择最佳服务器” 2. 等待测试完成。在测试结束时,将选择最佳服务器,不一定是最近的服务器、主服务器或适合您所在地区的服务器。 3. 现在重新加载仓库数据,它将正常完成。

我遇到了一个类似的错误:
Reading package lists... Error!
E: Encountered a section with no Package: header
E: Problem with MergeList /var/lib/dpkg/status
E: The package lists or status file could not be parsed or opened.

我按照类似的建议复制了status-old
$ head /var/lib/dpkg/status
$ head /var/lib/dpkg/status-old

所有我的状态文件出于某种原因都是空白的。幸运的是,我发现这些文件有备份:
$ ls -l /var/backups/dpkg.status.*
-rw-r--r-- 1 root root 444620 Nov 15 06:33 /var/backups/dpkg.status.0
-rw-r--r-- 1 root root 444620 Nov 15 06:33 /var/backups/dpkg.status.1.gz
-rw-r--r-- 1 root root 128168 Sep 20  2013 /var/backups/dpkg.status.2.gz
-rw-r--r-- 1 root root 112545 Sep 16  2013 /var/backups/dpkg.status.3.gz
-rw-r--r-- 1 root root 107767 Sep 14  2013 /var/backups/dpkg.status.4.gz
-rw-r--r-- 1 root root 107766 Sep 11  2013 /var/backups/dpkg.status.5.gz
-rw-r--r-- 1 root root  94583 Sep 11  2013 /var/backups/dpkg.status.6.gz

我检查了最新的备份...
$ head /var/backups/dpkg.status.0

...但它仍然是空白的。所以我解压了一个更旧的版本...
$ gunzip /var/backups/dpkg.status.1.gz
$ head /var/backups/dpkg.status.1

这次有内容。所以我复制了它...

$ cp /var/backups/dpkg.status.1 /var/lib/dpkg/status

然后 apt-get update 顺利运行。

感谢这篇帖子。


我遇到了同样的问题。这些命令解决了它:
sudo mv /var/lib/dpkg/status /var/lib/dpkg/status-new
sudo mv /var/lib/dpkg/status-old /var/lib/dpkg/status
sudo apt-get update

这个问题的一次性解决方案是在终端中依次运行以下两个命令:Ctrl+Alt+T
sudo rm -r /var/lib/apt/lists/*

你可以使用这个命令生成一个新的。
sudo apt-get clean && sudo apt-get update

完成!那应该解决了“合并列表问题”的错误。

参考:如何修复Ubuntu更新错误:合并列表问题