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

在过去的5年中,这种情况多次发生在我身上:升级破坏了我的系统。 每次我最终都遇到这种情况,我必须重新安装整个系统,这真的很烦人。

有没有办法回滚最近的升级,以便能够在没有重新安装的情况下拥有function系统? 如果没有,哪种方式可以作为最优先的想法?

我读到这个想法在brainstorm.ubuntu.com中有描述,但感觉它已经死了……论坛里充满了破坏事物的升级示例,这就是为什么我觉得有关这个话题需要做些什么的原因。 谢谢!

在synaptics中,您至少可以控制最近的更新:文件菜单,历史记录。

(如果突触是可启动的,系统损坏)。 所以使用apt -…-命令来恢复它们的更新,它应该不会太难。

我猜命令行也有一个历史命令。

也许您必须删除整个包,并安装特定版本。 Afaik,可以安装特定版本,但我从来没有必要这样做。

更新:查看如何处理apt:

查找最近3x24h中安装的软件包:

find /var/lib/dpkg/info/ -name \*.list -mtime -3 | sed 's#.list$##;s#.*/##' 

使用apt-cache策略,您可以看到程序的可用版本:

 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/(if> = 10.4)中创建一个新文件,

 Package: program Pin: version 3.6.3* Pin-Priority: 1000 

大多数情况下,您可以查询/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开关就不是最好的主意 – 对进程有更多的控制(以避免破坏依赖)。 做一些validation“y”时你们大多数人都不会打破他们的手指

在大多数情况下,可以通过这种方式进行回滚,但如果依赖性已经被破坏 – 您可能会遇到更大的问题。

大多数情况下,如果你的系统坏了,那就是内核问题。

只需启动较旧的内核并重新安装可能无法正确更新的最新软件包(尤其是内核软件包)。 几点说明:

 /var/log/dpkg.log 

是你的朋友检查最近更新/安装的包的列表是什么

 sudo apt-get -f install 

大部分时间都可以修复半安装的软件包

不幸的是,还没有办法做到这一点。 文件系统级别的快照/回滚是即将推出的btrfs的function之一,但它还有一种方法可以使function完整且稳定,足以用作默认文件系统。

在进行重大升级时,我使用Clonezilla克隆磁盘。 将其刻录在CD上,备有备用(外置)硬盘并按照Clonezilla LiveCD上的说明进行操作。 选择partition-image模式,这使用最小的空间。

如果您认为自己已经损坏了系统(或希望恢复任何更改),只需在Clonezilla LiveCD中启动,选择(外部)HDD上的图像并将其恢复。 由于这些映像是磁盘上每个位的字面副本,因此可能需要几个小时,具体取决于磁盘速度和连接速度(数据之间的连接,通常是外部USB HDD和计算机)。

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

您可以轻松地使用apt或dpkg安装给定软件包的旧版本(降级) 。 查找软件包的旧版本是一个问题,因为随着更新的推出,这些版本通常会从池和镜像中消失。

如果从安装CD或过时的镜像或缓存安装软件包,则还需要将其固定到旧版本,以便在允许之前不会升级。 这意味着您必须注意更新并测试它们,直到您的问题得到解决。 这当然是一个问题,因为同时(可能永远)你将留下未固定的,可能不安全的包。 这意味着每个具有某种系统问题的用户都将处于某种随机状态,直到他们能够解决它。

所有软件也不是向前兼容的,因此当使用较新的配置或数据文件时,旧版本的某些东西可能无法正常运行。 显然,除非您在升级完成之前将所有用户数据回滚到某个状态,否则无法解决此问题。

如果有办法做到这一点会很棒,但这是一个很大的问题。 任何认为存在连贯解决方案的人都应该撰写提案并邀请评论,或者更好的是,制作概念validation解决方案(代码,脚本,文档)。 唠叨和抱怨不是建设性的。

由于没有干净的技术解决方案,大多数软件都是以“唯一的前进方向”心态开发(和集成)的。 试图管理过时的版本是浪费每个人的时间。 发现的问题尽快在新版本中修复。 作为一个次要的解决方案,我希望看到以前的软件包版本的存档保留在偶尔的临时解决方法中。

与此同时,您可以报告错误,并且不要指望前沿软件永远不会失败。 一旦找到,修复程序应该在下一次更新中。 开发者是人类(大多数),因此容易犯错。 计算机很繁琐,充满了疯狂的多样性和细节。 使用良好支持的组件和稳定的集成软件分发的防御性维护系统可以非常稳定,而不会变得不安全或不可升级,尽管如此。