手动删除/var/cache/apt内容是否安全?

在一个磁盘空间非常有限的嵌入式系统上,我发现文件夹/var/cache/apt里面有大约700MB的srcpkgcache.bin.*和一些较大的*.bin文件。
执行sudo apt-get clean并没有明显的改变。
手动删除这些*.bin*文件是否安全?

7从Ubuntu 14.04开始,如果没有正在运行的apt相关进程,可以安全地删除该文件夹中的*.bin文件。下一次apt-get update将重新生成*.bin文件。这个问题明显与/var/cache/apt/archives文件夹中的文件无关,而是与/var/cache/apt/*.bin文件有关。两者之间有很大的区别。前者可以通过执行apt-get clean来清理,而后者必须手动删除。显然,那些投票关闭问题的人没有正确阅读问题。不幸的是,在奖励了我的声望后,我不能投票重新打开。 - 0xC0000022L
3这不是一个重复的问题。链接的答案是关于/var/cache/apt/目录下的子目录archives,而这个问题是关于*.bin*文件的。 - Olaf Dietsche
1可能是从/var/cache/apt中删除文件(不是存档)的重复问题。 - Eliah Kagan
4个回答

其实不是这样的。那些文件可以帮助你的系统确定可用和不可用的内容。清空该目录会导致apt-get系统出错。以下是一些建议。
首先,自动清理
添加一个
DPkg::Post-Invoke { "apt-get clean"; };

将代码/etc/apt/apt.conf的末尾添加上述内容。这样做会使apt和dpkg进程变慢,但会保持缓存目录始终清洁。

接下来,删除存档文件

首先删除并禁用所有未使用的源存档文件。在嵌入式系统中,您可能不需要它们。然后删除所有未使用的存档文件。如果不确定某个软件包来自哪个仓库,可以运行apt-cache policy来查找。

更多删除存档文件

有些PPA仓库中的软件包数量很大,但您只需要其中的1或2个。尝试禁用这些PPA并手动安装deb文件。这样可以节省空间,但会失去自动更新功能。请记住,dpkg会处理依赖关系,因此您仍然可以安装具有大量依赖项的软件包,然后运行apt-get -f install来获取依赖项。

极端解决方案1

因为我们正在讨论嵌入式系统,90%的主要仓库对你没有任何帮助。为了解决这个问题,你可以运行自己的apt-get仓库服务器请参考此链接。这并不容易,对于只有一台机器来说可能会很麻烦。但是如果你有多台这样的机器,那就完全值得。(你的apt仓库服务器可以仅托管你实际使用的软件包的子集。你不需要镜像整个仓库) 极端方法2 如果空间确实是一个如此大的问题,那么你可以完全禁用apt,并通过dpkg手动安装。我在几个嵌入式系统上都不得不这样做过。它能够工作,但是对管理员来说是一场噩梦。

这是一个很好的答案(尤其是那些非常极端的答案),但在Ubuntu 14.04中,/etc/apt/apt.conf已经不存在了。目前最佳实践是什么? - zachaysan
1如果文件不存在,就创建一个。它仍然会被读取。 - coteyr
5请问,为什么您写说删除*.bin文件是不安全的?任何一次运行apt-get update都会从头开始重新生成这些文件(已经测试过)。例如,我的使用情况是我想创建LXC容器模板,并希望尽可能地减少存档。我看不出任何不安全的原因。而且您的回答并没有说明原因,只是声明它是不安全的。已经在Ubuntu 14.04上完全安全进行了测试。 - 0xC0000022L
1你说将apt-cache clean包含在dpkg调用中会导致更干净的缓存,但用户表示apt-cache clean对他们没有起作用。而且你的回答完全错误,因为dpkg不使用/var/cache/apt/*目录的内容来获取有关软件包统计信息。 - Anwar
1apt-get manpage清楚地描述了clean的功能: clean会清除本地存储的软件包文件。 它会从/var/cache/apt/archives/和/var/cache/apt/archives/partial/中删除除了锁文件以外的所有内容。如果这是危险的,就不会有这样的清理功能。 - Anwar

当然可以删除pkgcache.bin和srcpkgcache.bin,没有任何问题。只需要运行apt-get update来重新创建它们即可。

而且不论是否删除了.deb文件,这是真实的吗? - einpoklum
这样做是次优的,因为它会移除所有的仓库签名密钥,导致系统出现故障。 - krad

保留 pkgcache.binsrcpkgcache.bin 文件,其他的可以安全删除。不要触碰目录!

好的,谢谢。我暂时将*bin.*文件移动到了一个备份文件夹中。但是,为什么apt-get会在缓存内部管理缓存呢?缓存目录本质上应该是一个临时存储空间。 - ysap
这个问题已经被报告了。:) 请看这里 - Frantique
您当然可以删除pkgcache.bin和srcpkgcache.bin,不会有任何问题。apt-get update会重新创建它们。 - Tomas M

当然,你可以为此创建一个NFS共享(网络文件系统)。将这些文件留在服务器上,只有在你想要更新/安装软件包时才挂载共享。在嵌入式环境中,安装通常是相对静态的。
sshfs是另一个很好的选择,设置起来更容易(基本上只需要标准的SSH),但它的开销更大(速度较慢)。

这在技术上应该能够运行,除非你无法完全控制 apt 运行的时间。如果你使用类似的方法,你需要确保禁用像 cron 作业这样自动运行 apt-get update 的任务。 - coteyr