当我想安装新软件包时,通常会收到如下响应:
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 希望更快一点。它不会向远程服务器发出多个请求来获取整个目录,而是只发出一个请求,然后根据需要进行更新。同样,这个过程确实使您的速度更快,允许您查看当前可用的所有软件包,并且通过仅在本地加载一次来减轻所有试图查看目录的人的负担。
如果你在很长一段时间内只做一个包,它可能看起来确实是一种巨大的时间浪费......但它的实现确实对每个人都有帮助。