有没有办法回滚最近的升级?

这在过去的5年里已经发生过很多次了:升级破坏了我的系统。 每次陷入这种情况,我都不得不重新安装整个系统,真的很烦人。
有没有办法回滚最近的升级,以便能够拥有一个功能正常的系统而无需重新安装?如果没有,哪种方式是建议将此作为首要想法的最佳途径?
我看到这个想法在brainstorm.ubuntu.com上被描述过,但感觉它已经死掉了...而且论坛上充满了升级破坏事例,所以我觉得需要对这个问题采取一些行动。 谢谢!

2@GatesVP 你在8年前提出的这个观点仍然困扰着Ubuntu(其他发行版我不好说,但它们可能也不会更好)。我觉得这真是令人沮丧。应该把你的话以64号字体印刷出来,挂在每一个即将踏入Linux世界的新手面前。 - horaceT
我必须同意备份镜像是正确的选择。并没有明确说明这是否是一个“生产”系统。如果是,并且有可能拥有一个克隆测试系统,那么使用镜像备份是正确的选择。如果只是一个应用程序更新,那么最快的解决方案是降级,无论是否使用“强制”选项。 - JHPArizona
9个回答

在Synaptics中,你至少可以控制最近的更新:文件菜单、历史记录。
(如果系统损坏,Synaptic仍然可启动)。所以通过apt-...-command来恢复他们的更新应该不难。
我猜命令行也有一个历史命令。
也许你需要删除整个软件包,并安装一个特定的版本。据我所知,安装特定版本是可能的,但我从未有过这样的需求。
更新:查找在过去3x24小时内安装的软件包:
find /var/lib/dpkg/info/ -name \*.list -mtime -3 | sed 's#.list$##;s#.*/##' 

使用apt-cache policy命令,您可以查看程序的可用版本。
sudo apt-cache policy PROGRAM:
 *** 3.6.7+build3+nobinonly-0ubuntu0.10.04.1 0
        500 http://de.archive.ubuntu.com/ubuntu/ lucid-updates/main Packages
        500 http://security.ubuntu.com/ubuntu/ lucid-security/main Packages
        100 /var/lib/dpkg/status
     3.6.3+nobinonly-0ubuntu4 0

这里有3.6.7和3.6.3版本。现在你知道可能安装的早期版本是什么(通常不是直接的前身)。
sudo apt-get install PROGRAM=3.6.3

然后您需要进行apt-pinning,以防止未来的更新:
在/etc/apt/preferences.d/(如果>= 10.4)中创建一个以您的程序命名的新文件,
Package: program
Pin: version 3.6.3*
Pin-Priority: 1000

感谢大家提供的信息。我迫不及待地期待Ubuntu能够默认支持ZFS! - Marcelo Ruiz
抱歉 - 这与ZFS有什么关系呢?ZFS是否管理回滚操作?或者是更新导致了ZFS的安装故障?又或者是ZFS更新引起了其他问题? - user unknown
1如果根据apt的版本号是1.0.2g-1ubuntu4.12,那该怎么办呢?尽管如此,它却不接受这个作为版本号。我想将版本从1.0.2g-1ubuntu4.13降级到1.0.2g-1ubuntu4.12 - Csaba Toth
1谢谢,真是太麻烦了。我的最后一次更新完全破坏了控制器输入,在find /var/lib/dpkg/info/ -name \*.list -mtime -3 | sed 's#.list$##;s#.*/##' 中列出了80个软件包。现在重新安装整个系统比解决问题更容易些。 - tatsu
你展示了如何列出升级的程序,以及如何降级单个程序。那么,如何一次性降级所有列出的程序呢? - Mark Jeronimus

大多数情况下,您可以查看/var/log/apt/history.log来了解apt/synaptic所做的更改。这只是一点点取证和大量的复制/粘贴工作。
回到系统仍然正常工作的日期。
首先,将自那时起安装的所有软件包放在一个卸载脚本中。当脚本完成后,开始重新添加所有已删除的软件包。
一个示例案例:
日志文件:
Start-Date: 2014-05-28  21:28:11
Commandline: synaptic
Install: libfglrx-amdxvba1:amd64 (13.12-3kali1, automatic), libgl1-fglrx-glx:amd64 (13.12-3kali1), glx-alternative-fglrx:amd64 (0.4.1kali1, automatic), libfglrx:amd64 (13.12-3kali1, au$
Remove: fglrx-glx-ia32:amd64 (12-6+point-3)
End-Date: 2014-05-28  21:28:27

你可以看到,
libfglrx-amdxvba1:amd64 libgl1-fglrx-glx:amd64 glx-alternative-fglrx:amd64 & libfglrx:amd64 

通过Synaptic安装了。就像libfglrx:amd64被Synaptic移除一样。

我们按照相反的顺序进行操作,首先删除新安装的软件包,然后重新添加被移除的软件包。

对于这种情况,一个有效的命令可能是:

sudo apt-get remove -y libfglrx-amdxvba1:amd64 libgl1-fglrx-glx:amd64 glx-alternative-fglrx:amd64 libfglrx:amd64 && sudo apt-get install -y libfglrx:amd64

也许不带-y开关并不是最好的选择,因为这样可以更好地控制过程(避免破坏依赖关系)。大多数人在进行一些验证时不会弄断手指。
通常情况下,通过这种方式可以进行回滚,但如果依赖关系已经破坏,可能会遇到更大的问题。

大多数情况下,如果您的系统出现故障,那很可能是内核问题。
只需启动旧版本的内核,并重新安装最新的软件包(尤其是内核软件包),以修复可能未正确更新的问题。 以下是一些建议:
/var/log/dpkg.log

请问您的朋友可以检查最近更新/安装的软件包清单吗?

sudo apt-get -f install

大多数情况下可以修复安装不完整的软件包。

3你怎么“简单地”启动旧内核? - Dan Dascalescu
在GRUB中通常有一个选项可以启动先前的内核。 - Mark Jeronimus
精确细节。恐慌模式。系统故障,无网络,无鼠标。 - mathtick

很遗憾,目前还没有办法做到这一点。文件系统级别的快照/回滚是即将推出的btrfs的功能之一,但它还需要一段时间才能完全具备功能并稳定到足以作为默认文件系统使用。

1对于文件系统的快照,你可以使用LVM代替,配合ext3或者ext4。 - Flimm
@Flimm,现在你可以这样做,尽管它的效果并不是很好,并且需要在安装时设置LVM。 - psusi

在进行重大升级时,我使用Clonezilla克隆磁盘。将其刻录到CD上,准备好一台备用的(外部)硬盘,并按照Clonezilla LiveCD上的说明进行操作。选择partition-image模式,这样可以节省空间。

如果你认为系统出了问题(或者想要恢复之前的更改),只需启动Clonezilla LiveCD,选择(外部)硬盘上的映像文件并进行恢复。由于这些映像文件是对磁盘上每个位的字面拷贝,所以根据磁盘速度和连接速度(通常是外部USB硬盘与计算机之间的连接)的不同,可能需要几个小时。

顺便说一下,这被称为备份方法。


你可以使用apt或dpkg轻松安装给定软件包的旧版本(降级)。问题在于找到旧版本的软件包,因为随着更新的推出,这些版本经常从存储库和镜像中消失。

如果你从安装光盘、过时的镜像或缓存中安装软件包,你还需要将其固定到旧版本,以防止升级直到你允许升级。这意味着你必须观察更新并测试它们,直到解决你的问题。当然,这是一个问题,因为同时(也许永远),你将被遗留下未修复的、可能存在安全问题的软件包。这意味着每个遇到某种系统问题的用户都将被留在某种随机状态,直到他们能够解决它。

所有软件也不具备向前兼容性,因此,当使用更高版本的配置文件或数据文件时,旧版本可能无法正确运行。显然,除非你也将所有用户数据回滚到升级之前的状态,否则这是不可能解决的。

如果有办法做到这一点,那将是很好的,但这是一个巨大的问题。任何认为有一种连贯解决方案的人应该撰写一个提案,并邀请评论,或者最好是制作一个概念验证解决方案(代码、脚本、文档)。恶意挑衅和抱怨是没有建设性的。

因为没有干净的技术解决方案,大多数软件都是以“只有前进的方式”开发(和集成)的。试图管理过时的版本只会浪费大家的时间。发现问题会尽快在新版本中修复。作为一个次要的解决方案,我希望能够在某个地方保留以前的软件包版本的存档,以便偶尔进行临时解决。
同时,您可以报告错误,但不要期望最新的软件永远不会出错。一旦找到修复方法,应该在下一个更新中进行修复。开发人员也是人类(大多数情况下),因此会犯错误。计算机是棘手的,充满了各种疯狂的变化和细节。通过使用得到良好支持的组件和稳定的集成软件分发来进行防御性维护,系统可以非常稳定,而不会变得不安全或无法升级。

我曰靠,你竟然把别人的答案链接作为你自己的回答。 - Andrew

设置 timeshift
如果更新破坏了您的系统,请恢复最后一个良好的快照。

应该是强制的,Ubuntu总是一次又一次地搞砸一切 - mathtick

通过终端输入"sudo apt autoremove"并按下键盘上的回车键。这将自动删除所有多余和不需要的库包(希望也包括那些破坏了您系统的包)。
然后通过终端输入"sudo apt autoclean"并按下键盘上的回车键。这将清理任何不需要的文件,包括保存在/temp目录中的文件。
然后通过终端输入"sudo apt purge"并按下键盘上的回车键。这将永久删除所有不必要的文件。
完成后,请尝试重新安装您需要的程序。
始终保留系统的当前镜像备份。使用Clonezilla随时保持备份。这是一个困难的情况。我是新手,如果我的建议不好,请原谅。
感谢阅读!

在Synaptics(Ubuntu18)中,您可以打包->强制版本...
如果可用,请在组合框中选择版本。

怎么样,解释得更详细一些。 - mathtick
我没有网络,也没有鼠标。 - mathtick