使用 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_command
transactional-update
如果运行 transactional-update
命令时未指定任何参数或选项,系统会更新自身。
下面进一步说明了可能的命令参数。
transactional-update
选项 #-
--interactive, -i
可以与软件包命令结合使用来开启交互模式。
-
--non-interactive, -n
可以与软件包命令结合使用来开启非交互模式。
-
--continue [number], -c
使用
--continue
选项可在不重引导的情况下对根文件系统进行多项更改。有关更多详细信息,请参见第 3 节 “在不重引导的情况下应用多项更改”。--continue
选项的另一个有用功能是,可让您选择任一现有快照作为新快照的基础。以下示例演示如何运行transactional-update
在基于快照 13 的某个快照中安装新软件包,然后再次运行该命令来安装另一个软件包:>
sudo
transactional-update pkg install package_1
>
sudo
transactional-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
)中串联这些命令即可,例如:
>
sudo
transactional-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
。对应的命令采用以下格式:>
sudo
transactional-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 存储在配置中,并在后续命令调用中使用。例如:
>
sudo
transactional-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
。>
sudo
transactional-update pkg install package_name
或
>
sudo
transactional-update pkg install rpm1 rpm2
或者,要安装软件集,请使用以下命令:
>
sudo
transactional-update pkg install -t pattern pattern_name
-
pkg remove
使用
zypper remove
命令从活动快照中去除单个软件包。此命令还可用于去除 PTF RPM 文件。此命令的默认选项为--interactive
。>
sudo
transactional-update pkg remove package_name
-
pkg update
使用
zypper update
命令更新活动快照中的单个软件包。只能更新属于基础文件系统快照的软件包。此命令的默认选项为--interactive
。>
sudo
transactional-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 “回滚到正常工作的快照”。
如果当前快照可以正常运行,则您可以使用以下过程进行系统回滚。
识别要设置为默认快照的快照并记下其编号。
>
sudo
snapper list将该快照设置为默认快照。
>
sudo
transactional-update rollback snapshot_number如果省略 snapshot number,则会将当前快照设置为默认快照。
提示:设置上次正常工作的快照要将上次正常工作的快照设置为默认快照,请运行
rollback last
。重引导系统以引导进入新的默认快照。
如果当前快照损坏并且您无法引导进入其中,请使用以下过程。
重引导系统并选择
Start bootloader from a read-only snapshot
。选择要引导的快照。快照根据创建日期排序,最新快照列在最前面。
登录到您的系统,并检查是否一切按预期进行。写入到从快照排除的目录中的数据将保持不变。
如果您引导进入的快照不适合回滚,请重引导系统并选择另一个快照。
如果快照按预期工作,您可以运行以下命令来执行回滚:
>
sudo
transactional-update rollback
然后重引导。
8 管理自动事务更新 #
自动更新由每天运行一次的 systemd.timer
控制。此操作会应用所有更新,并告知 rebootmgrd
应重引导计算机。您可以调整更新运行时间,具体请参见 systemd.timer(5) 文档。
8.1 禁用自动更新 #
默认已启用自动更新。但是,您可以使用以下命令将其禁用:
>
sudo
systemctl --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
软件包才能配置通知。默认情况下,系统中已安装这些软件包。但是,如果未安装这些软件包,可运行以下命令来安装:
>
sudo
transactional-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
工具。
要打开配置窗口,请运行以下命令:
>
sudo
jeos-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–2024 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 及其关联公司、作者和译者对于可能出现的错误或由此造成的后果皆不承担责任。