10.4. RHEL for Edge 镜像的回滚

因为 RHEL for Edge 对操作系统应用事务更新,您可以手动或自动将更新回滚到最后已知的良好状态,这可防止系统在更新过程中失败。您可以使用 greenboot 框架自动化验证和回滚过程。

greenboot 健康检查框架利用 rpm-ostree 来在系统启动时运行自定义健康检查。如果出现问题,系统会回滚到最后一个工作状态。当您部署一个 rpm-ostree 更新时,它会运行脚本来检查关键服务在更新后是否仍然可以工作。如果系统无法正常工作,例如因为一些失败的软件包,则您可以将系统回滚到系统之前的稳定版本。此过程可确保您的 RHEL for Edge 设备处于可操作状态。

更新镜像后,它会创建一个新镜像部署,同时保留之前的镜像部署。您可以验证更新是否成功。如果更新失败,例如因为软件包失败,您可以将系统回滚到之前的稳定版本。

10.4.1. 介绍 greenboot 检查

Greenboot 是基于 rpm-ostree 的系统上提供的一个 systemd 的通用健康检查框架。它包含您可以在系统上安装的以下 RPM 软件包:

  • greenboot - 包含以下功能的软件包:

    • 检查提供的脚本
    • 如果检查失败,则重启系统
    • 回滚到之前的部署,重启无法解决这个问题。
  • greenboot-default-health-checks - 由 greenboot 系统维护者提供的一组可选和选定的健康检查。

Greenboot 在 RHEL for Edge 系统中工作,方法是使用系统上运行的健康检查脚本来评估系统健康状况,并在某些软件失败时自动回滚到最后一个健康状态。这些健康检查脚本位于 /etc/greenboot/check/required.d 目录中。Greenboot 支持用于健康检查的 shell 脚本。当您需要检查软件问题并在直接可服务性有限或不存在的边缘设备上执行系统回滚时,具有健康检查框架特别有用。当您安装和配置健康检查脚本时,它会触发健康检查,来在每次系统启动时运行。

您可以创建自己的健康检查脚本,来评估工作负载和应用程序的健康状态。这些额外的健康检查脚本是软件问题检查和自动系统回滚的有用组件。

注意

在不使用 OSTree 的系统上的任何健康检查失败时,您无法使用回滚。

10.4.2. RHEL for Edge 镜像使用 greenboot 回滚

对于 RHEL for Edge 镜像,仅将事务更新应用到操作系统。事务更新是原子的,这意味着只有所有更新都成功时才会应用更新,并且支持回滚。通过事务更新,您可以轻松地将失败的更新回滚到最后已知的良好状态,从而防止更新期间系统失败。

当您需要检查软件问题并在直接服务性有限或不存在的边缘设备上执行系统回滚时,执行健康检查特别有用。

注意

在不使用 OSTree 的系统上更新失败时,您无法使用回滚,即使健康检查可以运行。

您可以将智能回滚与 greenboot 健康检查框架一起使用,以便在系统每次启动时自动评估系统健康状况。您可以从 greenboot-default-health-checks 子软件包中获取预配置的健康状况。这些检查位于 rpm-ostree 系统的 /usr/lib/greenboot/check 只读目录中。

Greenboot 利用 rpm-ostree,并在系统启动时运行自定义健康检查。如果出现问题,系统会回滚更改,并保留最后的工作状态。当您部署 rpm-ostree 更新时,它会运行脚本来检查关键服务在更新后是否仍然可以工作。如果系统无法正常工作,更新会回滚到系统的最后已知的工作版本。此过程可确保您的 RHEL for Edge 设备处于可操作状态。

您可以从 greenboot-default-health-checks 的子软件包中获取预配置的健康状况。这些检查位于 rpm-ostree 系统的 '/usr/lib/greenboot/check 只读目录中。您还可以将 shell 脚本配置为以下类型的检查:

例 10.1. greenboot 目录结构

etc
└─ greenboot
   ├─ check
   |   └─ required.d
   |   └─ init.py
   └─ green.d
   └─ red.d
必填
包含不能失败的健康检查。将所需的 shell 脚本放在 /etc/greenboot/check/required.d 目录中。如果脚本失败,greenboot 默认会重试三次。您可以通过将 GREENBOOT_MAX_BOOTS 参数设置为您想要的重试次数,来在 /etc/greenboot/greenboot.conf 文件中配置重试次数。

当所有重试失败后,greenboot 会自动启动回滚(如果存在一个回滚)。如果没有回滚,系统日志输出会显示您需要执行一个人工干预。

期望
包含可能失败的健康检查,而不会导致系统回滚。将所需的 shell 脚本放在 /etc/greenboot/check/wanted.d 目录中。Greenboot 告知脚本失败,系统健康状态保持不变,且不会执行回滚或重启。

您还可以指定在检查后要运行的 shell 脚本:

绿色
包含在成功引导后要运行的脚本。将这些脚本放在 /etc/greenboot/green.d'directory 中。Greenboot 告知引导成功。
红色
包含在引导失败后要运行的脚本。将这些脚本放在 /etc/greenboot/red.d 目录中。系统会尝试引导三次,并在失败时执行脚本。greenboot 告知引导失败。

下图演示了 RHEL for Edge 镜像回滚过程。

镜像恢复过程

引导更新的操作系统后,greenboot 会运行 required.dwanted.d 目录中的脚本。如果 required.d 目录中的任何脚本失败,greenboot 会运行 red.d 目录中的任何脚本,然后重启系统。

Greenboot 进行 2 次尝试,以在升级的系统上引导。如果在第三次引导中,尝试 required.d 中的脚本仍然失败,greenboot 会最后一次运行 red.d 脚本,来确保尝试 red.d 目录中的脚本,以进行正确操作来修复问题,且这不成功。然后,greenboot 将系统从当前的 rpm-ostree 部署回滚到之前的稳定部署。

10.4.3. Greenboot 健康检查状态

在部署更新的系统时,请等待 greenboot 健康检查完成,然后再进行更改,以确保如果 greenboot 将系统回滚到较早的状态,这些更改不会丢失。如果要进行配置更改或部署应用程序,您必须等待 greenboot 健康检查完成。这可确保,如果 greenboot 将 rpm-ostree 系统回滚回较早的状态,您的更改不会丢失。

greenboot-healthcheck 服务运行一次,然后退出。您可以使用以下命令检查服务的状态,以了解它是否已完成,并了解结果:

systemctl is-active greenboot-healthcheck.service
此命令会在服务退出时报告 active。如果该服务没有运行,则会显示 inactive
systemctl show --property=SubState --value greenboot-healthcheck.service
完成时报告 exited,还在运行时报告 running
systemctl show --property=Result --value greenboot-healthcheck.service
在检查通过时报告 success
systemctl show --property=ExecMainStatus --value greenboot-healthcheck.service
报告服务的数字退出码,0 表示成功,非零值表示发生失败。
cat /run/motd.d/boot-status
显示一条消息,如 "Boot Status is GREEN - Health Check SUCCESS"。

10.4.4. 检查 greenboot 健康检查状态

在对系统进行更改或故障排除期间,检查 greenboot 健康检查的状态。您可以使用以下任一命令来帮助确保 greenboot 脚本已完成运行。

  • 使用以下选项之一来检查状态:

    • 要查看健康检查状态的报告,请输入:

      $ systemctl show --property=SubState --value greenboot-healthcheck.service

      以下输出是可能的:

      • start 表示 greenboot 检查仍在运行。
      • exited 表示检查已通过,且 greenboot 已退出。当系统处于健康状态时,greenboot 在 green.d 目录中运行脚本。
      • failed 表示检查没有通过。greenboot 在系统处于此状态时在 red.d 目录中运行脚本,并可能重启系统。
    • 要查看显示服务的数字退出码的报告,其中 0 表示成功,非零值表示发生失败,请使用以下命令:

      $ systemctl show --property=ExecMainStatus --value greenboot-healthcheck.service
    • 要查看显示引导状态的消息的报告,如 Boot Status is GREEN - Health Check SUCCESS,请输入:

      $ cat /run/motd.d/boot-status

10.4.5. 手动回滚 RHEL for Edge 镜像

升级操作系统时,会创建一个新的部署,rpm-ostree 软件包也会保留以前的部署。如果操作系统更新版本中出现问题,您可以使用单个 rpm-ostree 命令手动回滚到之前的部署,或者在 GRUB 引导装载程序中选择之前的部署。

要手动回滚到之前的版本,请执行以下步骤。

前提条件

  1. 您已更新了您的系统,并且失败了。

流程

  1. 可选:检查失败错误消息:

    $ journalctl -u greenboot-healthcheck.service.
  2. 运行 rollback 命令:

    # rpm-ostree rollback

    命令输出提供有关正在移动的提交 ID 的详细信息,并指示与正在删除的软件包的详细信息相关的已完成事务。

  3. 重启系统。

    # systemctl reboot

    命令将激活上一个带有稳定内容的提交。应用更改并恢复之前的版本。

10.4.6. 使用自动化流程回滚 RHEL for Edge 镜像

Greenboot 检查提供了一个框架,它集成到引导过程中,并可在健康检查失败时触发 rpm-ostree 回滚。对于健康检查,您可以创建一个自定义脚本来指示健康检查是否通过或失败。根据结果,您可以决定何时触发回滚。以下流程演示了如何创建一个健康检查脚本的示例:

流程

  1. 创建返回标准退出代码 0 的脚本。

    例如,以下脚本确保配置的 DNS 服务器可用:

    #!/bin/bash
    
    DNS_SERVER=$(grep ^nameserver /etc/resolv.conf | head -n 1 | cut -f2 -d" ")
    COUNT=0
    # check DNS server is available
    ping -c1 $DNS_SERVER
    while [ $? != '0' ] && [ $COUNT -lt 10 ]; do
    ((COUNT++))
    echo "Checking for DNS: Attempt $COUNT ."
    sleep 10
    ping -c 1 $DNS_SERVER
    done
  2. /etc/greenboot/check/required.d/ 中包括健康检查的可执行文件。

    chmod +x check-dns.sh

    在下次重启过程中,在系统进入到 boot-complete.target 单元前,会作为引导过程的一部分执行该脚本。如果健康检查成功,则不执行任何操作。如果健康检查失败,则系统会多次重启,然后将更新标记为失败,并回滚到上一个更新。

验证步骤

要检查默认网关是否可访问,请运行以下健康检查脚本:

  1. 创建返回标准退出代码 0 的脚本。

    #!/bin/bash
    
    DEF_GW=$(ip r | awk '/^default/ {print $3}')
    SCRIPT=$(basename $0)
    
    count=10
    connected=0
    ping_timeout=5
    interval=5
    
    while [ $count -gt 0 -a $connected -eq 0 ]; do
      echo "$SCRIPT: Pinging default gateway $DEF_GW"
      ping -c 1 -q -W $ping_timeout $DEF_GW > /dev/null 2>&1 && connected=1 || sleep $interval
      ((--count))
    done
    
    if [ $connected -eq 1 ]; then
      echo "$SCRIPT: Default gateway $DEF_GW is reachable."
      exit 0
    else
      echo "$SCRIPT: Failed to ping default gateway $DEF_GW!" 1>&2
      exit 1
    fi
  2. /etc/greenboot/check/required.d/ 目录中包括健康检查的可执行文件。

    chmod +x check-gw.sh