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

Ste*_*ler 23 distribution-choice package-management

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

例如:我升级了包 A、B 和 C。在使用这些包几天后,我在 B 中遇到了一个破坏交易的错误。

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

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

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

Ste*_*itt 21

NixOS支持升级回滚,尽管据我所知,它并没有像您希望的那样进行:如果您在一个操作中升级 A、B 和 C,您可以回滚整个操作,但不仅仅是 A 和B.(您应该能够回滚 A、B 和 C,然后升级 C...)尽管从事务的角度来看这是有道理的。

Debian(如果您不再拥有旧软件包,则与快照存档结合使用)将允许您降级 B,并且在许多情况下,像apt或这样的工具aptitude会发现 A 也需要降级(一旦您让他们相信您不想简单地升级 B)。但是正如您所说,这往往有些混乱,并且无论如何在 Debian 中都不支持软件包降级(这意味着它们大部分时间都可以工作,但如果它们损坏就不是错误)。


and*_*coz 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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 检查详细信息,使用 sudo yum history info 10

  3. 回滚到历史中的前一个点,使用 sudo yum history rollback 9

警告

有一些明显的警告:

  1. 如果旧的包不再可用,你就干杯(引用@vonbrand),
  2. 如果你在 yum 之外安装任何东西,你可能会打破历史。

在我的示例中,<在带有 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
Run Code Online (Sandbox Code Playgroud)

  • 有趣的功能!但由于“吐司”不符合我的要求。 (3认同)

and*_*coz 7

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

如果您在安装期间使用标准文件系统配置,则默认启用

启用 Snapper 后,它与yast2和完全集成zypper。每次您安装或升级某些东西(或创建用户等)时,它都会创建一个文件系统快照。

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

在此处输入图片说明

  • 请记住,如果您的卷包含任何数据,而不仅仅是二进制文件和脚本,那么回滚快照也会回滚您自己的数据。这个选项听起来有风险,最适合那些*真正*知道其文件系统布局的人。对我来说,快照一直用于一致的备份、复制和完全恢复情况。 (3认同)

kub*_*zyk 6

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

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

作为奖励,有一个简单的本机命令mksysb可以创建可引导的独立系统备份。可以在由于某些故障/损坏而无法启动的完全功能失调的系统上简单启动的文件。

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


von*_*and 5

在 Fedora 中(我相信在其他发行版中也是如此)您可以要求返回到以前的版本:

dnf downgrade <packages>
Run Code Online (Sandbox Code Playgroud)

为您提供倒数第二个版本的软件包,您可以通过以下方式请求特定版本:

dnf downgrade <package>.<version>
Run Code Online (Sandbox Code Playgroud)

这仅适用于软件包在存储库中仍然可用的情况。无论如何,该功能并非闻所未闻。它有其障碍,如果升级的一部分是更改配置,则回滚不一定是确切的过去版本。

  • @MTilsted,因为它已经太旧了?存储库并不包含从一开始就包含的所有版本。 (2认同)
  • 在 dnf.conf(与 yum.conf 相同)中,keepcache=true 旧软件包可用,因为 lond 缓存不会手动清除。但它使包缓存“膨胀”。 (2认同)