如何从升级版本回退到建议仓库?


1测试结果的pastebin已经失效了。 - enzotib
6个回答

这是一种更通用的方法,可以将本地安装的软件包、建议的软件包和后备软件包还原到稳定+更新的渠道。虽然其他答案也是正确的,并且以类似的方式工作,但我认为这种方法更加优雅。
确保你在你的`/etc/apt/sources.list`和`/etc/apt/sources.list.d/*`文件中删除了`-proposed`或`-backports`的条目。
添加一个apt-preferences文件,例如`/etc/apt/preferences.d/99-back-to-stable-updates`,其中包含(对于这里的`precise` - 请用你的版本替换):
``` Package: * Pin: release a=precise Pin-Priority: 1001
Package: * Pin: release a=precise-updates Pin-Priority: 1001
Package: * Pin: release a=precise-security Pin-Priority: 1001
Package: * Pin: release a=precise-proposed Pin-Priority: -10
Package: * Pin: release a=precise-backports Pin-Priority: -10 ```
这个大于1000的固定值将强制apt从该渠道降级,并且小于0的优先级将删除任何额外的软件包。
现在运行以下命令:
``` sudo apt-get update sudo apt-get dist-upgrade ```
检查apt提供的建议解决方案,如果你认为可以接受,则接受它。如果你需要检查为什么以及将降级到哪个版本,请使用`apt-cache policy packagename`来查看可用的版本以及apt决定安装的候选版本。
再次删除`/etc/apt/preferences.d/99-back-to-stable-updates`文件,因为它不再需要。

感谢 Ubuntu 论坛上的 mlind 在他发布的帖子中提供了超过5年前关于固定引用的灵感 - 然而它今天对我非常有帮助。


我猜它应该也适用于Debian。不幸的是,对我来说它什么都没做 :/ - Michael
@Michael 1) Debian没有官方提议仓库的概念。2) 这个网站是关于Ubuntu的,而不是Debian。我建议你在Unix.SE上提一个新问题。 - gertvdijk
这个解决方案在“xenial”版本上也适用!(当然,在文件中将“precise”替换为“xenial”之后)非常感谢! - morhook
谢谢。这个解决方案在树莓派4上的Ubuntu 20.04桌面版64位系统上运行良好,对我的生活有很大帮助。 - Leonardo Saracini

这个页面建议可以使用Apt pinning来通过利用优先级高于1000的pin可以导致软件包降级的事实来从整个存储库中降级。

因此,一个解决方案可能是暂时将除natty-proposed存储库之外的所有软件包文件的默认优先级增加1000:

apt-cache policy | awk '
    /^ [0-9]+ / {
        p = $1;
        getline;
        r = $0;
        if (r !~ /a=natty-proposed/) p += 1000;
        print "Package: *\nPin: " r "\nPin-priority: " p "\n"
    }
' | sudo tee /etc/apt/preferences.d/downgrade-from-natty-proposed

(注意:此方法无法提高包文件的优先级,其发布字段包含逗号。请参阅此问题。)
完成此操作后,可以使用apt-get --simulate upgrade来测试成功检测降级。确认正确的降级已被检测到后,只需执行sudo apt-get upgrade即可执行降级。
降级完成后,使用软件源禁用预发布更新(natty-proposed)存储库,然后删除临时优先级增加的设置。
sudo rm /etc/apt/preferences.d/downgrade-from-natty-proposed

最后,重新启动以使所有正在运行的程序降级为它们的旧版本。

1有趣的解决方案,可能比我的更好、更通用。顺便说一下,降级包的数量是相同的,证实了两种方法的正确性。 - enzotib

我找不到比下面这个更简单的解决方案了。但还是希望有人能提供一个更好的答案。
以下脚本可以执行降级操作。
#!/bin/bash

# get a list of installed packages
dpkg --get-selections | awk '{ print $1 }' > all-packages

# run apt-cache policy on each of them, then elaborate with the awk script 
apt-cache policy $(<all-packages) |
  ./get-prev-pkg-vers >old-versions

# install previous version of packages
sudo apt-get --simulate install $(< old-versions)

这个名为get-prev-pkg-versawk脚本如下所示。
#!/usr/bin/awk -f

/^[^ ]/ {
    package = $1
    gsub(":", "", package)
    search_next = 0
}
/^     [^ ]/ {
    installed = 0
    version = $1
    if (search_next == 1) {
        print package "=" version
        search_next = 0
    }
}
/^ \*\*\* [^ ]/ {
    installed = 1
}
/^        [^ ]/ {
    branch = $3
    if (installed == 1 && branch ~ /proposed/) {
        search_next = 1
    }
    installed = 0
}

运行脚本时,建议的仓库还不应该被禁用。
记得给两个脚本设置可执行权限。
这种方法的一个问题是,所有降级的软件包都会被标记为手动安装(包括那些自动安装的软件包)。
为了安全起见,在bash脚本的末尾添加--simulate选项到apt-get命令中。

撤销natty-proposed中的所有软件包可能是不必要的:大多数软件包很快就会通过natty-updates更新到相同的版本。
如果您对某个软件包有问题,可以使用darent提供的方法(在禁用-proposed后)来还原该软件包,或者您可以使用sudo aptitude install packagename/natty。但更重要的是,您应该针对该软件包提交一个错误报告。很少有人真正测试natty-proposed,如果出现回归(=新问题),肯定应该报告。否则,它们可能会出现在所有Ubuntu用户的更新中。所以,如果您有任何问题,请报告。

在Synaptic中,您可以禁用建议的存储库并更新您的源。然后,您将看到所有已更新的软件包都显示为本地安装(因为它们不再在存储库中)。
现在,您需要“降级”这些软件包。逐个选择,并在上方菜单中选择:
package > force version

(或者按Control+E)
菜单将显示可用选项。我会选择每个软件包的较低版本号。如果你犯了错误,并且在正常仓库中有更新的版本,它将在稍后的更新中解决。
一个快速的解决方案是使用purge-ppa命令指向建议的存储库,但不知道它是否适用于它们,我只用它来清除外部ppa并降级到官方的ubuntu版本。在这种情况下,我不建议你这样做,也许有人知道这是否是一种安全的方法...

最后一段只是猜测,因此应该作为对问题的评论或进行适当的研究。 - Kalle Richter