为什么我需要不断更新我的 apt 缓存?

为什么我需要不断更新我的 apt 缓存?

当我想安装新软件包时,通常会收到如下响应:

oliver@cloud:~$ sudo apt-get install unison
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package unison

我已经知道了这种模式,我继续:

oliver@cloud:~$ sudo apt-get update
Hit http://downloads-distro.mongodb.org dist Release.gpg
Ign http://downloads-distro.mongodb.org/repo/debian-sysvinit/ dist/10gen Translation-en
Ign http://downloads-distro.mongodb.org/repo/debian-sysvinit/ dist/10gen Translation-en_US
Hit http://downloads-distro.mongodb.org dist Release
Ign http://downloads-distro.mongodb.org dist/10gen amd64 Packages
Ign http://downloads-distro.mongodb.org dist/10gen amd64 Packages
Ign http://http.debian.net/debian/ squeeze/contrib Translation-en_US
Ign http://http.debian.net/debian/ squeeze/main Translation-en_US
Ign http://http.debian.net/debian/ squeeze/non-free Translation-en_US
...

oliver@cloud:~$ sudo apt-get install unison
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  unison
0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded.
Need to get 693 kB of archives.

如果我明天想安装一个新的软件包,服务器将不会知道它,直到我update再次安装。我只在 Debian 服务器上注意到这一点,并且我不知道有任何调整会导致这种情况。

我了解本地缓存的需要,我的问题是每当我想安装新东西时它似乎都会被重置。我希望缓存能够在更长的时间内保持填充状态。通常,当我第二天想安装新的东西时,apt-get会告诉我它无法找到该软件包。

在此服务器上,cron-apt已安装。我必须假设它是默认安装的。cron-apt设置为每晚 4:00 运行。它似乎是我丢失缓存的原因:

oliver@cloud:/var/lib/apt/lists$ sudo apt-get update
...
Fetched 12.1 MB in 11s (1,023 kB/s)
Reading package lists... Done
oliver@cloud:/var/lib/apt/lists$ ls /var/lib/apt/lists/ | wc -l
24
oliver@cloud:/var/lib/apt/lists$ sudo /usr/sbin/cron-apt
oliver@cloud:/var/lib/apt/lists$ ls /var/lib/apt/lists/ | wc -l
8

我不太确定为什么会发生这种情况,因为据我所知,其中一项工作cron-apt实际上是调用 apt-get update:

oliver@cloud:/var/lib/apt/lists$ cat /etc/cron-apt/action.d/0-update
update -o quiet=2

答案1

你的问题有点模糊。如果问题是“为什么我必须运行 apt-get update”,答案是 apt 的更新可能是一个耗时的过程。每次我必须安装软件包时都这样做会增加相当多的时间。通常每天更新一次缓存(理想情况下以自动方式)就足够了。

“如果我想明天安装一个新的软件包,服务器将不会知道它,直到我再次更新。我只在 Debian 服务器上注意到这一点,并且我不知道任何会导致这种情况的调整。”

我对这部分很模糊。你是说如果明天有新版本的 unison 可用,你怎么知道?同样,如果您每天至少运行一次 apt-get update(例如,通过 cron 脚本),那么 apt 将获知它有新的软件包。也就是说,它不会自动告诉您有新的软件包可用;而是会自动告诉您新的软件包可用。这是有充分理由的,因为升级软件包有时会导致系统稳定性问题,而用户有必要解决这些问题。

一般来说,在基于 Debian 的系统上,增量更新版本的软件不一定更好。我通常不关心次要版本升级,除非存在安全问题,或者新版本中有我知道我需要的功能。

答案2

通常,这仅意味着您在上次更新中获取的确切版本信息在 Debian 服务器上不再可用,因为它已被新版本取代。但在 Squeeze 上这种情况不应该发生太多(即使考虑到安全更新)。另一种选择是一些奇怪的脚本(我不知道有任何这样的脚本)定期清理您的/var/lib/apt/lists目录,该目录缓存服务器上可用的包列表(以及 apt-get update 获取的目录)。除非您在服务器上关注不稳定的甚至是实验性的(这看起来有点奇怪),在这种情况下软件包会经常更新,因此缓存列表很快就会过时。因此,我的建议是训练您的肌肉记忆apt-get update,以便在每次开始安装过程时首先拨打电话。

答案3

我终于能够解决这个问题了。正如之前所假设的,cron-apt这是罪魁祸首。或者更具体地说它的配置。

让我困惑的第一件事是,它cron-apt甚至已经安装了。因为我的其他机器上没有默认安装它。仅在我遇到此问题的 VPS 提供商的计算机上。我发现它的存在令人困惑,因为我假设脚本已经提供了类似的机制/etc/cron.daily/apt。无论哪种方式,如问题所示,运行cron-apt都会减少缓存的信息量。

我一开始没能看到为什么这就是原因,因为cron-apt实际上每天都在执行更新。

oliver@cloud:/$ cat /etc/cron-apt/action.d/0-update
update -o quiet=2

那么这是怎么回事呢?

/usr/sbin/cron-apt我只是通过逐行执行脚本才发现问题所在。我意识到这$APTCOMMAND总是会被附加额外的$OPTIONS内容。结果调用如下所示:

/usr/bin/apt-get -o quiet=1 -o Dir::Etc::SourceList=/etc/apt/security.sources.list update -o quiet=2

因此,我查看/etc/cron-apt/config并发现了该$OPTIONS块:

# General apt options that will be passed to all APTCOMMAND calls.
# Use "-o quiet" instead of "-q" for aptitude compatibility.
#  OPTIONS="-o quiet=1"
# You can for example add an additional sources.list file here.
#  OPTIONS="-o quiet=1 -o Dir::Etc::SourceList=/etc/apt/security.sources.list"
# You can also set an alternative sources.list file here.
#  OPTIONS="-o quiet=1 -o Dir::Etc::SourceList=/etc/apt/security.sources.list -o Dir::Etc::SourceParts=\"/dev/null\""
OPTIONS="-o quiet=1 -o Dir::Etc::SourceList=/etc/apt/security.sources.list"
# If you want to allow unauthenticated and untrusted packages add the
# following to your options directive.
#  OPTIONS="-o quiet=1 -o APT::Get::AllowUnauthenticated=true -o aptitude::Cmdline::ignore-trust-violations=yes"
# To limit the bandwidth used use the following line. This example limit the
# bandwidth usage to 25 kB/s.
#  OPTIONS="-o Acquire::http::Dl-Limit=25"

一根线伸出来。没评论的那个。很明显,默认情况下这条线不存在(我也在另一个系统上很快确认了这一点)。

如果不明显,这些选项的原因是缓存的源每天晚上都会被安全列表的内容覆盖(并且仅有的那些)。

VPS 提供商已确认这是对其 Debian 安装映像的定制。我已经删除了有问题的设置,现在一切都恢复正常了。

答案4

当然,你知道在需要之前你不必更新......正在发生的事情是信息目录的一部分被本地传输到你的计算机,以使 apt-get 希望更快一点。它不会向远程服务器发出多个请求来获取整个目录,而是只发出一个请求,然后根据需要进行更新。同样,这个过程确实使您的速度更快,允许您查看当前可用的所有软件包,并且通过仅在本地加载一次来减轻所有试图查看目录的人的负担。

如果你在很长一段时间内只做一个包,它可能看起来确实是一种巨大的时间浪费......但它的实现确实对每个人都有帮助。

相关内容