跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / 使用 transactional-update 命令管理 SLE Micro

使用 transactional-update 命令管理 SLE Micro

出版日期:2024-12-12
解释

使用 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︰ 修改根文件系统
  1. 基于当前的根文件系统或您指定的快照创建新的读写快照。

  2. 应用所有更改(执行更新、修补操作或安装软件包)。

  3. 将快照切换回只读模式。

  4. 如果所有更改都成功应用,则将新的根文件系统快照设为默认快照。

  5. 重引导之后,系统引导进入新的快照。

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-snapshotscleanup-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︰ 从正在运行的系统回滚
  1. 识别要设置为默认快照的快照并记下其编号。

    > sudo snapper list
  2. 将该快照设置为默认快照。

    > sudo transactional-update rollback snapshot_number

    如果省略 snapshot number,则会将当前快照设置为默认快照。

    提示
    提示:设置上次正常工作的快照

    要将上次正常工作的快照设置为默认快照,请运行 rollback last

  3. 重引导系统以引导进入新的默认快照。

如果当前快照损坏并且您无法引导进入其中,请使用以下过程。

过程 3︰ 回滚到正常工作的快照
  1. 重引导系统并选择Start bootloader from a read-only snapshot

  2. 选择要引导的快照。快照根据创建日期排序,最新快照列在最前面。

  3. 登录到您的系统,并检查是否一切按预期进行。写入到从快照排除的目录中的数据将保持不变。

  4. 如果您引导进入的快照不适合回滚,请重引导系统并选择另一个快照。

    如果快照按预期工作,您可以运行以下命令来执行回滚:

    > 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 安装必需的软件包

必须安装 mailxsystemd-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 工具。

  1. 要打开配置窗口,请运行以下命令:

    > sudo jeos-config status_mail
  2. 在对话框中,根据需要配置项目。

  3. 单击确定进行确认。

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'"