Debian 的事务和回滚

Debian 的事务和回滚

我不知道这是否是常识,但 RPM 支持在执行升级(例如,这会破坏某些东西)后回滚到以前的安装。您可以将 rpm 传递给--重新打包标记以生成一组将要更改的当前安装文件的 RPM。然后您可以说“rpm -Uvh --rollback ‘2 小时前’“并轻松将您的机器回滚到 2 小时前的状态。

我的问题是,有人在基于 Debian 的发行版中发现过类似的东西吗?

答案1

我不相信有这样的选项aptitudeapt-get但是,aptitude/var/log/aptitude.您可以使用它来尝试回滚。

它会如何进行取决于具体情况。如果你只是想删除一些你安装的软件包,这应该很简单。但是如果你已经升级(因为你遵循测试或不稳定,或者因为你安装了安全升级或点发布升级),那么事情会稍微复杂一些。你可以检查你的缓存中是否还有旧的 .deb,或者你可以访问Debian 快照

如果您不使用,您可以在的日志(在)aptitude中四处查看,但我发现这样使用起来不太友好。dpkg/var/log/dpkg.log

编辑现在我看了这篇文章,有一件事有点相似。您可以通过执行此序列来获取软件包的状态。首先获取当前软件包状态的列表:

dpkg --get-selections "*" > my_packages-datestamp

然后稍后您可以使用该包列表进行回滚:

dpkg --set-selections < my_packages-datestamp
apt-get -u dselect-upgrade

我曾使用这种方法重新安装,然后在机器上安装最新的软件包集,效果很好。不过,效果如何取决于以前的软件包列表中有哪些软件包可供您使用 - 无论是在您的缓存中还是在您的存储库中。

答案2

dpkg 或任何 apt 相关工具中都没有这样的选项,原因很简单。安装软件包不仅要解压文件,还要配置它们,这是通过运行与每个软件包相关的安装前/安装后/删除脚本来完成的。

恢复旧文件很容易,但撤销 postinst 脚本所做的操作则困难得多。理论上,dpkg 支持降级,因为它向脚本提供了所有必要的信息,以便脚本能够检测到降级时间,但实际上很少有软件包能够正确支持(Debian 官方不支持降级)。

但请注意,对于许多没有 postinst 脚本的简单包来说,降级效果很好。apt-get并且aptitude可以用于强制安装旧版本,语法如下:

aptitude install foo/testing # Downgrade a package to testing if you run unstable
aptitude install foo=1.2-3 # Downgrade to 1.2-3 if you run a higher version

因此,如果您记录所有已安装的软件包及其版本,则在大多数情况下可以恢复到以前的状态。您还可以通过分析 dpkg 的日志/var/log/dpkg.log (或 aptitude 的日志,如果您仅使用aptitude而不是apt-get)来找出以前安装的版本。

答案3

遗憾的是,dpkg 或 apt 都无法做到这一点。Debian 软件包实际上并不适合降级,并且不支持或测试。当然,它也不提供快照支持。

不过,话虽如此,您可以手动完成。如果您查看 /var/log/dpkg.log,您将找到已发生的操作的日志。它有点冗长,但您应该能够获取已安装的软件包的先前版本的列表。假设它们仍然在 sources.list 中配置的存储库中可用,您应该能够执行以下操作:

#apt-get 安装 foo=1.2 bar=3.4-5

如果它们在存储库中不可用,您可能仍会在 /var/cache/apt/archives/ 中找到它们,或者您可能能够在某个地方找到可供下载的软件包,也许是在另一个存储库中。获得软件包列表后,您可以运行:

# dpkg -i foo_1.2_amd64.deb bar_3.4-5_all.deb

然后你会发现你回到了之前安装的版本。你可能会发现有些东西不一样了,比如配置。

有一种方法可以使用 LVM 进行快照,但在现有安装中启用这种方法不是特别快或容易。您可能必须重新安装系统并设置驱动器以使用 LVM。然后,您可以创建 LVM 快照,进行升级,测试它,然后如果您满意,则删除快照,如果您不满意,则回滚到该快照。显然,自快照以来写入的任何数据以及软件包都将被删除。

相关内容