如何强制将“已被保留的软件包”安装为“自动”?

如何强制将“已被保留的软件包”安装为“自动”?

总结

最近,在正常的软件升级过程中(即apt upgradeapt 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

另请参阅Never-Include-Phased-Updates 标志应该放在哪个 `apt` 配置文件中?

答案2

当然有可能,区别在于分阶段更新系统。如果在两台机器上运行此命令,请查看软件包在两台机器上的行为是否相同。

cat <<EOF > /etc/apt/apt.conf.d/80my
APT::Get::Always-Include-Phased-Updates "1";
EOF

有关分阶段更新的更多背景信息

APT 21.04 中的分阶段更新

APT 现在实现了分阶段更新。以前,只有 update-manager 实现了分阶段更新...

这意味着在分阶段执行更新时,某些更新将在某些机器上被阻止。这是由从机器 ID、软件包名称和软件包版本派生的值决定的。

apt_preferences 的手册页

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/

相关内容