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