Unix/Linux 中是否有类似 Windows 安装程序的事务性安装过程?
Makefile 或包管理器(例如 deb)等安装脚本通常只是直接复制文件来覆盖现有文件。
答案1
我完全不知道 Windows 安装程序工具的属性,但看看Nix 包管理器(和NixOS GNU/Linux 发行版围绕它构建)。它具有原子更新功能,因为它根本不会覆盖任何旧的内容。
另一种方法是使用文件系统快照支持,例如就像快照yum
一样btrfs
(还snapper
在 OpenSUSE 上;dpkg
也可以有前/后操作,所以我想这也可以用它来完成)。
编辑使用文件系统快照./configure && make && make install
也是一种事务性的......
答案2
典型的包管理器确实会注意确保包已安装或未安装。通常会有一个过渡期,在此期间旧版本仍然安装,新文件已经解压,但名称不同。如果过渡期间系统崩溃,软件很有可能还能用;需要恢复安装命令才能完成安装。有一个时间窗口,在此期间一些新文件已经到位,一些旧文件仍然到位,但它很小。
另一方面,如果存在安装错误,则根据捕获错误的时间,即使新版本无法使用,程序也可能已切换到新版本。这在某种程度上是不可避免的:也许您只会发现新版本无法使用,因为您启动程序并打开现有文件,但无法正确解释它们。大多数 Linux 软件包管理器没有一种简单的方法来恢复升级:通常,您需要手动下载旧版本的软件包并强制安装。
当您使用 makefile 或等效文件安装从源代码编译的软件时,应将该软件安装在其自己的目录中。将每个版本安装在其自己的目录中,并在删除旧版本之前测试新版本。该程序可以从其安装目录立即使用,因此无需在旧版本和新版本之间进行切换:只需运行新版本即可。使用斯托或者X斯托在公共层次结构中创建符号链接,这样您就可以在您的PATH
等等中拥有可执行文件;看跟踪程序。