ExecutionManager、Backend 与 Router
定义
Box 的执行部分可以收成三个抽象。
ExecutionManager(src/core/src/traits/execution.rs):产品状态机接口。create、start、inspect、pause、restart、read_logs、update_resources等方法描述应当发生什么,以及记录哪一代执行。LocalExecutionBackend(src/runtime/src/local_execution/backend.rs):真正与进程或虚拟机交互的后端。方法包括preflight、start、inspect、pause以及文件 / 进程观察。实现按BoxRecord::id管理宿主路径。LocalExecutionBackendRouter(router.rs):把一次创建映射到两个后端之一,并保证之后的所有调用使用记录里已经写下的路由。
OciMigrationPolicy
只有三种值:LegacyOnly、SandboxViaOci、AllViaOci。Linux
生产默认对新的 Sandbox 记录使用
SandboxViaOci。
问题背景
迁移期会同时存在「Box 自己的 libkrun 实现」和「OCI Runtime
实现」。若每次 stop
都重新读取环境变量以决定走哪边,则一次升级就能把旧实例解释成另一种隔离。路由器把「策略」限制在创建瞬间,把「事实」写进记录。这是
fail-closed 在架构上的落点。
机制说明
路由规则
LegacyOnly → 无论隔离,都走 BoxVm |
ManagedRuntimeRoute 的取值是
Unspecified、BoxVm、OciSdk(box_record.rs)。新记录必须盖上确切戳记;Unspecified
只用于兼容旧记录,推断时仍使用当时留下的端点证据,而不是当前策略。
一次 create 的顺序
- 构造
BoxRecord(镜像、资源、隔离、重启与健康策略); route_for_create按策略选择路由并写入记录;preflight_isolation/preflight做能力检查;plan_create_resources派生卷与网络等身份,但不物化;- 与成功预留一并持久化;
start只调用已选后端。
之后的 inspect、exec、恢复与删除都通过
backend_for_record。注释写明:路由器在错误之后绝不尝试另一个后端。
谁实现这两个后端
vm_backend.rs:Box 拥有的 MicroVM / 既有沙箱实现;oci_backend.rs:通过a3s-oci-sdk调用的外部所有者。
测试可以注入自定义后端。生产路径必须返回确切路由,以免策略变更改写已声明的代际。
在 Box 中的位置
- trait:
src/core/src/traits/execution.rs。 - 实现:
src/runtime/src/local_execution/api.rs(LocalExecutionManager)、backend.rs、router.rs、oci_migration.rs。 - 记录:
src/runtime/src/box_record.rs。 - 行为规格:
router_tests.rs、vm_backend_tests.rs、oci_backend_tests.rs。
验证命令
无单独 CLI。阅读 router.rs 中
OciMigrationPolicy::route 的 match
即可核对上表。若要观察默认策略,在未设置
A3S_BOX_OCI_MIGRATION 的 Linux 主机上创建 Sandbox 记录,再
inspect 其持久化路由字段。
相关与易混
- 相关:一条 run 命令的调用链、代际与 fail-closed、Sandbox(共享内核)
- 易混:Router 不是网络路由器。它选择执行实现,不分配
IP。
ExecutionManager也不是 Kubernetes 控制器:它管理本机记录,不跨主机调度。