Fed*_*eli 66 updates package-management apt 22.04
长话短说
最近,在正常的软件升级过程(即,apt upgrade或apt dist-upgrade)中,我开始收到如下消息:
[...]
The following packages have been kept back:
[...]
0 upgraded, 0 newly installed, 0 to remove and [...] not upgraded.
Run Code Online (Sandbox Code Playgroud)
我有什么选择?
注意:这不是此处已经提出的无数类似问题的重复。您应该将我的问题视为此问题的后续问题。
我在我的主 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]
Run Code Online (Sandbox Code Playgroud)
相同的命令给出输出:
gir1.2-gstreamer-1.0/jammy,now 1.20.1-1 amd64 [installed,automatic]
Run Code Online (Sandbox Code Playgroud)
在我的辅助(虚拟)系统上。
为什么我们会有这种差异?而且,如何使我的主系统充当“自动”安装软件包的(虚拟)系统?
我的“主”系统上的命令输出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
Run Code Online (Sandbox Code Playgroud)
在我的“辅助”(虚拟)系统上是这样的:
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
现在,在我的辅助系统上我也开始得到这个:
$ 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.
Run Code Online (Sandbox Code Playgroud)
use*_*733 139
分阶段更新是一项安全功能
它在那里为您提供保护。不要试图智胜它。
大多数用户不应该执行任何操作。它没有坏。不要尝试强制升级。只需要有耐心,让系统发挥作用即可。
诊断——如何判断分阶段更新是否是罪魁祸首:
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
Run Code Online (Sandbox Code Playgroud)
高级用法
如何跳过一次定相的示例:
apt -o APT::Get::Always-Include-Phased-Updates=true upgrade
Run Code Online (Sandbox Code Playgroud)
如何使用 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
Run Code Online (Sandbox Code Playgroud)
如何在每台计算机上使用相同的 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
Run Code Online (Sandbox Code Playgroud)
另请参阅Never-Ininclude-Phased-Updates 标志应放置在哪个“apt”配置文件中?
And*_*her 20
当然,差异可能在于分阶段更新系统。如果在两台计算机上运行此命令,请查看包在两台计算机上的行为是否相同。
cat <<EOF > /etc/apt/apt.conf.d/80my
APT::Get::Always-Include-Phased-Updates "1";
EOF
Run Code Online (Sandbox Code Playgroud)
有关分阶段更新的更多背景信息
APT现在实行分阶段更新。以前,只有 update-manager 实现了分阶段更新......
这意味着某些更新在分阶段进行时将在某些计算机上被阻止。这是由从机器 ID、包名称和包版本派生的值决定的。
APT 了解一个名为 Phased-Update-Percentage 的字段,该字段可用于控制新版本的推出。它是 0 到 100 之间的整数。
如果您有多个系统想要接收同一组更新,则可以将 APT::Machine-ID 设置为 UUID,以便它们都处于相同的阶段,或者设置 APT::Get::Never-Ininclude-Phased -Updates 或 APT::Get::Always-Ininclude-Phased-Updates 为 true,这样 APT 永远不会/总是考虑分阶段更新。
联机帮助页还指示“未分阶段”的版本将获得priority 1,这与您的apt-cache policy输出相匹配。
小智 6
以下方法对我很有用
sudo apt install --only-upgrade <package_name>
请参阅: https: //itsfoss.com/following-packages-have-been-kept-back/
| 归档时间: |
|
| 查看次数: |
39526 次 |
| 最近记录: |