Greenboot服务介绍
ssk-wh Lv4

概况

Fedora 中提供了 greenboot 服务,这是一款基于 rpm-ostree 的系统上 systemd 的通用运行状况检查框架。

Greenboot 由两部分组成:

  • greenboot :检查提供的脚本,如果这些检查未通过则重新启动,如果重新启动未能解决问题则回滚到之前的部署。
  • greenboot-default-health-checks ,由 Greenboot 维护者提供的一系列可选和策划的健康检查。

安装

为了在 Fedora Silverblue、Fedora IoT 或 Fedora CoreOS 上获得完整的 Greenboot ,请使用如下命令安装

1
2
rpm-ostree install greenboot greenboot-default-health-checks
systemctl reboot

名词介绍

  • MOTD:指/run/motd.d/boot-status,存放 greenboot 运行阶段的一些日志信息。

脚本目录

目录结构

1
2
3
4
5
6
7
/etc
└── greenboot
├── check
│ ├── required.d
│ └── wanted.d
├── green.d
└── red.d
  • /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
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Custom Required Health Check
Before=boot-complete.target
OnFailure=redboot.target
OnFailureJobMode=fail

[Service]
Type=oneshot
ExecStart=/usr/libexec/mytestsuite/required-check

[Install]
RequiredBy=boot-complete.target
WantedBy=multi-user.target

Wanted Checks

创建一个可能会失败的一次性健康检查服务单元,例如 /etc/systemd/system/wanted-check.service 。运行 systemctl enable wanted-check 来启用它。

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=Custom Wanted Health Check
Before=boot-complete.target

[Service]
Type=oneshot
ExecStart=/usr/libexec/mytestsuite/wanted-check

[Install]
WantedBy=boot-complete.target
WantedBy=multi-user.target

配置

目前,可以通过环境变量自定义以下参数。这些环境变量也可以在配置文件 /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,则此步骤不执行任何操作。
  • 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 并显示成功消息。

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 文件中进行保存。

 Comments
Comment plugin failed to load
Loading comment plugin