15.5. RHEL for Edge 镜像的回滚
因为 RHEL for Edge 对操作系统应用事务更新,所以您可以手动或自动将更新回滚到最后已知的良好状态,这可防止系统在更新过程中失败。您可以使用 greenboot
框架自动化验证和回滚过程。
greenboot
健康检查框架利用 rpm-ostree
来在系统启动时运行自定义健康检查。如果有问题,系统会回滚到最后一个工作状态。当您部署 rpm-ostree
更新时,它会运行脚本来检查关键服务在更新后是否仍然可以正常工作。如果系统无法正常工作,例如因为一些失败的软件包,则您可以将系统回滚到系统以前的稳定版本。此过程可确保您的 RHEL for Edge 设备处于可操作状态。
更新镜像后,它会创建一个新镜像部署,同时保留以前的镜像部署。您可以验证更新是否成功。如果更新失败,例如因为软件包失败,您可以将系统回滚到以前的稳定版本。
15.5.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 的系统上失败时,您不能使用回滚。
15.5.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 的子软件包中获取预配置的健康检查。这些检查位于
只读目录中。您还可以将 shell 脚本配置为以下类型的检查:
rpm-ostree
系统的 '/usr/lib/greenboot/check
例 15.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.d
和 wanted.d
目录中的脚本。如果 required.d
目录中的任何脚本失败,则 greenboot
会运行 red.d
目录中的任何脚本,然后重启系统。
Greenboot
在升级的系统上尝试进行 2 次引导。如果在第三次尝试引导时 required.d 中的脚本仍然失败,greenboot
会最后一次运行 red.d 脚本,以确保 red.d 目录中的脚本尝试进行正确的操作来修复问题,且没有成功。然后,greenboot
将系统从当前的 rpm-ostree
部署回滚到以前的稳定部署。
15.5.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"。
15.5.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 为 GREEN - Health Check SUCCESS
,请输入:$ cat /run/motd.d/boot-status
15.5.5. 手动回滚 RHEL for Edge 镜像
升级操作系统时,会创建一个新的部署,rpm-ostree
软件包也会保持以前的部署。如果操作系统更新版本中有问题,您可以使用单个 rpm-ostree
命令手动回滚到以前的部署,或者在 GRUB 引导装载程序中选择以前的部署。
要手动回滚到以前的版本,请执行以下步骤。
前提条件
- 您已更新了您的系统,但失败了。
流程
可选:检查失败的错误消息:
$ journalctl -u greenboot-healthcheck.service.
运行
rollback
命令:# rpm-ostree rollback
命令输出提供有关正在移动的提交 ID 的详细信息,并指示与正在删除的软件包的详细信息相关的已完成事务。
重启系统。
# systemctl reboot
命令将激活上一个带有稳定内容的提交。应用更改并恢复之前的版本。
15.5.6. 使用自动化流程回滚 RHEL for Edge 镜像
Greenboot
检查提供了一个集成到引导过程的框架,并在健康检查失败时触发 rpm-ostree
回滚。对于健康检查,您可以创建一个自定义脚本来指示健康检查是否通过或失败。根据结果,您可以决定何时触发回滚。以下流程演示了如何创建一个健康检查脚本的示例:
流程
创建返回标准退出代码
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
在
/etc/greenboot/check/required.d/
中包括健康检查的可执行文件。chmod +x check-dns.sh
在下次重启过程中,在系统进入
boot-complete.target
单元前,会作为引导过程的一部分来执行脚本。如果健康检查成功,则不执行任何操作。如果健康检查失败,则系统会重启多次,然后再将更新标记为失败,并回滚到之前的更新。
验证
要检查默认网关是否可访问,请运行以下健康检查脚本:
创建返回标准退出代码
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
在
/etc/greenboot/check/required.d/
目录中包括健康检查的可执行文件。chmod +x check-gw.sh