使用 transactional-update 命令管理 SLE Micro
- 解释
使用
transactional-update命令可以修改只读文件系统。修改是在单独的快照中执行的,并且在您引导进入快照之前不会影响正在运行的系统。- 原因
您想要管理 SLE Micro 及其更新,并最大程度地减少因更新失败而导致系统停机的风险,同时确保可轻松回滚。
- 工作量
在 30 分钟内即可了解
transactional-update命令。- 目标
您将了解的
transactional-update工作原理,以及如何使用它来管理系统。- 要求
一个正在运行的 SLE Micro 实例
root特权
1 事务更新 #
1.1 什么是事务更新? #
为了保持基础操作系统的稳定性和一致性,SLE Micro 使用只读的根文件系统。因此,您无法直接对根文件系统执行更改操作,例如使用 zypper 命令。但是,SLE Micro 引入了事务更新功能,可让您对根文件系统应用一项或多项更改。
transactional-update 的默认行为是在每次更改发生后基于当前根文件系统创建新快照。要应用更改,就需要重引导主机。在不重引导的情况下,您无法多次运行 transactional-update 命令将其他更改添加到快照。此操作将创建独立的快照,其中不包含先前快照中的更改。
1.2 事务更新的工作原理 #
每次调用 transactional-update 命令来更改系统时(无论是安装软件包、执行更新还是应用补丁),系统都会执行以下操作:
基于当前的根文件系统或您指定的快照创建新的读写快照。
应用所有更改(执行更新、修补操作或安装软件包)。
将快照切换回只读模式。
如果所有更改都成功应用,则将新的根文件系统快照设为默认快照。
重引导之后,系统引导进入新的快照。
1.3 事务更新的优点 #
事务更新属于原子操作,只有在成功完成后才会应用更新。
更改将在单独的快照中应用,因此不影响正在运行的系统。
更改可以轻松回滚。
1.4 transactional-update 命令内的环境 #
每次运行 transactional-update 命令时,更改都是在新快照中进行。快照中的环境可能不同于您用于运行 transactional-update 命令的外壳中的环境。例如,当前工作目录 ($PWD) 不是设为您运行 transactional-update 时所在的目录,而是设为 /。
从快照内无法访问 /var 目录。此目录也不会包含在快照中。但是,有些目录虽然没有包含在快照中,却能从 transactional-update 环境中访问,例如 /root 目录。
2 transactional-update 命令的用法 #
使用 transactional-update 命令可以原子方式安装或去除更新。如果所有更新都能成功安装,则会应用更新。transactional-update 创建系统的快照,并使用该快照来更新系统。日后,您可以恢复该快照。重引导后,所有更改才会生效。
transactional-update 命令的语法如下:
transactional-update [option] [general_command] [package_command] standalone_commandtransactional-update
如果运行 transactional-update 命令时未指定任何参数或选项,系统会更新自身。
下面进一步说明了可能的命令参数。
transactional-update 选项 #-
--interactive, -i 可以与软件包命令结合使用来开启交互模式。
-
--non-interactive, -n 可以与软件包命令结合使用来开启非交互模式。
-
--continue [number], -c 使用
--continue选项可在不重引导的情况下对根文件系统进行多项更改。有关更多详细信息,请参见第 3 节 “在不重引导的情况下应用多项更改”。--continue选项的另一个有用功能是,可让您选择任一现有快照作为新快照的基础。以下示例演示如何运行transactional-update在基于快照 13 的某个快照中安装新软件包,然后再次运行该命令来安装另一个软件包:>sudotransactional-update pkg install package_1>sudotransactional-update --continue 13 pkg install package_2-
--no-selfupdate 禁用
transactional-update的自我更新功能。-
--drop-if-no-change, -d 如果未对根文件系统进行任何更改,则丢弃
transactional-update创建的快照。如果对/etc目录进行了更改,这些命令会合并回当前文件系统。-
--quiet transactional-update命令的结果将不输出到stdout。-
--help, -h 列显
transactional-update命令的相关帮助。-
--version 显示
transactional-update命令的版本。
2.1 常规命令 #
本节列出了 transactional-update 的通用命令。
-
grub.cfg 使用此命令可重构建 GRUB 引导加载程序配置文件。
-
bootloader 该命令会重新安装引导加载程序。
-
initrd 使用该命令可重构建
initrd。-
kdump 如果对硬件或存储设备进行了更改,就可能需要重构建 Kdump initrd。
-
shell 退出前在新快照中打开读写外壳。该命令通常用于执行调试。
-
reboot 当
transactional-update命令完成后,系统会重引导。-
run <command> 在新快照中运行提供的命令。
-
setup-selinux 安装并启用针对性的 SELinux 策略。
3 在不重引导的情况下应用多项更改 #
transactional-update 命令将更改应用于事务系统上的根文件系统。默认行为是在每次更改发生后基于当前根文件系统创建新快照,然后重引导以应用更改。
要在不重引导的情况下对根文件系统进行多项更改,可以采用多种方法,下面几节中会加以说明:
3.1 transactional-update --continue 选项 #
使用带 --continue 选项的 transactional-update 命令可在不重引导的情况下进行多项更改。每次运行该命令时,都会创建一个不同的快照,该快照会包含先前快照中的所有更改以及您做出的新更改。最终的快照将会包含所有更改。要应用这些更改,请重引导系统,然后最终快照将成为新的根文件系统。
3.2 transactional-update run 命令 #
transactional-update run 命令通常只会运行一条命令,但您可以使用它在一个事务性会话中运行多条命令,只需在命令外壳(如 bash)中串联这些命令即可,例如:
>sudotransactional-update run bash -c 'ls && date; if [ true ]; then echo -n "Hello "; echo '\''world'\''; fi'
transactional-update run 命令具有与第 3.3 节 “transactional-update 外壳”中所述的 transactional-update shell 命令相同的限制,只不过输入的命令会记录在 /var/log/transactional-update.log 文件中。
3.3 transactional-update 外壳 #
transactional-update shell 命令会在 transactional-update 环境中打开一个外壳。在该外壳中,您几乎可以输入任何 Linux 命令来对文件系统进行更改,例如,使用 zypper 命令安装多个软件包,或对只读文件系统中的文件进行更改。您还可以校验先前使用 transactional-update 命令进行的更改是否正确。
事务外壳具有一些限制。例如,您无法使用 systemd 命令控制 start 或 stop 服务,也无法修改 /var 分区,因为该分区未挂载。此外,在外壳会话期间输入的命令不会记录到 /transactional-update.log 文件中。
您对文件系统进行的所有更改都是单个快照的组成部分。完成对文件系统的更改并使用 exit 命令退出外壳后,需要重引导主机才能应用更改。
4 执行快照清理 #
可以使用 transactional-update 清理未使用的文件系统快照和未引用的 /etc 叠加目录。
transactional-update 可识别以下清理命令:
-
cleanup-snapshots 该命令将所有未使用的快照标记为由 Snapper 去除。
-
cleanup-overlays 该命令去除
/var/lib/overlay目录中/etc的所有未使用叠加层。-
cleanup 该命令结合了
cleanup-snapshots和cleanup-overlays命令的功能。
4.1 清理的工作原理 #
如果您运行 transactional-update cleanup 命令,将为所有没有清理算法的旧快照设置一个算法。此外还会标记所有重要快照。该命令还会去除 /var/lib/overlay 中所有未引用的(因此未使用)/etc 叠加目录。
将通过以下参数根据 /etc/snapper/configs/root 中配置的规则删除设置了 number 清理算法的快照:
- NUMBER_MIN_AGE
定义可自动去除的快照的最短期限(以秒为单位)。
- NUMBER_LIMIT/NUMBER_LIMIT_IMPORTANT
定义存储的快照的最大计数。清理算法将删除超过指定最大值的快照,而不考虑快照和文件系统空间的状态如何。这些算法还会删除超过最小值的快照,直到达到快照和文件系统的限制。
systemd 也会定期执行快照清理。
5 注册产品 #
可以使用 transactional-update register 命令来处理与产品注册及其订阅管理相关的所有任务。您可以提供以下选项:
-
--list-extensions 该命令与此选项结合使用会列出适用于您的系统的扩展。您可以通过输出结果查找产品标识符以激活产品。
-
-p, --product 使用此选项可指定要激活的产品。产品标识符的格式如下: <名称>/<版本>/<体系结构>,例如,
sle-module-live-patching/15.3/x86_64。对应的命令采用以下格式:>sudotransactional-update register -p sle-module-live-patching/15.3/x86_64-
-r, --regcode 使用提供的注册代码注册系统。该命令会注册订阅并启用软件储存库。
-
-d, --de-register 该选项会取消注册系统,如果将其与
-p选项结合使用,则会取消注册扩展。-
-e, --email 指定用于在 SUSE Customer Center 中注册系统的电子邮件地址。
-
--url 指定注册服务器的 URL。URL 存储在配置中,并在后续命令调用中使用。例如:
>sudotransactional-update register --url https://scc.suse.com-
-s, --status 以 JSON 格式显示当前的注册状态。
-
--write-config 将提供的选项值写入
/etc/SUSEConnect配置文件。-
--cleanup 去除旧系统身份凭证。
-
--version 列显版本。
-
--help 显示命令的的用法。
6 管理软件包 #
可以使用 transactional-update 来安装、更新或去除软件包。
SLE Micro 从产品注册后提供的储存库中获取软件包。
transactional-update 使用以下命令来管理软件包。
pkg 命令和 Zypper 选项
对于 transactional-update pkg 命令,可以使用与所用子命令对应的任何 Zypper 选项。例如,zypper install 识别的所有选项也能由 transactional-update pkg install 识别。
-
pkg install 使用
zypper install命令从可用渠道安装单个软件包。此命令还可用于安装程序临时修复 (PTF) RPM 文件。此命令的默认选项为--interactive。>sudotransactional-update pkg install package_name或
>sudotransactional-update pkg install rpm1 rpm2或者,要安装软件集,请使用以下命令:
>sudotransactional-update pkg install -t pattern pattern_name-
pkg remove 使用
zypper remove命令从活动快照中去除单个软件包。此命令还可用于去除 PTF RPM 文件。此命令的默认选项为--interactive。>sudotransactional-update pkg remove package_name-
pkg update 使用
zypper update命令更新活动快照中的单个软件包。只能更新属于基础文件系统快照的软件包。此命令的默认选项为--interactive。>sudotransactional-update pkg update package_name-
patch 检查并安装可用的补丁。此命令的默认选项为
--non-interactive。-
dup 执行系统升级。此命令的默认选项为
--non-interactive。-
up 将安装的软件包更新为更高版本。此命令的默认选项为
--non-interactive。-
migration 该命令会将系统迁移到所选目标。如果系统已通过 SUSE Customer Center 注册,该命令通常用于升级系统。
7 执行系统回滚 #
GRUB 2 支持从 btrfs 快照引导,因此当新的快照无法正常工作时,您可以使用任何旧的功能快照。
引导快照时,快照中包含的文件系统部分会加载为只读状态;从快照中排除的所有其他文件系统和部分会加载为读写状态,并且可以修改。
在初始系统安装结束时会创建初始可引导快照。您随时可以通过引导此快照返回到该状态。该快照可通过 first root file system 说明识别。
可以用两种方法执行系统回滚。
在正在运行的系统中,可以设置默认快照,具体请参见过程 2 “从正在运行的系统回滚”。
尤其是在当前快照损坏的情况下,您可以引导进入新快照,并将其设置为默认快照。有关细节,请参见过程 3 “回滚到正常工作的快照”。
如果当前快照可以正常运行,则您可以使用以下过程进行系统回滚。
识别要设置为默认快照的快照并记下其编号。
>sudosnapper list将该快照设置为默认快照。
>sudotransactional-update rollback snapshot_number如果省略 snapshot number,则会将当前快照设置为默认快照。
提示:设置上次正常工作的快照要将上次正常工作的快照设置为默认快照,请运行
rollback last。重引导系统以引导进入新的默认快照。
如果当前快照损坏并且您无法引导进入其中,请使用以下过程。
重引导系统并选择
Start bootloader from a read-only snapshot。选择要引导的快照。快照根据创建日期排序,最新快照列在最前面。
登录到您的系统,并检查是否一切按预期进行。写入到从快照排除的目录中的数据将保持不变。
如果您引导进入的快照不适合回滚,请重引导系统并选择另一个快照。
如果快照按预期工作,您可以运行以下命令来执行回滚:
>sudotransactional-update rollback然后重引导。
8 管理自动事务更新 #
自动更新由每天运行一次的 systemd.timer 控制。此操作会应用所有更新,并告知 rebootmgrd 应重引导计算机。您可以调整更新运行时间,具体请参见 systemd.timer(5) 文档。
8.1 禁用自动更新 #
默认已启用自动更新。但是,您可以使用以下命令将其禁用:
>sudosystemctl --now disable transactional-update.timer
8.2 配置更新失败通知 #
当自动 transactional-update 失败时,将删除发生失败的快照。同时,系统可能会重引导,在这种情况下,您无法知道上次的自动更新已失败。为此,您可以配置 systemd 服务,以便在自动 transactional-update 失败时收到通知。配置该服务的过程概括如下:
安装系统中缺少的必需软件包。有关细节,请参见第 8.2.1 节 “安装必需的软件包”。
配置
systemd-status-mail服务。有关细节,请参见第 8.2.2 节 “配置systemd-status-mail服务”。
8.2.1 安装必需的软件包 #
必须安装 mailx 和 systemd-status-mail 软件包才能配置通知。默认情况下,系统中已安装这些软件包。但是,如果未安装这些软件包,可运行以下命令来安装:
>sudotransactional-update pkg in systemd-status-mail mailx
重新启动系统。
8.2.2 配置 systemd-status-mail 服务 #
要配置 systemd-status-mail 服务,可以创建配置文件,或使用 jeos-config 工具。
8.2.2.1 使用 jeos-config 配置服务 #
要配置电子邮件通知,可如下所述使用 jeos-config 工具。
要打开配置窗口,请运行以下命令:
>sudojeos-config status_mail在对话框中,根据需要配置项目。
单击进行确认。
8.2.2.2 通过编辑配置文件来配置服务 #
默认配置文件位于 /usr/etc/default/systemd-status-mail 中。要修改该文件,请在 /etc/default/ 中创建副本并编辑以下项目:
- ADDRESS
必填项。指定要将通知发送到的电子邮件地址。例如:
ADDRESS=“tux@example.com”
- FROM
通知邮件的发件人电子邮件地址。确保该地址有效。例如:
FROM=“geeko@example.com”
- MAILER
用于发送通知的邮件应用程序类型。如下所示使用
mailx值:MAILER=“mailx”
- RELAYHOST
指定 mailx 使用的邮件中继。
RELAYHOST=“mail.example.com:587”
- MAILX_OPTIONS
指定必要的选项,以确保邮件提供商接受通知邮件。
MAILX_OPTIONS="-Sverbose -Ssmtp-use-starttls -Ssmtp-auth=login -Ssmtp-auth-user='tux@example.com' -Ssmtp-auth-password='TopSecret'"
9 法律声明 #
版权所有 © 2006–2025 SUSE LLC 和贡献者。保留所有权利。
根据 GNU 自由文档许可证 (GNU Free Documentation License) 版本 1.2 或(根据您的选择)版本 1.3 中的条款,在此授予您复制、分发和/或修改本文档的权限;本版权声明和许可证附带不可变部分。许可版本 1.2 的副本包含在题为“GNU Free Documentation License”的部分。
有关 SUSE 商标,请参见 https://www.suse.com/company/legal/。所有其他第三方商标分别为相应所有者的财产。商标符号(®、™ 等)代表 SUSE 及其关联公司的商标。星号 (*) 代表第三方商标。
本指南力求涵盖所有细节,但这不能确保本指南准确无误。SUSE LLC 及其关联公司、作者和译者对于可能出现的错误或由此造成的后果皆不承担责任。