使用 transactional-update 管理 SUSE Linux Micro
- 内容
- 使用 - transactional-update命令可以修改只读文件系统。修改是在单独的快照中执行的,并且在您引导进入快照之前不会影响正在运行的系统。
- 原因
- 您想要管理 SUSE Linux Micro 及其更新,并最大程度地减少因更新失败而导致系统停机的风险,同时确保可轻松回滚。 
- 工作量
- 在 30 分钟内即可了解 - transactional-update命令。
- 目标
- 您将了解的 - transactional-update工作原理,以及如何使用它来管理系统。
- 要求
- 一个正在运行的 SUSE Linux Micro 实例 
- root特权
 
1 事务更新 #
1.1 什么是事务更新? #
      为了保持基础操作系统的稳定性和一致性,SUSE Linux Micro 使用只读的根文件系统。因此,您无法直接对根文件系统执行更改操作,例如使用 zypper 命令。但是,SUSE Linux 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 的某个快照中安装新软件包,然后再次运行该命令来安装另一个软件包:- >- 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。 
- 
reboot
- reboot的行为取决于对系统执行的配置和更改。启用- soft-reboot后,只有用户空间可以在无需重引导硬件和内核的情况下重启动。第 2.2 节 “- soft-reboot配置”中介绍了- soft-reboot的启用和配置步骤。
- 
run <command>
- 在新快照中运行提供的命令。 
- 
shell
- 退出前在新快照中打开读写外壳。该命令通常用于执行调试。 
- 
setup-fips
- 该命令会执行在系统上启用 FIPS 所需的所有更改。 
- 
setup-selinux
- 安装并启用指定的 SELinux 策略。 
2.2 soft-reboot 配置 #
2.2.1 启用/禁用 soft-reboot #
      要对 transactional-update 启用 soft-reboot,请执行下列步骤:
    
- 创建目录 - /etc/tukit.conf.d/- >- sudomkdir /etc/tukit.conf.d/
- 创建包含以下内容的文件 - /etc/tukit.conf.d/soft-reboot.conf:- REBOOT_ALLOW_SOFT_REBOOT=true - 例如,通过运行以下命令来创建: - >- sudoecho "REBOOT_ALLOW_SOFT_REBOOT=true" > /etc/tukit.conf.d/soft-reboot.conf
      要禁用 soft-reboot,请在 /etc/tukit.conf.d/soft-reboot.conf 文件中将 true 更改为 false。
    
2.2.2 soft-reboot 配置 #
  您可以在 /usr/etc/zypp/zypp-boot-plugin.conf 文件中定义哪些软件包需要特定类型的重引导。要进行更改,请将此文件复制到 /etc/zypp/zypp-boot-plugin.conf,后者是可写的,并且在更新期间不会被替换。/etc/zypp/zypp-boot-plugin.conf 文件的优先级也高于 /usr/etc/zypp/zypp-boot-plugin.conf,因此您的配置优先于默认配置。
  在 /etc/zypp/zypp-boot-plugin.conf 文件中的 [main] 部分下,有三个重引导选项:
- reboot
- 此处用于指定在更改时需要重引导硬件的软件包。 
- kexec
- 提供更改时需要重引导内核的软件包列表。不过,这些更改不会要求重引导硬件,也不会触发 GRUB2。 
- soft-reboot
- 指定更改时只需要重引导用户空间的软件包。 
条目可以是以逗号分隔的软件包名称列表,也可以是提供特定应用程序或系统组件的所有软件包的列表。也可以使用正则表达式。示例如下:
soft-reboot = glibc, dbus-broker
或者使用 provides 语句:
soft-reboot = provides: dbus
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 来安装、更新或去除软件包。
      
SUSE Linux Micro 从产品注册后提供的储存库中获取软件包。除了主储存库之外,SUSE Linux 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 “回滚到正常工作的快照”。 
如果当前快照可以正常运行,则您可以使用以下过程进行系统回滚。
- 识别要设置为默认快照的快照并记下其编号。 - >- sudosnapper list
- 将该快照设置为默认快照。 - >- sudotransactional-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 禁用自动更新 #
默认已启用自动更新。但是,您可以使用以下命令将其禁用:
>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 及其关联公司、作者和译者对于可能出现的错误或由此造成的后果皆不承担责任。