Provisioner 是一个面向开发者的单板计算机(SBC)配置助手,特别是基于U-Boot的平台。

它提供了一个独立的环境,用于:
操作模型有意保持简单:
一块开发板 => 一个Provisioner实例
Provisioner 运行在硬件附近,并通过一个安全的多路复用接口向开发者提供受控的远程访问。
该项目由两个主要元素组成:
| 组件 | 运行位置 | 角色 |
|---|---|---|
| Provisioner | 主机/实验室节点 | 控制平面、串行网关、配置服务 |
| goinit | 目标开发板 | 烧录代理与配置运行时 |
Provisioner 编排工作流;goinit 在开发板上本地执行它们。
Provisioner 桥接三个操作平面:
这允许从引导加载程序到运行时配置的持续控制。
拥有物理控制台连接,并提供:
串行仍然是最终的备用控制路径。
嵌入的服务提供启动工件:
TFTP
HTTP
Provisioner 暴露一个统一的 SSH 端点,同时充当访问层和控制层。
所有远程交互都通过单个 SSH 连接进行多路复用,并通过公钥认证进行管理。
多路复用通道包括:
访问治理:
因此 SSH 负载包括:
Provisioner I/O 模型的核心是路由器,它是一个可插拔的软件构件,负责在生产者和消费者之间代理终端流。
所有控制台流量都通过此组件流动,而不是直接在子系统之间流动。
路由器的客户端可以:
示例:
路由器区分两种客户端变体:
| 类型 | 特性 | 示例 |
|---|---|---|
| 人类 | 交互式,支持 ANSI | SSH 终端 |
| 机器 | 确定性,原始 I/O | 脚本,自动化 |
这允许针对可用性 vs 确定性进行定制的流处理。
单播
多播
多个工程师可以同时查看同一控制台而互不干扰。
一个专用的可插拔观察器用于减轻 ANSI 终端细微问题:
实现为插件而不是硬编码逻辑。
监控器 shell 提供交互式开发板控制。
> ?
? : this text
board_stat : report last goinit board stat; board must have printed PROVISIONER_MGMT_*
echo : echoes back the argument
enuser : enable user for tunnel
exec_assm : Load and executes the specified assm script
exec_scr : Load and executes the specified script
exec_state : returns the state of the specified script
exit : exit this shell
filter : Filter commands: type 'filter help' for more info
help : this text
log_serial : copies in a file ser.log all sent and received from the serial. Note: overwrites previous.
log_serial_stop : Requires serila log subsystem to stop.
send_serial : send file over serial: send_serial <file> <plain|gzip|xmodem_unix|xmodem_uboot> [dest_path]
send_serial_deps : check remote deps for send_serial plain/gzip: stty, dd, base64, gzip, rm (or busybox).
toff : command PDU using snmp to turn off the board
ton : command PDU using snmp to turn on the board
tterm : terminate serial tunnel connection
ulist : list user state for tunnel
>
filter help
available: enable, disable, default, show, add, remove, help
规则可以用 ASCII 或 HEX 定义:
filter add ascii Hello Hello World
filter add hex 48656c6c6f 48656c6c6f 576f726c64
过滤器可以:
这对于启动自动化和控制台规范化非常有用。
Provisioner 支持直接串行文件传输:
send_serial <file> <mode> [dest_path]
模式:
| 模式 | 方法 |
|---|---|
| plain | Base64 |
| gzip | Base64 + 压缩 |
| xmodem_unix | 通过 rx 的 XMODEM |
| xmodem_uboot |
依赖项检查通过:
send_serial_deps
所需工具:
传输引擎源自独立工具 send_console-ng,后经改编集成到 Provisioner 中。 它支持在以下情况下进行文件传输:
能力:
与原工具相比:
stdbuf 和 cat 依赖dd 以提高可移植性这使得 Provisioner 即使在开发板状态严重恶化的情况下也能运行。
类汇编的期望引擎:
最适合登录和启动流程。
执行与串行流绑定的外部程序。
模式:
| 模式 | 行为 |
|---|---|
| line | 行缓冲 |
| char | 字节流 |
存在轻量级的预约集成,但并非项目主要关注点。 仅用于:
Provisioner 的目标不是成为一个完整的实验室调度器。
Provisioner 使用 Go 编写,易于交叉编译。
make
GOARCH=arm64 make
不需要外部工具链。
可部署于:
通过 loadx 的 XMODEM |