ExecutionManager、Backend 与 Router

定义

Box 的执行部分可以收成三个抽象。

  1. ExecutionManagersrc/core/src/traits/execution.rs):产品状态机接口。createstartinspectpauserestartread_logsupdate_resources 等方法描述应当发生什么,以及记录哪一代执行。
  2. LocalExecutionBackendsrc/runtime/src/local_execution/backend.rs):真正与进程或虚拟机交互的后端。方法包括 preflightstartinspectpause 以及文件 / 进程观察。实现按 BoxRecord::id 管理宿主路径。
  3. LocalExecutionBackendRouterrouter.rs):把一次创建映射到两个后端之一,并保证之后的所有调用使用记录里已经写下的路由。

OciMigrationPolicy 只有三种值:LegacyOnlySandboxViaOciAllViaOci。Linux 生产默认对新的 Sandbox 记录使用 SandboxViaOci

问题背景

迁移期会同时存在「Box 自己的 libkrun 实现」和「OCI Runtime 实现」。若每次 stop 都重新读取环境变量以决定走哪边,则一次升级就能把旧实例解释成另一种隔离。路由器把「策略」限制在创建瞬间,把「事实」写进记录。这是 fail-closed 在架构上的落点。

机制说明

路由规则

LegacyOnly          → 无论隔离,都走 BoxVm
SandboxViaOci → MicroVM 走 BoxVm,Sandbox 走 OciSdk
AllViaOci → 无论隔离,都走 OciSdk

ManagedRuntimeRoute 的取值是 UnspecifiedBoxVmOciSdkbox_record.rs)。新记录必须盖上确切戳记;Unspecified 只用于兼容旧记录,推断时仍使用当时留下的端点证据,而不是当前策略。

一次 create 的顺序

  1. 构造 BoxRecord(镜像、资源、隔离、重启与健康策略);
  2. route_for_create 按策略选择路由并写入记录;
  3. preflight_isolation / preflight 做能力检查;
  4. plan_create_resources 派生卷与网络等身份,但不物化;
  5. 与成功预留一并持久化;
  6. start 只调用已选后端。

之后的 inspectexec、恢复与删除都通过 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.rsLocalExecutionManager)、backend.rsrouter.rsoci_migration.rs
  • 记录:src/runtime/src/box_record.rs
  • 行为规格:router_tests.rsvm_backend_tests.rsoci_backend_tests.rs

验证命令

无单独 CLI。阅读 router.rsOciMigrationPolicy::route 的 match 即可核对上表。若要观察默认策略,在未设置 A3S_BOX_OCI_MIGRATION 的 Linux 主机上创建 Sandbox 记录,再 inspect 其持久化路由字段。

相关与易混