总结
最近,在正常的软件升级过程中(即apt upgrade
或apt dist-upgrade
),我开始收到如下消息:
[...]
The following packages have been kept back:
[...]
0 upgraded, 0 newly installed, 0 to remove and [...] not upgraded.
我有什么选择?
笔记:这是不是与这里已经提出的无数类似问题重复。你应该把我的问题视为对这个问题。
我有确切地我的主要 Ubuntu 22.04 系统上出现了与上述问题相同的问题。我更换了服务器,尝试手动安装命名的包,昨天问题不知怎么就解决了。今天,当我尝试安装任何新更新时,我收到一条消息,说我有 32 个包被保留了下来。
我有一个类似的 22.04 版(虚拟)Ubuntu 安装,现在已完全更新,并且尚未出现此问题(具有类似的/etc/apt/sources.list
文件)。因此,我尝试比较这些软件包。我以主系统中“保留”的软件包gir1.2-gstreamer-1.0
为例,并在主系统上运行:
$ sudo apt --installed list | grep gir1.2-gstreamer-1.0
[...]
gir1.2-gstreamer-1.0/jammy,now 1.20.1-1 amd64 [installed,upgradable to: 1.20.3-0ubuntu1]
相同命令给出输出:
gir1.2-gstreamer-1.0/jammy,now 1.20.1-1 amd64 [installed,automatic]
在我的辅助(虚拟)系统上。
为什么会有这种差异?而且,我怎样才能使我的主系统表现为“自动”安装软件包的(虚拟)系统?
该命令在我的“主”系统上的输出apt-cache policy gir1.2-gstreamer-1.0
如下:
gir1.2-gstreamer-1.0:
Installed: 1.20.1-1
Candidate: 1.20.3-0ubuntu1
Version table:
1.20.3-0ubuntu1 500 (phased 30%)
500 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
*** 1.20.1-1 500
500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
100 /var/lib/dpkg/status
在我的“辅助”(虚拟)系统上是这样的:
gir1.2-gstreamer-1.0:
Installed: 1.20.1-1
Candidate: 1.20.1-1
Version table:
1.20.3-0ubuntu1 1 (phased 30%)
500 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
*** 1.20.1-1 500
500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
100 /var/lib/dpkg/status
500
(该行中的)值(phased...
代表什么意思?
在两个系统上grep -ri phased /etc/apt
均不返回任何内容。
sudo apt update && sudo apt upgrade gir1.2-gstreamer-1.0
在我的主系统上执行该命令后:
$ sudo apt --installed list | grep gir1.2-gstreamer-1.0
[...]
gir1.2-gstreamer-1.0/jammy-updates,now 1.20.3-0ubuntu1 amd64 [installed]
$ apt-cache policy gir1.2-gstreamer-1.0
gir1.2-gstreamer-1.0:
Installed: 1.20.3-0ubuntu1
Candidate: 1.20.3-0ubuntu1
Version table:
*** 1.20.3-0ubuntu1 500 (phased 40%)
500 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
100 /var/lib/dpkg/status
1.20.1-1 500
500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
现在,在我的辅助系统上我也开始遇到这个问题:
$ sudo apt upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
language-pack-gnome-en
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
答案1
分阶段更新是一项安全功能
- 有些用户会先获得升级的软件包,并能够报告损坏的软件包,而不是所有人立刻就会收到损坏的软件包,令数百万用户困惑不已。
它的存在是为了保护你。不要试图超越它。
- 由于分阶段更新而被保留的软件包将在大约一周的时间内自动解决、下载并安装。
大多数用户不应该做任何事情。它没有坏。不要尝试强制升级。请耐心等待系统正常运行。
诊断——如何判断分阶段更新是否是罪魁祸首:
- 这很简单。运行
apt-cache policy <packagename>
您保留的其中一个软件包。查找“分阶段”百分比。只有软件包当前处于分阶段时才会显示该百分比。
$ apt-cache policy gir1.2-gstreamer-1.0
gir1.2-gstreamer-1.0:
Installed: 1.20.3-0ubuntu1
Candidate: 1.20.3-0ubuntu1
Version table:
*** 1.20.3-0ubuntu1 500 (phased 40%) <----------------- There it is!
500 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
100 /var/lib/dpkg/status
1.20.1-1 500
500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
高级用法
- 分阶段更新可以禁用——这是一个简单易用的设置,但请记住,您正在禁用一项保护您免于接收损坏软件包的功能。您正在提供测试这些软件包!
- 拥有多台机器的用户可以将机器设置为同时运行——这只是另一个简单的恰当设置。
如何跳过阶段一次的示例:
apt -o APT::Get::Always-Include-Phased-Updates=true upgrade
如何使用 apt 配置文件永久跳过分阶段的示例(不推荐大多数用户使用)
cat <<EOF > /etc/apt/apt.conf.d/80PhasedUpdates
// Enable/Disable phased updates
// Default is Phased Updates enabled. Use these lines to disable.
APT::Get::Never-Include-Phased-Updates: True;
Update-Manager::Never-Include-Phased-Updates;
EOF
如何在每台机器上使用相同的 apt 配置文件来同步一组机器的阶段的示例:
cat <<EOF > /etc/apt/apt.conf.d/80PhasedUpdates
// To have multiple your machines phase the same, set the same
// string in this field on all those machines
// If commented out or missing, apt will use /etc/machine-id to
// seed the random number generator
APT::Machine-ID "aaaabbbbccccddddeeeeffff";
EOF
答案2
当然有可能,区别在于分阶段更新系统。如果在两台机器上运行此命令,请查看软件包在两台机器上的行为是否相同。
cat <<EOF > /etc/apt/apt.conf.d/80my
APT::Get::Always-Include-Phased-Updates "1";
EOF
有关分阶段更新的更多背景信息
APT 现在实现了分阶段更新。以前,只有 update-manager 实现了分阶段更新...
这意味着在分阶段执行更新时,某些更新将在某些机器上被阻止。这是由从机器 ID、软件包名称和软件包版本派生的值决定的。
APT 了解一个名为 Phased-Update-Percentage 的字段,该字段可用于控制新版本的推出。它是一个介于 0 到 100 之间的整数。
如果您有多个系统想要接收同一组更新,您可以将 APT::Machine-ID 设置为 UUID,以使它们都处于相同的阶段,或者将 APT::Get::Never-Include-Phased-Updates 或 APT::Get::Always-Include-Phased-Updates 设置为 true,以使 APT 永远不会/总是考虑分阶段更新。
手册页还表明“未分阶段”的版本将获得priority 1
,这与您的apt-cache policy
输出相匹配。
答案3
以下方法对我有用
sudo apt install --only-upgrade <软件包名称>
看:https://itsfoss.com/following-packages-have-been-kept-back/