openSUSE Leap 15 中的事务性更新

2018年5月15日 | Douglas DeMaio | 无许可

本博客是 openSUSE Leap 15 发布前的一系列技术博客的一部分。所有博客都提供了关于 openSUSE Leap 15 的用例以及发行版中可用的软件包。祝您阅读愉快。

事务更新是即将发布的 openSUSE Leap 15 的一项令人兴奋的新功能,该版本计划于 5 月 25 日正式发布。

由 Kubic 项目贡献,事务更新为 openSUSE 系统提供了一种以完全“原子”方式更新操作系统及其软件包的方法。更新要么作为一个单一事务全部应用到系统,要么根本不应用。这不会影响正在运行的系统。如果更新失败,或者成功的更新被认为不兼容或有其他问题,可以将其丢弃以立即将系统恢复到其以前的工作状态。

这与开源世界中已经存在的替代方案不同。一些用户采用了一种相当昂贵的方法,即在磁盘上维护多个系统版本,并在多个分区之间切换,以消除对破坏完美运行的系统的恐惧。

这种折腾的方法有效,但会占用大量的磁盘存储空间和维护工作。更现代的方法,例如使用 ostreesnap 试图解决这些问题,并为他们的用户带来原子/事务更新。然而,这些解决方案会产生意想不到的后果,因为用户、开发人员和合作伙伴软件供应商都在学习如何管理他们的系统和现有软件包的新方法,这需要重新打包或转换。所有这些都发展成一种采用者需要重新设计他们的思维模式、系统、工具和公司策略才能与这些巧妙的工具协同工作的情况。Kubic 的事务更新功能力求避免这些缺陷。

在底层,事务更新变得很简单。利用 openSUSE Leap 中受信任的默认技术 btrfssnapperzypper,事务更新执行的操作与 Leap 中的传统快照和回滚非常相似。但是,事务更新永远不会触及正在运行的系统。与其修补当前系统,事务更新工具会创建一个新的快照。更新所需的所有操作都将执行到快照中,确保当前系统未受影响,并且没有更改影响正在运行的系统。

在更新结束时,如果更新成功,则将完成的快照标记为新的默认快照。然后,这些更新将在系统重新启动时生效。如果更新不成功,则会丢弃快照,并且不会对系统进行任何更改。

  • 要丢弃待定快照,只需在重新启动前运行 transactional-update rollback

  • 如果发生意外的无法成功启动的重新启动,只需从系统的 grub 菜单中选择最后一个工作快照,然后运行 transactional-update rollback

为了充分利用此新功能,用户应在用户界面选择的全新安装期间选择“事务服务器”。

事务服务器角色默认情况下每天自动运行 transactional-update。该选择默认情况下启用了 transactional-update.timer 和 rebootmgr.service。事务服务器角色具有完全自动化的更新安装,并且默认情况下在安装更新后早上 0330 到 0500 之间重新启动,可以更改此设置。

想要更改重新启动的时间和行为的用户可以编辑 /etc/rebootmgr.conf。希望完全负责更新和重新启动事务服务器本身的用户可以禁用 transactional-server.timer 和 rebootmgr.service systemd 单元。

此服务器角色功能为 openSUSE Leap 15 用户提供了更多可能性,例如运行定期修补的 Web 或邮件服务器而不会出现故障。可能性甚至可以进一步扩展到运行虚拟化主机或构建自动化的物联网 (IoT) 设备以及 事务桌面 都可以轻松完成。

常见问题解答

问:当有更新时,重新启动是否会花费更长的时间?

答:完全不是。由于我们使用了 btrfs 和 snapper,因此由 transactional-update 更新的系统启动时间与“正常”openSUSE 安装相同。回滚也只需要几分之一秒的时间来准备和启动生效。

问:transactional-update 是否使用与 zypper 相同的仓库?我能安装我想要的任何软件包吗?

答:是的。为您的选择的发行版构建的官方和非官方仓库中的任何软件包都应该可以通过 transactional-update 安装。仓库管理可以使用 zypper,就像常规 openSUSE 安装一样。存在一些软件包可能无法安装在只读根文件系统上的问题。这表明缺乏对 openSUSE 既定打包指南的遵守,如果有人发现此类软件包问题,请 报告错误

问:是否有当前或未来的方法可以在桌面系统上使用此功能?

答:目前,我们专注于确保此功能对服务器用例工作得非常好。但实际上,任何用户运行 $desktop-pattern-of-their-choice 中的 transactional-update pkg 并安装他们想要的任何桌面环境和软件都不会受到阻止。有些人已经这样做了,我们相信 openSUSE 的桌面团队会考虑贡献,以使事务 openSUSE 桌面开箱即用地提供出色的用户体验。

问:我是否可以在没有只读根文件系统的情况下使用 transactional-update?

答:是的,transactional-update 可以在没有只读根文件系统的情况下工作。但是,选择这种方法的用户应该知道,当他们重新启动时,他们的 rootfs 将是在 transactional-update 期间创建的一个。这意味着可能会丢失在 transactional-update 和重新启动之间所做的任何自定义更改。因此,建议如果您不使用只读文件系统,则每次更新后立即重新启动。

问:SUSE 客户何时可以期望在 SUSE Linux Enterprise 的某个版本中看到此功能?

答:虽然这是一个好问题,但作为 openSUSE 项目,我们无法提供太多可靠的答案。 transactional-update 已经可用在 SUSE 的 CaaS 平台 中,并且我们了解到可能会考虑在 SUSE Linux Enterprise 15 Service Pack 1 中包含此功能。对此感兴趣的 SUSE 客户应联系其常用的 SUSE 联系人。

问:我如何贡献?

答:欢迎在 transactional-updaterebootmgr GitHub 项目中提出任何更改。如果您对事务更新或 Kubic 项目有任何其他想法或问题,请随时通过加入我们的 IRC 频道 #kubic on irc.freenode.org 或通过邮件发送到 openSUSE Factory 邮件列表与我们联系。

谢谢,玩得开心!

分享此帖子