9 事务更新 #
事务更新在 SUSE Linux Enterprise Server 中以技术预览形式提供,当根文件系统为只读时,可使用技术更新来更新 SLES。事务更新具有原子性(仅当所有更新都成功时,才会应用所有更新),且支持回滚。它不影响正在运行的系统,因为只有在重引导系统后,才会激活更改。由于重引导是中断性的操作,管理员必须确定重引导的开销是否高于中断运行中服务的开销。如果重引导的开销过高,则不要使用事务更新。
事务更新由 transactional-update
脚本每天运行。该脚本将检查可用的更新。如果存在任何更新,则它会在后台创建根文件系统的新快照,然后从发布渠道提取更新。完全更新新快照后,该快照将标记为活动快照,并在下一次重引导系统后,成为新的默认根文件系统。当 transactional-update
设置为自动运行(默认行为)时,该脚本还会重引导系统。更新运行时间以及重引导维护时段均可配置。
只能更新属于根文件系统快照的包。如果包中包含不属于该快照的文件,更新可能会失败或中断系统。
无法更新需要接受许可证的 RPM。
9.1 技术预览的限制 #
技术预览的功能存在某些限制。transactional-update
对于以下包不起作用:
nginx 默认的 index.html 页可能不可用
tomcat-webapps 和 tomcat-admin-webapps
phpMyAdmin
sca-appliance-*
mpi-selector
emacs 可正常工作(Emacs 游戏除外)
联结 和 bind-chrootenv
docbook*
sblim-sfcb*
texlive*
iso_ent
openjade
opensp
pcp
plymouth
postgresql-server-10
pulseaudio-gdm-hooks
smartmontools
系统安装程序的更新程序组件不适用于只读的文件系统,因为此类文件系统不支持事务更新。
其他注意事项:
一般情况下,最好在更新系统之后尽早重引导计算机。
每次只能应用一项更新。在应用一项更新之后到应用下一项更新之前,请务必重引导。
在事务更新之后直到将计算机重引导,都不应运行
update-alternatives
。在事务更新之后直到重引导,都不要创建新的系统用户或系统组。允许创建普通用户和组(UID > 1000,GID > 1000)。
YaST 尚不能识别事务更新。如果 YaST 模块需要安装额外的包,此操作将无法正常执行。而只是修改
/etc
中配置文件的常规系统操作可正常进行。对于 php7-fastcgi,必须手动创建指向
/usr/bin/php-cgi
的符号链接/srv/www/cgi-bin/php
。ntp是要从早期 SLES 版本迁移的 Legacy 模块的一部分。它在新的 SUSE Linux Enterprise Server 安装中不再受支持,且已替换为 chrony。如果您继续使用 ntp,需要进行全新安装才能正常使用事务更新。
sblim-sfcb:整个 sblim 生态系统与事务更新不兼容。
btrfs-defrag
(来自 btrfsmaintenance 包)不适用于只读根文件系统。对于
btrfs-balance
,/etc/sysconfig/btrfsmaintenance
中的变量BTRFS_BALANCE_MOUNTPOINTS
必须从/
更改为/.snapshots
。对于
btrfs-scrub
,/etc/sysconfig/btrfsmaintenance
中的变量BTRFS_SCRUB_MOUNTPOINTS
必须从/
更改为/.snapshots
。
9.2 启用 transactional-update #
必须在系统安装期间启用 Transactional Server 模块,然后选择 Transactional Server 系统角色。不支持稍后再于正在运行的系统中从 Transactional Server 模块安装任何包,此操作可能会使系统中断。
请注意,不支持更改根分区的子卷布局,或者将根分区的子目录或子卷放到其各自的分区中(/home
、/var
、/srv
和 /opt
除外),此类操作很可能会使系统中断。
9.3 管理自动更新 #
自动更新由每天运行一次的 systemd.timer
控制。此操作会应用所有更新,并告知 rebootmgrd
应重引导计算机。您可以调整更新运行时间,具体请参见“systemd.timer(5)”。要调整维护时段(即 rebootmgrd
重引导系统的时间),请参见“rebootmgrd(8)”。
您可以使用以下命令禁用自动事务更新:
root #
systemctl --now disable transactional-update.timer
9.4 transactional-update
命令 #
transactional-update
命令会启用更新的原子性安装或去除,即仅当所有更新都可以成功安装时,才会应用这些更新。在应用更新之前,transactional-update
会创建系统的快照,您可以恢复此快照。重引导后,所有更改才会生效。
--continue
可使用
--continue
选项对现有快照进行多次更改,而无需重引导。默认的
transactional-update
行为是从当前根文件系统创建新快照。如果您忘记了某项操作,例如,忘记了安装某个新包,必须重引导来应用先前的更改,然后再次运行transactional-update
以安装忘记安装的包,并再次重引导。不能在未进行重引导的情况下多次运行transactional-update
命令来向快照添加更多更改,因为这样做只会创建多个独立的快照,这些快照并不会包含先前快照中的更改。您可使用
--continue
选项在不重引导的情况下,进行任意次数的更改。每次会创建一个独立的快照,且每个快照都包含您在先前快照中进行的所有更改以及新的更改。重复此过程任意次数,当最终快照包含所需的全部更改时,再重引导系统,然后最终快照便会成为新的根文件系统。--continue
选项的另一个有用功能是,可让您选择任一现有快照作为新快照的基础快照。以下示例演示如何运行transactional-update
在基于快照 13 的某个快照中安装新包,然后再次运行该命令来安装另一个包:root #
transactional-update pkg install package_1
root #
transactional-update --continue 13 pkg install package_2
--continue [num]
选项会调用snapper create --from
,请参见第 7.6.2 节 “创建快照”。cleanup
如果当前根文件系统与活动的根文件系统为同一个(在重引导之后,
transactional-update
创建包含更新的新快照之前),将为没有清理算法的所有旧快照设置一个清理算法。如此可确保 Snapper 会删除旧快照。(请参见“snapper(8)”中有关清理算法的章节。)此操作还会去除/var/lib/overlay
中所有未引用的(因此也未使用)/etc
覆盖目录:root #
transactional-update cleanup
pkg in/install
使用
zypper install
命令从可用渠道安装单个包。此命令还可用于安装程序临时修复 (PTF) RPM 文件。root #
transactional-update pkg install package_name
或者
root #
transactional-update pkg install rpm1 rpm2
pkg rm/remove
使用
zypper remove
命令从活动快照中去除单个包。此命令还可用于去除 PTF RPM 文件。root #
transactional-update pkg remove package_name
pkg up/update
使用
zypper update
命令更新活动快照中的单个包。只能更新属于基础文件系统快照的包。root #
transactional-update pkg remove package_name
up/update
如果有新的可用更新,将会创建一个新快照,并使用
zypper up/update
更新该快照。root #
transactional-update up
dup
如果有新的可用更新,将会创建一个新快照,并使用
zypper dup –no-allow-vendor-change
更新该快照。然后,该快照将会激活,并在重引导后成为新的根文件系统。root #
transactional-update dup
patch
如果有新的可用更新,将会创建一个新快照,并使用
zypper patch
更新该快照。root #
transactional-update patch
rollback
此选项会设置默认子卷。在使用读/写文件系统的系统上可调用
snapper rollback
。在只读文件系统上,如果未提供任何自变量,当前系统将设置为新的默认根文件系统。如果您指定了编号,则该快照将用作默认的根文件系统。在只读文件系统上,不会创建任何额外快照。root #
transactional-update rollback snapshot_number
grub.cfg
此参数会创建新的 GRUB2 配置。有时需要调整引导配置,例如,添加额外的内核参数。编辑 /etc/default/grub,运行
transactional-update grub.cfg
,然后重引导以激活更改。您必须立即重引导,否则,下一次运行 transactional-update 时会使用默认值重写新的 GRUB2 配置。root #
transactional-update grub.cfg
reboot
此参数在完成操作后会触发重引导。
root #
transactional-update dup reboot
--help
此时会输出包含选项和子命令的帮助屏幕。
root #
transactional-update --help
9.5 查错 #
如果升级失败,请运行 supportconfig
来收集日志数据。将生成的文件(包括 /var/log/transactional-update.log
)提供给 SUSE 支持人员。