概况
Fedora 中提供了 greenboot 服务,这是一款基于 rpm-ostree 的系统上 systemd 的通用运行状况检查框架。
Greenboot 由两部分组成:
- greenboot :检查提供的脚本,如果这些检查未通过则重新启动,如果重新启动未能解决问题则回滚到之前的部署。
- greenboot-default-health-checks ,由 Greenboot 维护者提供的一系列可选和策划的健康检查。
安装
为了在 Fedora Silverblue、Fedora IoT 或 Fedora CoreOS 上获得完整的 Greenboot ,请使用如下命令安装
1 | rpm-ostree install greenboot greenboot-default-health-checks |
名词介绍
- MOTD:指/run/motd.d/boot-status,存放 greenboot 运行阶段的一些日志信息。
脚本目录
目录结构
1 | /etc |
- /etc/greenboot/check/required.d:此目录中的运行状态检查脚本不得失败。如果此文件夹中的任何脚本退出时出现错误代码,则启动将被声明为失败。错误消息将出现在 MOTD 和 journalctl -u greenboot-healthcheck.service 中。
- /etc/greenboot/check/wanted.d:此目录中的运行状态检查脚本可能失败,。此文件夹中的脚本可以退出并显示错误代码,并且启动不会被声明为失败。错误消息将出现在 MOTD 和 journalctl -u greenboot-healthcheck.service -b 中。
- /etc/greenboot/green.d:此目录中的交叉脚本将在启动成功(绿色)后运行。
- /etc/greenboot/red.d:此目录中的交叉脚本将在启动失败(红色)后运行。
除非您的发行版中默认启用 greenboot,否则请通过运行 systemctl enable greenboot-task-runner greenboot-healthcheck greenboot-status greenboot-loading-message greenboot-grub2-set-counter greenboot-grub2-set-success greenboot-rpm-ostree-grub2-check-fallback redboot-auto-reboot redboot-task-runner
来启用它。它将在下次启动过程中自动启动并运行检查。
之后当您 ssh 进入计算机时,将显示启动状态消息:Boot Status is GREEN - Health Check SUCCESS
Boot Status is RED - Health Check FAILURE!
greenboot-default-health-checks
这些运行状况检查可在 rpm-ostree 系统中的只读目录 /usr/lib/greenboot/check 中找到。
- 检查存储库 URL 是否仍可通过 DNS 解析:此脚本位于 /usr/lib/greenboot/check/required.d/01_repository_dns_check.sh 下,并确保对存储库 URL 的 DNS 查询仍然可用。
- 检查更新平台是否仍然可访问:此脚本位于 /usr/lib/greenboot/check/wanted.d/01_update_platform_check.sh 下,并尝试连接并从 /etc/ostree/remotes.d 中定义的更新平台获取 2XX 或 3XX HTTP 代码。
- 检查当前启动是否由硬件看门狗触发:此脚本位于 /usr/lib/greenboot/check/required.d/02_watchdog.sh 下,用于检查当前启动是否由看门狗触发。如果是,但在一定的宽限期(默认为 24 小时,可通过 /etc/greenboot/greenboot.conf 中的 GREENBOOT_WATCHDOG_GRACE_PERIOD=number_of_hours 配置)后重新启动,Greenboot 不会将当前启动标记为红色,并且不会回滚到之前的部署。如果在宽限期内发生,此时当前启动将被标记为红色,但 Greenboot 不会回滚到之前的部署。默认情况下启用,但可以通过将 /etc/greenboot/greenboot.conf 中的 GREENBOOT_WATCHDOG_CHECK_ENABLED 修改为 false 来禁用它。
使用 systemd 服务进行健康检查
总体启动成功是根据 boot-complete.target 来衡量的。
Required Checks
创建一个不能失败的一次性健康检查服务单元,例如 /etc/systemd/system/required-check.service 。确保它在失败时调用 redboot.target ( OnFailure=redboot.target )。运行 systemctl enable required-check
来启用它。
1 | [Unit] |
Wanted Checks
创建一个可能会失败的一次性健康检查服务单元,例如 /etc/systemd/system/wanted-check.service 。运行 systemctl enable wanted-check
来启用它。
1 | [Unit] |
配置
目前,可以通过环境变量自定义以下参数。这些环境变量也可以在配置文件 /etc/greenboot/greenboot.conf 中描述:
- GREENBOOT_MAX_BOOT_ATTEMPTS:在声明部署有问题并回滚到上一个部署之前尝试启动的最大次数,默认为3。
- GREENBOOT_WATCHDOG_CHECK_ENABLED:启用/禁用检查当前启动是否已由硬件看门狗健康检查触发。有关健康检查的更多信息包含在子包 greenboot-default-health-checks 部分中。
- GREENBOOT_WATCHDOG_GRACE_PERIOD:升级后我们认为新部署导致重新启动的小时数。
流程
- greenboot-rpm-ostree-grub2-check-fallback.service 在 greenboot-healthcheck.service 之前运行,并检查 GRUB2 环境变量 boot_counter 是否为 -1。
- 如果为 -1,则意味着系统处于回退部署中,并将执行
rpm-ostree rollback
返回到之前的工作部署。 - 如果 boot_counter 不为-1,则此步骤不执行任何操作。
- 如果为 -1,则意味着系统处于回退部署中,并将执行
- greenboot-healthcheck.service 在 systemd 的 boot-complete.target 之前运行。它启动 /usr/libexec/greenboot/greenboot check ,它运行 required.d 和 wanted.d 脚本。
- 如果 required.d 文件夹中的任何脚本失败,则调用 redboot.target 。
- 它触发 redboot-task-runner.service ,从而启动 /usr/libexec/greenboot/greenboot red 。这将运行 red.d 文件夹中的脚本。
- 经过上述操作后:
- greenboot-status.service 运行,创建 MOTD 指定哪些脚本失败。
- redboot-auto-reboot.service 已运行。它执行一系列检查以确定是否需要手动干预。如果没有,它将重新启动系统。
- 如果 required.d 文件夹中的所有脚本都成功:
- 已达到 boot-complete.target
- greenboot-grub2-set-success.service 已运行。它取消设置 boot_counter GRUB 环境变量并将 boot_success GRUB 环境变量设置为 1。
- greenboot-task-runner.service 启动
/usr/libexec/greenboot/greenboot green
,它运行 green.d 文件夹中的脚本,这些脚本将在成功更新后运行。 - greenboot-status.service 运行,创建 MOTD 并显示成功消息。
- 如果 required.d 文件夹中的任何脚本失败,则调用 redboot.target 。
Services 一览
服务 | 作用 | 其他 |
---|---|---|
greenboot-grub2-set-counter.service | greenboot-grub2-set-counter: grub2-editenv - set boot_counter=”$max_boot_attempts” grub2-editenv - set boot_success=0 通过命令参数或配置文件中获取最大重启次数,未指定则默认为3次 |
配置文件: /etc/greenboot/greenboot.conf 配置项: GREENBOOT_MAX_BOOT_ATTEMPTS 配置文件中允许通过DISABLED_HEALTHCHECKS禁用某些检查项 |
greenboot-grub2-set-success.service | grub2-editenv - set boot_success=1 grub2-editenv - unset boot_counter |
After=boot-complete.target 在系统启动完成后运行 |
greenboot-healthcheck.service | /usr/libexec/greenboot/greenboot check 执行/usr/lib/greenboot/check和/etc/greenboot/check目录中required.d和wanted.d的检查脚本,如果required.d中的脚本运行失败,将导致greenboot进程退出值为1(异常退出)。 |
wanted.d中脚本失败无影响OnFailure=redboot.target 失败后到达redboot.target,从而启动redboot-task-runner.service |
greenboot-loading-message.service | /usr/libexec/greenboot/greenboot-loading-message 只是向/run/motd.d/boot-status中输出一些信息 |
- |
greenboot-rpm-ostree-grub2-check-fallback.service | /usr/libexec/greenboot/greenboot-rpm-ostree-grub2-check-fallback | rpm-ostree rollback 修改grub引导,第一项变为上一版本 |
greenboot-status.service | /usr/libexec/greenboot/greenboot-status 综合其他的日志信息,统一导入到/run/motd.d/boot-status |
服务包括: greenboot-healthcheck.service greenboot-task-runner.service redboot-task-runner.service redboot-auto-reboot.service greenboot-rpm-ostree-grub2-check-fallback.service |
greenboot-task-runner.service | /usr/libexec/greenboot/greenboot green 执行/usr/lib/greenboot/green.d和/etc/greenboot/green.d中的脚本 |
After=boot-complete.target在系统启动完成后运行 |
redboot-auto-reboot.service | /usr/libexec/greenboot/redboot-auto-reboot 检查是否需要重启 |
根据grub2-editenv list中的信息以及/boot/loader/entries/中文件数量决定当前是否重启 |
redboot-task-runner.service | /usr/libexec/greenboot/greenboot red 执行/usr/lib/greenboot/red.d和/etc/greenboot/red.d中的脚本 |
RequiredBy=redboot.target 此服务在系统启动失败后运行 |
redboot.target | - | - |
grub2-editenv
在设置 GRUB 环境的时候,用到了 grub2-editenv 命令,由 grub2-tools-minimal 提供。
查阅其 源码 可以得知,这里只是把 set 的内容写入 /boot/grub2/grubenv 文件中进行保存。