Apt-Get 使用 Apt-Cacher NG 时无法获取软件包,出现哈希值不匹配的错误。

我有一台机器,它使用另一台机器上运行的Apt-Cacher NG作为缓存代理。
当我尝试运行"sudo apt-get update"时,我会遇到以下错误:
W: Failed to fetch gzip:/var/lib/apt/lists/partial/it.archive.ubuntu.com_ubuntu_dists_oneiric-updates_main_source_Sources  Hash Sum mismatch
W: Failed to fetch gzip:/var/lib/apt/lists/partial/it.archive.ubuntu.com_ubuntu_dists_oneiric-updates_main_binary-amd64_Packages  Hash Sum mismatch
W: Failed to fetch gzip:/var/lib/apt/lists/partial/it.archive.ubuntu.com_ubuntu_dists_oneiric-updates_universe_binary-amd64_Packages  Hash Sum mismatch
W: Failed to fetch gzip:/var/lib/apt/lists/partial/it.archive.ubuntu.com_ubuntu_dists_oneiric-updates_main_binary-i386_Packages  Hash Sum mismatch
E: Some index files failed to download. They have been ignored, or old ones used instead.

目录 /etc/apt/sources.list.d 是空的。
为了解决这个问题,我已经尝试了以下方法,但都没有成功:
解决方案1:
sudo rm -fr /var/lib/apt/lists
sudo mkdir -p /var/lib/apt/lists/partial
sudo apt-get clean
sudo apt-get autoclean

解决方案2:
sudo apt-get update -o Acquire::http::No-Cache=True

有什么建议吗?

我有时候见过这种行为。在这种情况下,连续运行sudo apt-get update几次会有所帮助,但我不知道为什么,从未深入调查过这个问题。 - oddfellow
1这也会发生在不使用 Apt-Cacher NG 的机器上。 在这些情况下,解决方案1可以解决问题。 - Marco Lackovic
8个回答

我建议放弃使用APT-cacher-ng,试试Squid-deb-proxy。
在我的经验中,APT-cacher-ng被证明非常有问题,还有很多未解决的错误报告。最近,它才被提议重新解封,因为一些重大错误已经修复。对于Ubuntu来说,我很久以前就切换到了Squid-deb-proxy,而且没有后悔过。它是一个很好的替代方案,也是我遇到过的最好的APT缓存工具。
对于Squid-deb-proxy,只需安装squid-deb-proxy软件包,并在/etc/squid-deb-proxy/mirror-dstdomain.acl.d目录下创建一个新文件,添加允许的目标域名。作为额外的好处,客户端可以通过安装squid-deb-proxy-client软件包,在本地网络中自动发现启用缓存的机器。

你可以立即运行以下命令来修复此问题:
http://your-cache-server:3142/acng-report.html?abortOnErrors=aOe&byPath=bP&byChecksum=bS&truncNow=tN&incomAsDamaged=iad&purgeNow=pN&doExpire=Start+Scan+and%2For+Expiration&calcSize=cs&asNeeded=an#bottom

这将删除缓存中的所有损坏文件。

要使此操作永久生效,请查看https://www.unix-ag.uni-kl.de/~bloch/acng/html/maint.html#auto-cleanup

基本上,您可以设置每日缓存清理计划任务,对整个缓存进行完整的校验和匹配。这将捕捉到所有错误大小和其他损坏,并清除这些文件。我编辑了/etc/cron.daily/apt-cacher-ng并在注释后添加了以下内容:

export ACNGREQ="abortOnErrors=aOe&byPath=bP&byChecksum=bS&truncNow=tN&incomAsDamaged=iad&purgeNow=pN&doExpire=Start+Scan+and%2For+Expiration&calcSize=cs&asNeeded=an"

这相当于在维护页面上点击所有到期选项,除了“跳过标题检查...”

1这是唯一一个解决了我系统错误的答案! - Jan
我觉得你的导出字符串开头可能需要一个? - TafT

建议1
sudo rm /var/lib/apt/lists/*gzip*
sudo rm /var/lib/apt/lists/partial/*gzip*
sudo apt-get update

建议二

sudo rm -f /var/cache/apt/partial/*
sudo rm -f /var/cache/apt/*.deb
sudo apt-get update

建议三
sudo touch /etc/apt/apt.conf.d/no-cache
sudo nano /etc/apt/apt.conf.d/no-cache

把这个粘贴进去:
Acquire::http {No-Cache=True;};

现在试试看:
sudo apt-get update

1谢谢,但是这三个都没有起作用。 - Marco Lackovic
设置no-cache为true,效果棒极了!非常感谢!:) - mhenrixon

我一直在使用Ubuntu Precise 12.04 LTS上的apt-cacher-ng进行频繁的战斗(每50次下载中有1次),“Hash Sum Mismatch”和“Invalid Header”错误。自从升级发行版以来,Ubuntu Precise使用的是apt-cacher-ng版本0.7.2-1,到目前为止,对这个软件进行了许多错误修复,而较新的版本0.7.26-1更加稳定。
我已经安装了来自packages.ubuntu.com的Ubuntu Quantal版本的apt-cacher-ng,版本号为0.7.26-1。
我强烈建议获取未来/测试版本的apt-cacher-ng,并手动安装这个更新的软件包。

我的升级总是几乎成功的,大约95%的文件通过代理下载完成,只有最后100个左右的文件因为"哈希值不匹配"而失败,而且没有任何提议的解决方法能起作用。
然后,就只是为了好玩,我把"01proxy"移到了"01proxy.ng",运行了"aptitude update",然后运行了"update-manager"并选择了发行版升级。它继续从archive.ubuntu.com下载剩下的文件(大约70M而不是1G),剩下的升级顺利进行。重新启动后,我将"01proxy.ng"移回到"01proxy",一切恢复正常。
我已经做过这个操作两次了,一次是在代理服务器上,一次是在客户端上,两次都在经过代理时,在那个95%的标记处失败后,都成功地完成了升级。

删除/var/cache/apt-cacher-ng/download.virtualbox.org文件夹确实帮助我解决了apt-get update时出现的“Failed to fetch ... Hash Sum mismatch”错误,该错误导致无法从Oracle服务器下载virtualbox-4.3软件包。

建议4

在Apt-Cacher NG服务器上运行sudo apt-get update && sudo apt-get upgrade -y可能会解决问题。每次出现问题时,您都需要这样做。

建议5

有时候问题出在镜像上:更改服务器和客户端的/etc/apt/sources.list中的镜像可能会解决此问题。


您还可以删除整个存储库文件夹。
rm -r /var/cache/apt-cacher-ng/<repository_folder>

存储有哈希校验不匹配的软件包的位置。

下一次apt请求时,apt-cacher-ng会自动创建一个具有清理哈希校验和的新文件夹。