应对Canonical日益糟糕的质量保证策略?

我的“已安装(本地或过时)”类别正在填满,因为Canonical最近一直在推送更新,然后又撤回。最近的两个内核就发生了这种情况,今天早上又发生在cups上。我使用Ubuntu已经有三年了,我不记得以前这种情况发生得这么频繁。
那么,如何理性处理这个问题呢?
我考虑过每周只安装一次更新,但这样做不能防止我在那周检查之前抓到他们推出的那个坏更新。
只在周末安装更新是一个好策略吗?似乎系统更新并不经常在周末推出。我想他们可能会在星期五下午推出一个坏更新,然后在星期一早上撤回。
或者,直到更新被推出一段时间后再安装它们,比如两天?有没有自动化的方法来做到这一点?
编辑:受影响的系统之一运行着带有linux-generic内核的Lubuntu 16.04,另一个运行着带有linux-generic-hwe-16.04内核的Lubuntu 16.04。两者都受到了于2017年3月27日推出并随后撤回的cups版本2.13-4ubuntu0.2更新的影响。 linux-generic机器接收到了版本为4.4.0.67.12的内核更新,随后被撤回。此更新还使snapd版本2.23.1变成无主状态。linux-generic-hwe-16.04机器接收到了版本为4.8.0.42.14的内核更新,随后也变成无主状态。

2谢谢你澄清版本问题。我在想你是否在处理LTS版本,而对于我来说,中间版本主要用于测试,可能会包含很多可能进入LTS版本的变化。至于我关注的LTS版本,我没有足够细心地注意到明显的错误。我经常进行更新。我偶尔会注意到一些小问题,显然开发人员正在不断处理。你可以考虑专注于安全更新,以确保系统的安全性,并将每日的更改留给那些更敢于尝试的人处理。 - L. D. James
1@fkraiem 是的,我看到了两个最近的内核版本在我收到通知后不久被撤销。有趣的是,我决定稍后进行更新,当我回来时,它们竟然消失了! - heynnema
我曾经关闭Windows的自动更新,部分原因是受到你在Ubuntu上的经历的影响。最近我注意到更新似乎每天都有。也许我应该关闭我的更新,因为现在我没有任何问题。 - WinEunuuchs2Unix
他们是否更频繁地跳过稳定版本更新的重要部分,尤其是核心软件包?据我所知,这并没有被宣布,提出这个问题并在ubuntu-devel邮件列表上讨论将是一个适当的措施。 - Gunnar Hjalmarsson
3个回答

转向Debian Stable是一个激进的选择,而不是任何*buntu或其衍生版本,因为Debian Stable已经通过了完整的质量保证流程,而Ubuntu则源自Debian Testing,在成为稳定版之前还有一段路要走。
几乎所有的知识都可以直接转移,但Debian不会给你所有最新的外观“花里胡哨”的功能。然而,它在软件仓库中拥有更多的软件包...
我在大约5年前从Kubuntu切换到Debian,使用的是KDE桌面环境,因为遇到了类似的问题。但最终还是取决于个人选择。

1这是很好的信息。最终我通过建立自己的本地镜像来处理它,基本上每天下载所有更新。我的家庭局域网电脑从本地镜像获取更新,但仅在命令下进行,而非自动更新。因此,如果有什么看起来可怕的情况,我可以选择等待几天。 - Organic Marble
这是一个非常好的解决方案。许多商业网络都是为了类似的原因而设置的,以完成与Windows更新相同的任务! - tiger99

将软件包更新回到旧版本

如果您知道版本号或目标发布版本,apt-get支持选择特定的版本或目标发布版本。

  1. 安装aptitude

    sudo apt-get install aptitude
    
  2. 显示软件包的旧版本。

    aptitude versions <package-name> | less # 使用less命令只显示版本列表的前部分
    
  3. 将选定的软件包回滚到旧版本。

    sudo apt-get -t=<target release> install <package-name>  # 目标版本是旧版本
    
  4. 卸载选定软件包的错误更新。

    sudo apt-get -t=<target release> remove <package-name> # 目标版本是新版本
    
  5. 使用apt-mark hold阻止回滚的软件包版本自动更新。 apt-mark hold用于将软件包标记为被保留,这将阻止软件包被自动安装、升级或删除。

    sudo apt-mark hold <package-name>  
    

回滚内核更新至旧版本

按照前一节的步骤进行操作,但在卸载有问题的内核包之前,您需要执行额外的测试步骤,以确保仍然安装了一个可用的内核版本。不幸的是,这需要重新启动系统。对于维护多个系统的用户来说,我对此造成的麻烦和耗时表示抱歉。


aptitude versions <package-name>无法显示所有当前安装的内核版本,但是您可以使用以下命令显示所有当前安装的内核版本:

dpkg-query -W -f='${Package}\n' | grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3)  

执行此命令的结果将列出所有非工作内核包的包名,应将其卸载。
在卸载属于非工作内核版本的包后,您将收到以下消息:
The link /vmlinuz.old is a damaged link
Removing symbolic link vmlinuz.old 
 you may need to re-run your boot loader[grub]

这条消息是因为vmlinuz.old链接到已删除的文件,所以您需要通过运行以下命令来更新grub:
sudo update-grub

1如果你需要维护多个系统,并且还要返回并设置它们都从好的内核启动,那真是一件非常麻烦的事情。还要处理坏内核的重启问题,然后再次重启以获取好的内核。 - Organic Marble
1我的家人需要让他们的电脑在启动时不必考虑使用哪个内核。而且,一旦出现这个问题,我知道如何解决。我正在寻找一种避免首次出现这个问题的策略。我没有给你的回答投反对票,但它并没有回应我的问题。 - Organic Marble
如果你这样做了,我本来会生气的,因为你应该先评论说你编辑了问题,然后等几分钟让我编辑答案再提交,但我现在并不生气,因为修改是有益和/或必要的。 - karel
2@OrganicMarble 对于你的孩子们,他们可能不太懂计算机或者不愿意费心去考虑内核和其他事情,你是否尝试过为他们的电脑进行仅安全更新的配置?这种配置是否会出现相同的问题?我无法想象在大量的计算机和环境在发布后经过测试之前,通用更新会完美无缺。至少你的问题显示出了问题出现时的快速修复方法。 - L. D. James
1@L.D.James 这是一个很好的建议。不过,我怀疑这些内核更新可能是安全更新。我不确定如何回溯并检查这一点。 - Organic Marble
1@OrganicMarble 你可以通过检查“无人值守”日志文件(/var/log/unattended-upgrades)来回顾。我相信“无人值守升级”包是用于安全更新的。 - L. D. James

你的最佳策略,就像任何操作系统一样,是每天至少检查一次更新。

从安全角度来看,对于单个用户来说,在测试和优先级排序期间延迟更新是不现实的。而紧急更新总是比被推迟的更新更重要。

因此,除非你有时间调查每个更新,否则最佳策略是在发布时应用更新,即使这会导致很多被推迟的更新。这些更新随后总是可以清理掉。

作为备份策略,你应该始终...备份!经常备份,备份所有内容。坏的更新就是其中之一的原因。如果你将重要文件保存在云端,这尤其方便。

编辑:我的回答基于你是一个在家使用个人电脑的单个人的假设。


1我不想要一种“忍气吞声”的策略。 - Organic Marble
@OrganicMarble 我从来没有说过那样的话。但是我猜你是一个单个用户,而且你在谈论一个个人系统。否则,请详细说明你的问题。对于一个单个人来说,在更新管理方面能做的事情是有限的。我管理着一个规模庞大的组织,拥有数十台服务器和数百台工作站,远远超过我的网站规模。我们都以一种非常复杂的方式处理更新,这是一个单个人无法完成的任务。 - Delorean
是的,我处于一个特殊情况,我们家使用Ubuntu系统,有5台电脑,而且我还运行了几个虚拟机。所以大约有10个系统需要我管理。数量太少无法使用自动化管理系统,但足够让这种事情变得超级烦人。 - Organic Marble
@OrganicMarble 是的,这让一个人很难管理。老实说,你能做的最好的事情就是尽可能经常地进行更新。给家人们进行一次快速演示可能会有所帮助,特别是当出现多个内核选项时。你只需要向他们展示一两次就可以了。你考虑过使用一个简单的脚本,通过cron作业来检查是否存在多个内核吗?多个内核是主要的关注点吗? - Delorean