我将首先说明,我很确定这是我自己设计的一个独特的混乱,但我希望有人遇到这个并且可能能够提供帮助。
设置
我的笔记本电脑运行 Pop!_OS 22.04(基于 Ubuntu Jammy)。我真的很喜欢xscreensaver软件包,但是 Debian/Ubuntu/Pop!_OS 发行版存储库包含一个过时的版本,并且只有 sid(又名 Unstable)包含更新的软件包*。
不用担心,这就是存在固定的原因,所以这就是我设置它的方式:
/etc/apt/preferences.d/unstable-200
文件:Package: * Pin: release a=unstable Pin-Priority: 200
/etc/apt/preferences.d/xscreensaver-2000
文件:Package: xscreensaver* Pin: release a=unstable Pin-Priority: 2000
/etc/apt/sources.list.d/debian.sid.list
文件:deb [arch=amd64] http://http.us.debian.org/debian sid main contrib non-free
这实际上有效,此时运行sudo apt install xscreensaver
安装更新的版本。但是,有一个奇怪的副作用。
问题
当我运行sudo apt update
后跟时sudo apt upgrade
,我得到以下输出:
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages will be DOWNGRADED:
alsa-topology-conf appmenu-gtk-module-common aspell-en ca-certificates
chrome-gnome-shell dictionaries-common dns-root-data emacsen-common folks-common
fonts-arphic-ukai fonts-noto-cjk fonts-noto-cjk-extra fonts-noto-color-emoji
fonts-urw-base35 friendly-recovery gir1.2-flatpak-1.0 gir1.2-gdkpixbuf-2.0
gir1.2-graphene-1.0 gir1.2-gtksource-4 gir1.2-polkit-1.0 gir1.2-secret-1
gir1.2-soup-2.4 gsfonts gsfonts-x11 hunspell-ar hunspell-de-at-frami
hunspell-de-ch-frami hunspell-de-de-frami hunspell-en-au hunspell-en-ca hunspell-en-gb
hunspell-en-us hunspell-en-za hunspell-es hunspell-fr hunspell-fr-classical hunspell-it
hunspell-pt-br hunspell-pt-pt hunspell-ru hyphen-de hyphen-en-gb hyphen-es hyphen-fr
hyphen-it hyphen-pt-br hyphen-pt-pt ieee-data javascript-common klibc-utils
laptop-detect liba52-0.7.4 libappmenu-gtk2-parser0 libbytesize-common libffi8
libflatpak-dev libgl1 libgles2 libgutenprint-common libgweather-4-0 libio-stringy-perl
libjs-jquery libldacbt-abr2 libmpcdec6 libmysofa1 libopengl0 libpolkit-gobject-1-0
libsndio7.0 libsoup-gnome2.4-1 libtermkey1 libvterm0 libwacom-common libxkbcommon0
mythes-ar mythes-de mythes-de-ch mythes-en-au mythes-en-us mythes-es mythes-fr
mythes-it mythes-pt-pt mythes-ru neovim-runtime netbase pass policykit-1 poppler-data
powermgmt-base printer-driver-all python3-certifi python3-fido2 python3-jinja2
python3-launchpadlib python3-lazr.uri python3-macaroonbakery python3-more-itertools
python3-pkg-resources python3-pyatspi python3-rfc3339 python3-setuptools python3-tz
python3-wheel python3-ykman sensible-utils sgml-base sgml-data sound-icons ssl-cert
tpm-udev ucf update-inetd va-driver-all wamerican wbrazilian wbritish wfrench witalian
wngerman wogerman wspanish wswiss xfonts-base xml-core yubikey-manager
0 upgraded, 0 newly installed, 125 downgraded, 0 to remove and 0 not upgraded.
Need to get 257 MB/283 MB of archives.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n]
这也会影响 Pop!_OS Shop 的更新计数,这些软件包显示为待处理的操作系统更新。
故障排除
我在尝试解决此问题时收集的一些数据。
删除/etc/apt/sources.list.d/debian.sid.list
并运行sudo apt update
解决了这个问题,所以我知道这只是某个地方的错误计算/有缺陷的逻辑。
关注列表中的第一个包alsa-topology-conf
:
虽然我知道这个错误完全是肤浅的,但起初我想apt
以某种方式跟踪包的来源(哪个 repo),所以我删除了,清理了,然后重新安装了包。没有什么不同。
sudo apt remove alsa-topology-conf
sudo apt clean
sudo apt update
sudo apt install alsa-topology-conf
运行apt policy alsa-topology-conf
,结果为:
alsa-topology-conf: Installed: 1.2.5.1-2 Candidate: 1.2.5.1-2 Version table: *** 1.2.5.1-2 200 200 http://http.us.debian.org/debian sid/main amd64 Packages 100 /var/lib/dpkg/status 1.2.5.1-2 501 501 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 Packages 501 http://us.archive.ubuntu.com/ubuntu jammy/main i386 Packages
似乎两者都sid
具有jammy
完全相同的版本,并且出于某种原因,apt
将包与200
优先级匹配,而不是501
优先级条目。
删除后,/etc/apt/sources.list.d/debian.sid.list
输出如下所示:
alsa-topology-conf: Installed: 1.2.5.1-2 Candidate: 1.2.5.1-2 Version table: *** 1.2.5.1-2 501 501 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 Packages 501 http://us.archive.ubuntu.com/ubuntu jammy/main i386 Packages 100 /var/lib/dpkg/status
相关问题
以下是类似情况的相关问题,但那里的答案都没有帮助我理解或解决这个问题。
我已经尝试了上述问题中的所有答案,但似乎没有一个相关或有效。
我的问题
有没有人对如何协调这一点有任何建议,以便系统不会一直认为这些包需要降级?
基本的答案是您正在做一些您不应该做的事情,即在版本(和分发)之间混合存储库。在基于 Ubuntu 的发行版中引入 Debian 软件包是个坏主意。
xscreensaver
可以在更高版本的 Ubuntu中使用,这样使用起来会不太危险,但即使这样也是个坏主意。鉴于您所做的所有调查以及您提供的详细信息,有必要解释您在此处看到的行为。为“降级”提供的所有软件包都具有在 Debian 和 Ubuntu 中以相同版本可用的共享属性;但是,它们不是同一个包,因为从 Debian 导入的所有包都在 Ubuntu 中重建。
apt
这里发挥作用的第一个特性是pin-priorities 只选择版本。对于存储库中不同版本中可用的任何包,pin-priorities 将区分它们。对于存储库中相同版本中可用的任何包,它们不会。然后应用下一个功能:当多个存储库提供相同的版本时,列出的第一个将获胜。这与 的另一个特性相结合apt
,即如果散列不匹配,使用给定散列安装的包将被具有相同版本的存储库包替换(此处某处有关于该问题的问答,但我找不到现在就可以了)。所有这一切的结果是,对于 Pop!_OS(引擎盖下的 Ubuntu)提供的所有软件包,其 Jammy 中的版本与 Debian 不稳定的当前版本完全匹配,
apt
将考虑将它们替换为 Debian 版本。我不确定为什么它将它们标识为降级。如果你要继续这样做,你会用它们的 Debian“等效”替换一些 Pop!_OS 包;这很有可能确实有效,但也有可能使用的库中的细微差异会导致问题。你最终会得到一个完全未经测试的设置。
要撤消此操作,您应该删除
sid.list
、更新您的存储库并明确重新安装您“降级”的任何软件包:谢谢斯蒂芬基特
需要明确的是,斯蒂芬基特的答案是选定的。
但是,作为 OP,我正在添加细节来解决我的特定问题(以防其他人发现它很有趣)。
正如斯蒂芬如此亲切和耐心地指出了有据可查的内容,但我未能正确理解/阅读:
选择要抓取的包是一个 2 个阶段的过程:
apt
获取列出该特定版本的第一个 repo。/etc/apt/sources.list
文件中查找/etc/apt/sources.list.d
dir 中查找,按词法顺序对目录中的文件进行排序(基本上ls
默认情况下)我的问题
我的问题中没有指定 Pop!_OS 源文件在
/etc/apt/sources.list.d
dir 中列出的事实,它们被命名为:这意味着
sid.list
或者debian.sid.list
当按照上面的列表排序时,仍然会显示在指定 Ubuntu 的 Jammy 存储system.sources
库的位置之前。解决问题 - 答案
为了解决我在问题中描述的特定场景,我的解决方案是重命名
sid.list
为zzz.sid.list
which 将确保sid
始终最后选择其中的包。这是
apt policy alsa-topology-conf
修复后的样子:正确答案
如果可能的话,这应该是不需要的,特别是在最新版本的 Pop!_OS 中,底层 Ubuntu 版本终于升级了xscreensaver包,它们实际上与
sid
.长话短说,我认为(根据过去的经验)我需要破解系统,而在这种特殊情况下,我不需要,解决方案是不要尝试。
但话又说回来 - 我在打破东西时学得最好,这是一个很棒的课程,我感谢那些花时间阅读和回应的人。