由于“哈希和不匹配”错误而无法下载软件包列表

Rob*_*Rob 431 apt

当我检查更新时,出现“无法下载存储库信息”错误。

这是详细信息下的内容:

W: Failed to fetch gzip:/var/lib/apt/lists/partial/us.archive.ubuntu.com_ubuntu_dists_natty_main_source_Sources  Hash Sum mismatch, 
E: Some index files failed to download. They have been ignored, or old ones used instead.
Run Code Online (Sandbox Code Playgroud)

小智 512

只需删除/var/lib/apt/lists目录的所有内容:

sudo rm -rf /var/lib/apt/lists/*
Run Code Online (Sandbox Code Playgroud)

然后运行:

sudo apt-get update
Run Code Online (Sandbox Code Playgroud)

  • 如果删除所有文件,则必须重新下载它们。您只需删除无效文件即可加快此过程。 (83认同)
  • 我记得这也发生在 Debian 上。解决方案是切换存储库(例如,从 us.ubuntu.com 到 XX.ubuntu.com,其中 XX 是您的国家/地区代码)或等待。最好的办法是稍等片刻,稍后重试。删除列表可能会修复损坏的列表,但这种情况很少发生。 (12认同)
  • @AlyssaGono 如果它是一个文件夹,则需要像这样使用递归标志运行 rm :`sudo rm -R /var/lib/apt/lists/*` 但是,即使这样做对我也不起作用。 (8认同)
  • 老问题,但在某些发行版(如 emdebian)上,执行此操作后,您需要“`mkdir /var/lib/apt/lists/partial`”(显然,以 root 身份。),否则您不能“​​`apt -get update`" 或以其他方式使用 apt。 (7认同)
  • 我们需要前缀**-rf**,所以它看起来像`sudo rm -rf /var/lib/apt/lists/*` (3认同)
  • ***有一点很重要:当您查询一个镜像并且它正在从其他镜像更新时有时会发生这种情况***。在这些情况下,您只需要 *** 等待 *** 直到同步完成,然后再试一次。 (3认同)

Rob*_*sak 133

这是一个已知问题,对于代理缓存后面的客户端来说,情况会更加严重。一些大型组织和 ISP(尤其是在世界的偏远地区)具有您可能不知道的透明缓存。

根本问题是 apt 存储库格式在更新镜像时会受到竞争条件的影响。此问题特别影响快速更改的存储库,例如开发版本。

您可以在此错误中跟踪修复进度(请在错误中将自己标记为“也影响我”)和此蓝图。但请注意,这是一个复杂的问题,可能需要多个版本才能解决。

  • 这个错误也存在于 ubuntu 16.04 (16认同)
  • [那个蓝图](https://blueprints.launchpad.net/ubuntu/+spec/servercloud-q-apt-improvements) 不再可用;这是[存档副本](https://web.archive.org/web/20120512155146/https://blueprints.launchpad.net/ubuntu/+spec/servercloud-q-apt-improvements)。 (4认同)

Eva*_*van 113

解决此问题的最简单方法是:

sudo apt-get clean
sudo apt-get update
Run Code Online (Sandbox Code Playgroud)

  • 做`sudo rm -rf /var/lib/apt/lists/*`然后`sudo apto-get clean`也为我解决了这个问题。两者都不是孤立的。 (22认同)
  • 尝试接受的答案后,我仍然遇到相同的错误,此后立即尝试解决了问题 (12认同)
  • 对 ubuntu 16.04 没有帮助......上面的评论也没有帮助 (3认同)
  • `sudo apt-get clean` 对 16.04 没有帮助,但 `sudo rm -rf /var/lib/apt/lists/*` 修复了它 (3认同)
  • 对我来说,接受的答案不起作用,但这个答案有效(Ubuntu 16.04)。 (2认同)
  • 我有一些不匹配,发现需要重复几次 `clean` 和 `update` 来修复它们。 (2认同)

Ami*_*val 76

唯一对我有用的解决方案来自unix.stackexchange

发生这种情况是因为它有一个已知的错误,解决方案是使用不同的压缩方法进行更新,以便文件正确加载并且校验和成功。

试试这个:

sudo rm -rf /var/lib/apt/lists/partial
sudo apt-get update -o Acquire::CompressionTypes::Order::=gz
Run Code Online (Sandbox Code Playgroud)

(感谢@brook_hong 来自 rm 部分的评论)

  • 这是这里唯一对我有用的解决方案。谢谢。 (11认同)
  • 它也对我有用。请注意,您不必总是运行此命令。只需运行一次,然后您就可以毫无错误地运行“apt-get update”。 (3认同)
  • 这是唯一对我有用的解决方案,我使用的是 Ubuntu 16.04 (3认同)
  • 我尝试使用来自各种论坛的通用解决方案,但这是开箱即用的。谢谢你。 (2认同)
  • 在 Ubuntu 16.04/linux mint 上为我工作 (2认同)

m13*_*13r 50

删除目录并执行sudo apt-get update.
只有以下步骤解决了我的问题:

sudo sed -i -re 's/\w+\.archive\.ubuntu\.com/archive.ubuntu.com/g' /etc/apt/sources.list
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是修复它的正确方法......
我在这里找到了解决方案。

  • 这是唯一适用于 Ubuntu 20.04.2 LTS 的解决方案。谢谢! (2认同)

Jor*_*tro 25

当您的镜像不是最新的或因超载而导致服务错误时,就会发生这种情况。您可以稍等片刻再试,或者切换到另一个镜像:

  • @EliahKagan 问题通常不是文件本身已损坏,而是有一个(我正在简化但不是太多)数据文件和一个包含数据文件哈希(指纹)的索引文件。当服务器上的存储库更新(每小时发生一次)时,一个文件一个文件一个一个地更新。现在,当数据文件已更新但索引文件尚未更新(反之亦然)时,您的客户端(apt-get 或类似的)可能会访问服务器。然后哈希与数据文件不匹配,客户端(错误地)假设数据文件已损坏。 (4认同)
  • 为什么服务器不是最新的或过载,导致具有正确名称的文件*成功*下载(从某种意义上说,在发送和接收所有字节之前连接不会终止),而是被损坏? (我不是断言这不会发生,我只是希望你能解释为什么会这样。) (2认同)

Mus*_*ffa 12

如果您使用代理,则创建一个名为99fixbadproxyin的文件/etc/apt/apt.conf.d/

sudo gedit /etc/apt/apt.conf.d/99fixbadproxy
Run Code Online (Sandbox Code Playgroud)

99fixbadproxy将其粘贴到并保存:

Acquire::http::Pipeline-Depth 0;
Acquire::http::No-Cache true;
Acquire::BrokenProxy    true;
Run Code Online (Sandbox Code Playgroud)

现在运行更新命令:

sudo apt-get update
Run Code Online (Sandbox Code Playgroud)

  • 哇,我正在尝试每个答案,奇怪的是有多少不同的问题似乎导致了相同的症状。 (2认同)
  • 我非常感谢这个答案 (2认同)

Tre*_*rey 6

接受的答案,如果您有与CDN的问题很少会工作(内容分发网络,缓存/世界各地镜子含有容易名单和包)。如果 a) 您使用的是PPA或本地镜像,或者 b) 只需要解决一个不匹配问题,它就会起作用。

注意:如果您在上述问题的日志中给出了特定的错误消息,则接受的答案应该始终有效。但是还有其他几个问题已被关闭,作为这个问题的重复,其中接受的答案是不够的。

不过,尝试并没有什么坏处,所以从以下开始:

sudo rm -rf /var/lib/apt/lists/*
sudo apt-get update
Run Code Online (Sandbox Code Playgroud)

可能足以继续执行sudo apt-get upgrade或其他后续命令。

但如果它不起作用...

您也可能会从命令中收到“哈希和不匹配”错误。如果发生这种情况,请运行:

sudo apt-get update --fix-missing
Run Code Online (Sandbox Code Playgroud)

甚至这个命令也有可能抛出“Hash sum mismatch”错误,因为这个问题可能来自暂时的网络内容错误。如果是这样,继续重新运行上面的--fix-missing命令,直到它成功完成。例如,像:

until sudo apt-get update --fix-missing; do echo trying again; done
Run Code Online (Sandbox Code Playgroud)

(它应该在 的每次运行中取得进展apt-get update --fix-missing;如果连续运行没有将错误减少到零,请按Ctrl-c中断循环。然后返回到本答案的开头,删除 的内容并重/var/lib/apt/lists试。)

在此之后,更新可能会起作用,但可以肯定的是,首先运行apt-get clean,如下所示:

sudo apt-get clean
sudo apt-get update
Run Code Online (Sandbox Code Playgroud)

请注意,如果您这样做是为了准备apt-get upgrade,则有可能(甚至可能,如果您有足够的不匹配需要更新多次)升级将失败并出现“哈希和不匹配”错误。如果是这样,请添加--fix-missing到您的升级命令中:

sudo apt-get clean
sudo apt-get upgrade --fix-missing
Run Code Online (Sandbox Code Playgroud)

然后再试一次。(apt-get upgradewith--fix-missing也会尝试阻止失败的包并继续其他包,所以你应该看到至少运行一次的一些额外进展。)

但是如果还是不行的话...

与前面的until sudo...命令一样,您可以通过重复此命令(始终在上面的命令之前)获得一些进一步的进展clean,您甚至可以自动执行

until (sudo apt-get clean; sudo apt-get upgrade --fix-missing --yes); do echo trying again; done
Run Code Online (Sandbox Code Playgroud)

但是,通常情况下,它会在您第一次运行它时升级大多数可升级的软件包--fix-missing,然后卡在相同的软件包上,没有进一步的进展。此时,您需要使用 返回到开头sudo rm -rf /var/lib/apt/lists/*并重试。整个过程值得尝试两三次,特别是如果您有几十个或几百个可升级的软件包。


小智 5

以下命令可能会解决您的问题。

sudo rm -R /var/lib/apt/lists/partial/*
Run Code Online (Sandbox Code Playgroud)

进而

sudo apt-get update && sudo apt-get upgrade
Run Code Online (Sandbox Code Playgroud)

它会解决你的问题。我也遇到了同样的问题,但上面的命令为我解决了这个问题。所以给他们一个尝试。

解决方案参考

  • 我刚试过,没有用;第一个 `apt-get update` 在该目录中的同一位置再次创建了文件。 (5认同)