是否有支持回滚更新软件包的发行版?


23

是否有工具甚至整个发行版都支持更新后回滚已更改的软件包?

举个例子:我升级了A,B和C软件包。使用这些软件包几天后,我遇到了B交易中的错误。

当我提交错误报告时,我还需要将B降级到以前的版本,以便可以完成我打算做的事情。同时,A依赖于B,因此也需要降级,但是C两者均独立,因此可以保持其当前版本。

是否有支持此功能的工具或发行版?

我知道大多数发行版都有降级软件包的方法,但这通常是粗略的甚至是不可能的,因为以前的软件包已从存储库中删除,并且在某些情况下(例如在升级X服务器和Mesa之后)确实可以实现。 。 凌乱。


3
注意事项:如果软件包版本更改较小,则可能适用以下答案;但是请注意,较大的软件包更改可能会升级磁盘上的数据,此后在旧版本中将无法正常工作。例如,mysql-server(或joomla)主要升级将添加和修改字段并升级SQL表,inn2升级可能会更改数据库类型,或者某些发行版内核升级可能会将ext3升级到ext4文件系统,或者某些软件包升级会转换配置文件,防止这些“不可还原”更改的唯一方法是LVM / btrfs / etc快照(或备份/还原要慢得多)。
Matija Nalis

@MatijaNalis +1提及了!
斯特芬·温克勒

Answers:


21

NixOS支持升级回滚,尽管据我所知,它并没有达到您想要的程度:如果在一个操作中升级A,B和C,则可以回滚整个操作,而不仅仅是A和B。 B.(您应该能够回滚A,B和C,然后升级C...。)但是从事务的角度来看这是有意义的。

Debian(如果您不再拥有旧软件包,则与快照存档结合使用)将允许您降级B,在许多情况下,诸如apt或的工具aptitude会指出A也需要降级(一旦您说服了他们,不想简单地升级B)。但是正如您所说的那样,有些杂乱无章,而且Debian不支持软件包降级(这意味着大多数时候它们都可以工作,但是如果它们崩溃了,那就不是bug)。


1
看起来很有趣!社区看起来活跃而健康。我一定会试试看,谢谢!如果在星期五晚上没有更好/不同的答案,我会标记您的答案。
斯特芬·温克勒

NixOS上的回滚很棒,但是真正的力量来自于声明式方法:软件包(和系统)的描述可以从git存储库中获取,因此您可以像管理软件项目(包括分支)一样来管理系统和合并等。(由于原子性的升级和纯净,您永远都不会破坏东西)
Daniel Jour

Nix软件包管理器还可以与其他Linux发行版的“本地”软件包管理器并排运行。它也可以在OSX上运行,并且我已经看到它可能在Windows上运行。您也可以告诉Nix使用某些软件包的“本机”版本,而不是安装自己的副本,尽管这样会丢失某些保证(例如,它可能不会注意到您已经摆脱了某些依赖关系)。
Warbo

只是为了方便起见,我设法在笔记本电脑上安装了NixOS(KDE4映像给了我一个内核恐慌,但较小的映像(约390 MB)可以启动。对于只安装基于Debian发行版的人来说,这很有趣/很有趣。 ,我还不了解有关程序包管理器的某些知识,尤其是在桌面环境中。我安装了gdm / gnome-shell,但无法正常工作,然后在configuration.nix文件中以及在重建时启用了gnome3 / gdm它,软件包和它们的依赖项都重新下载了。重启后它确实起作用了,但我不明白为什么
斯特芬·温克勒

@SteffenWinkler在使用NixOS时,通常不使用安装东西nix-env,而是在其中指定东西configuration.nix然后运行nixos-rebuild switch。这样做的好处是,所有系统配置都放在一个位置,并且很容易备份整个系统的配置(只需备份configuration.nix文件)。
Pauan

15

在任何yum基于发行版(例如Red Hat ELCentOS等)上,您可以:

  1. 使用以下命令检查系统更改的历史记录 sudo yum history list

    Loaded plugins: fastestmirror
    ID     | Login user               | Date and time    | Action(s)      | Altered
    ------------------------------------------------------------------------------
        10 | Administrator <admin>    | 2016-03-08 09:08 | Install        |   11   
         9 | Administrator <admin>    | 2016-03-03 16:48 | Install        |    1   
         8 | Administrator <admin>    | 2016-03-03 16:09 | Install        |    5   
         7 | Administrator <admin>    | 2016-02-26 18:13 | Install        |    1   
         6 | Administrator <admin>    | 2016-02-26 15:12 | Install        |   27   
         5 | Administrator <admin>    | 2016-02-26 15:07 | Install        |    1   
         4 | Administrator <admin>    | 2016-02-26 15:05 | Install        |    3  <
         3 | Administrator <admin>    | 2016-02-26 15:03 | Install        |    1 > 
         2 | Administrator <admin>    | 2016-02-26 15:01 | I, U           |   49   
         1 | System <unset>           | 2016-02-26 14:38 | Install        |  296   
    history list
    
  2. 检查详细信息,使用 sudo yum history info 10

  3. 使用以下命令回滚到历史记录中的上一个点 sudo yum history rollback 9

警告

有一些明显的警告:

  1. 如果旧的包装不再可用,请敬酒(引用@vonbrand),
  2. 如果您在yum之外安装了任何软件,则可能会破坏历史记录。

在我的示例中,<在ID为ID的行中4(在最后一列中)表示我无法回滚到该点。

sudo yum history rollback 2
Loaded plugins: fastestmirror
Transaction history is incomplete, before 4.
 You can use 'history rollback force', to try anyway.
Error: Failed history rollback, incomplete

3
有趣的功能!但由于“烤面包”不符合我的要求。
斯特芬·温克勒

AFAIK仅在RHEL / CentOS 6或更高版本中才可能。如果您仍在使用RHEL / CentOS 5,那么您就是SOL。
通配符

顺便说一句,在具有托管存储库的公司环境中,此方法非常可行,因为您始终可以使用旧软件包,即使您需要使用--enablerepo标志来启用降级的原本废弃的旧存储库也是如此。
通配符

与仅重新安装旧版本相比,回滚有什么好处?
布拉奇利

@Bratchley自动化!yum 只需保留已安装的软件包和版本列表,并在重新安装旧版本时检查相关性即可。显然,您可以手工完成
andcoz '16

7

OpenSUSE上,您可以轻松地将Snapper与Btrfs文件系统一起使用

如果在安装过程中使用标准文件系统配置,则默认情况下启用它

启用快照程序后,它将与yast2和完全集成zypper。每次您安装或升级某些内容(或创建用户等)时,它将创建一个文件系统快照。

要将系统回滚到以前的状态,只需运行yast2 snapper

在此处输入图片说明


确实是有趣的工具。虽然我很喜欢ext4。会研究这个!我是否假设Snapper不是“绑定”到OpenSUSE而是绑定到btrfs,这是正确的吗?
斯特芬·温克勒

快照程序是由SUSE开发的。它是工具的集合,这些工具可以自动在“事件”上创建Brtfs快照。我想您可以在其他发行版上使用它,但是我不确定。无论如何,您都可以在任何发行版上手动创建Brtfs快照。
andcoz

3
请记住,如果您的卷包含任何数据,而不仅仅是二进制文件和脚本,那么回滚快照也将回滚您自己的数据。此选项听起来有些冒险,最适合真正了解其文件系统布局的用户。对我而言,快照始终是用于一致的备份,复制和总恢复情况。
jimp

1
还要注意,许多软件包都包含文件和/或目录,/var因此/即使它是单独的fs或子卷,也必须将其回滚。与依赖于OS升级回滚之类的功能(在一半的情况下通常很容易做到,但要正确解决这是一个极其困难的问题)相比,在将升级应用到生产服务器之前彻底测试升级要好得多。
cas

1
@Jimp一个很好的建议。无论如何,除非/home位于单独的非快照文件系统中,否则OpenSuSE不会启用快照程序
andcoz '16

6

AIX 非常擅长回滚更新。好吧-我们在Unix / Linux站点上,并且您从未指定要使用Linux :)

每次AIX更新都会将所有修改过的文件保存在/ var文件系统内的单独子目录中。更新可以用一个简单的本地命令被还原,而还原并不需要网络来达到,它并不需要任何媒体/包,它不会重新安装任何东西,它不依赖于任何快照技术-效果仅仅是文件重新显示为更新前的样子。

另外,有一个简单的本地命令mksysb可以创建可启动的独立系统备份。可以简单地在完全无法正常运行的系统上启动的文件,该系统由于某些故障/损坏而无法启动。

这都是具有数十年历史的成熟技术:)


您是否经常遇到这样的问题:以这种方式还原的程序处于不一致的状态并回滚(例如,其存储引擎已更改的数据库或服务已切换为新的配置文件格式),或者是否有解决此问题的好方法那?
Josh Rumbut

1
这是我为传统上以压缩/压缩tarball分发的软件构建基本软件包管理系统时使用的模型。无论何时安装更新,它都会首先为所有要修改的内容构建一个“回滚包”。如果没有在此期间应用其他更新程序包,则可以使用此回滚程序包还原。我经常想知道适当的软件包管理器是否可以做到这一点,但是鉴于仅以相反顺序回滚的限制……也许我们应该只使用git。
蒙迪·哈德

该死的。我应该指定我的意思是GNU / Linux发行版。但是有趣的是,现在AIX似乎能够运行GNU / Linux“程序”,我想我会仔细看一下。
Steffen Winkler

5

在Fedora中(我也可以肯定在其他发行版中),您可以要求回到以前的版本:

dnf downgrade <packages>

获取包的倒数第二个版本,您可以通过以下方法索取特定的版本:

dnf downgrade <package>.<version>

仅当软件包在存储库中仍然可用时,这才有效。无论如何,该功能并非闻所未闻。它有它的缺点,如果升级的一部分是要更改配置,则回滚不一定是确切的过去版本。


您还可以使用dnf历史记录撤消#thing撤消
清晰的时间

This only works if the package(s) are still available in the repositories. 是的,这就是问题所在。我对此似乎没有一个“更广泛的”解决方案感到惊讶,特别是在滚动发行数量方面。到目前为止,似乎NixOS是我最好的选择,或者我需要某种系统映像工具,该工具只能处理差异,并且可以在最近20次更新后将系统还原到特定时间点。
斯蒂芬·温克勒

@SteffenWinkler,如果旧的软件包不再可用,那就敬酒了。明显。除非您有某种本地备份。
vonbrand

2
@MTilsted,因为它已经太旧了?存储库不包含从黎明起的所有版本。
vonbrand '16

1
在dnf.conf中(与yum.conf相同)具有keepcache = true可用的旧软件包,因为未手动清除lond缓存。但是它去了“膨胀”的包缓存。
mmv-ru

2

Arch Linux还支持降级软件包和内核。您还可以安装downgraderdowngrade工具来自动执行该过程。btrfs解决方案也可以使用,我之前曾使用它进行手动回滚。

我如何回滚系统:

sudo -i
mount /dev/sda3 /mnt/hd #mount the top btrfs subvolume
ls #find the version you want
mv @ @-old #move the '/' subvolume (I named mine '@')
btrfs sub snap @-<date> @ #replace @ with the backup from <date>
sync
reboot #the changes will take effect once the system restarts

btrfs的优点之一是您可以使用子卷和动态“分区”。例如,我有一个/的子卷(称为@),/ tmp(@tmp)和/ home(@home)。这样就很容易进行备份和回滚。我将/ tmp放在一个单独的子卷中,因为将它与系统的其余部分备份似乎毫无意义,因为几乎在每次重新启动时都会将其删除。


我按照Wiki中的链接到达了这里。看起来很酷,从检查存储库来看,有文件可以追溯到2013年!为什么存在时为什么要使用btrfs方法?是因为文件“升级”了吗?还是还有其他原因?
斯特芬·温克勒

在短暂访问NixOS之后,我现在永久切换到Arch Linux。它(Arch Linux)几乎没有我一直认为的那么不稳定,并且它拥有一个健康的社区。
Steffen Winkler

@SteffenWinkler正确。同样,Arch降级选项不受“官方”支持,降级可能会忽略依赖关系(如果出现问题,会变得很混乱)。
Caleb Reister

2

我使用Arch Linux,它将所有下载的软件包存储到其中,/var/cache/pacman/pkg/因此您可以随时降级任何软件包(如果无法启动,请使用实时USB)。从Arch Wiki

pacman -U <file_name_of_the_package>

为防止软件包升级,请在中包含软件包名称/etc/pacman.conf,例如:

IgnorePkg=linux

为了节省空间,您可以使用以下方法清除缓存文件夹:

pacman -Sc

它将删除所有较旧的软件包并保留最新的软件包,或用于删除所有软件包-Scc


请注意,此(忽略软件包)相当于部分升级,不受支持 ...
jasonwryan

我按照Wiki中的链接到达了这里。看起来很酷,从检查存储库来看,有文件可以追溯到2013年!为什么存在时为什么要使用btrfs方法?是因为文件“升级”了吗?还是还有其他原因?
斯特芬·温克勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.