设备、Worker 与系统盘
Kurrent 把计算侧拆成三个独立实体。它们各自有标识与权威归属,通过绑定关系组合成一个可启动系统;机器、身份与磁盘因此可以分别替换。
| 实体 | 标识 | 权威位置 | 回答的问题 |
|---|---|---|---|
| 设备(Device) | MAC | 设备台账 state/devices.yml | 哪台物理机器 |
| Worker | worker_id(主机名) | Worker 台账 state/workers.yml | 以谁的身份运行 |
| 系统盘(System Disk) | NQN | 存储节点上的盘文件 + Worker 台账 | 启动哪一块系统 |
设备
设备代表一台物理机器。首次网络启动时,固件上报 11 项指纹(MAC、UUID、SMBIOS、CPU、内存、网卡等)与设备公钥;控制面以 MAC 为唯一键登记。
设备记录包含:
| 字段 | 含义 |
|---|---|
mac | 设备唯一标识;绑定关系的权威落点 |
uuid / fingerprint | 申报性质的硬件信息,用于识别与审计 |
state | pooled / bound / revoked |
bound_worker_id | 绑定的 Worker;未绑定为空 |
| 公钥哈希 | 设备身份公钥的摘要;验签强制开启时用于准入 |
source | ipxe(自动上报)或 manual(人工登记/导入) |
设备生命周期:
text
pooled ──绑定──► bound ──吊销──► revoked
▲ │
└────解绑─────────┘- 注册 ≠ 授权。入池只表示“这台机器来过”,不产生任何引导权限;只有绑定到 Worker 后,设备才成为该 Worker 的引导节点。
- 自动入池只在注册窗口开启且上报带有效公钥时发生;窗口关闭后,上报只更新指纹,不新增条目。人工登记与吊销清理不受窗口限制。
revoked设备不再接受上报;dnsmasq 绑定文件会写入MAC,ignore,被吊销设备拿不到租约。
Worker
Worker 是计算身份。worker_id 同时充当主机名,是台账与凭据的索引键;它不是机器身份,换机时保持不变。
Worker 记录包含:
| 字段 | 含义 |
|---|---|
worker_id | 计算身份,台账主键 |
| 绑定的设备 | 从设备台账投影,不在 Worker 侧单独存储 |
disks[] | 已挂载的系统盘 |
default_disk | 默认启动盘(os_tag) |
boot | 菜单项与超时覆盖(可选) |
state | registered(仅身份)或 ready(有系统盘) |
readiness 是由台账派生的只读投影:
| 值 | 条件 |
|---|---|
ready | 已绑定设备且有系统盘 |
partial | 只有绑定设备,或只有系统盘 |
idle | 两者都没有 |
系统盘
系统盘是存储节点上的一块盘文件,以 NQN 为数据面权威标识:
text
NQN = <nqnBase>:<worker_id>.<os>.<os_tag>
IQN = 由 NQN 派生(iSCSI 后端与安装器消费)
os_tag = 12 位随机 hex(盘级标识)
file = <worker_id>.<os>.<os_tag>.imgos与os_version是展示与分组元数据,os不设白名单。同一 Worker 的同一(os, os_version)至多一块盘;不同版本可并存。- 盘可以来自母盘克隆或空白盘。母盘不参与启动,只作为克隆源。
os_tag在创建时由控制面生成;盘 NQN 一旦写入启动变量,就成为该盘的唯一标识。
默认盘
默认盘决定菜单超时后启动哪一块系统:
- 第一块系统盘创建后自动成为默认盘;第二块及以后的盘不会自动改写默认盘。
- 删除默认盘时,若仍有剩余盘,控制面自动把其中一块提升为默认盘;没有剩余盘时清除
default_disk。 - 未设置默认盘时,
/boot-vars返回menu-default=reboot,避免静默进入错误的系统。
母盘
母盘是放在存储节点 spec.agent.diskDir 下、文件名包含 _tpl_ 标记的盘文件(大小写不敏感)。后台扫描缓存母盘清单与 GPT 布局:
- 母盘与系统盘都必须使用 4K 原生 GPT。512 字节扇区布局的盘会被 Agent 与 nvmet-host 同时拒绝,避免导出后固件无法识别分区。
- 文件系统需支持 reflink(btrfs / xfs),克隆才能接近秒级;ext4 会退化为全量复制。
- 母盘标签(
os/os_version/remark)登记在 Agent 台账,仅用于展示与建盘选择。
绑定
绑定关系是一对一的:一台设备只能属于一个 Worker,一个 Worker 只能有一台绑定设备。
- 权威在设备侧。
devices.yml的bound_worker_id是唯一事实;Worker 响应中的绑定设备只是投影。dnsmasq 主机名映射也是派生投影,更新可能滞后,不参与引导身份判定。 - 绑定即认证。
/boot-vars会校验请求 MAC 是否属于命中 Worker 的绑定设备,防止其他设备冒领身份。 - 换绑是原子操作。
force=true时先写入新绑定,再清除旧绑定;失败时恢复台账快照。 - 解绑只影响设备。设备回池,Worker 的系统盘、默认盘与凭据保留。
换绑即冷迁移
把设备 A 从 Worker 换绑到设备 B,就是一次冷迁移:
- 确认 B 已登记并具备设备身份公钥;目标 Worker 的凭据已在存储节点生效。
- 关闭或隔离 A(当前不提供活迁移与数据面 fencing)。
- 在 Devices 页对 B 执行换绑;系统盘与 Worker 身份不动。
- B 启动并通过挑战-应答后,取得同一系统盘的连接信息。
从 A 换回 B 的回退路径相同;当前没有自动化编排。
放置
创建系统盘时,位置由控制面决定(除非显式指定 disk_agent 或 pin):
- 候选必须是磁盘角色、启用(未排空)、有可达
base_url且数据面端口就绪的 Agent。 - 克隆母盘时,母盘必须已存在于该节点本地。
- 在候选中选择现有系统盘最少的节点(均摊)。
- 显式 pin 覆盖自动放置,但 pin 指向的节点仍须通过可用性校验。
批量建盘的 dry_run 与执行使用同一份放置实现,预览即执行计划。
删除语义
| 操作 | 结果 |
|---|---|
删除系统盘(delete_file=false) | 删除导出 target,保留盘文件;台账移除该盘 |
删除系统盘(delete_file=true) | 同时删除 backing 文件,不可恢复 |
| 删除默认盘 | 自动提升剩余盘为默认盘;无剩余盘时清除默认项 |
| 删除 Worker | 解绑设备、移除该 Worker 的凭据条目与推送台账;盘文件按选项处理 |
| 解绑设备 | 设备回池;Worker 与系统盘保持不变 |
| 吊销设备 | 设备进入 revoked,不再接受上报;清理入口只删除 revoked 条目 |
删除 Worker 后,同名 Worker 重新创建不会继承旧凭据:凭据条目已随删除清除。盘文件若被保留,可以重新挂载,但其 NQN 与台账记录需要重新建立。