设计注记
Barn 源码仓库曾经把重构指令、实现期 ADR 与真机证据和代码放在一起。它们在产品快速变化时 很有价值,但其中不少早期结论后来已经被推翻。本栏目只保留仍然成立的设计理由,并以当前 源码重新表述,而不是把过时计划原样发布。
建议从产品模型开始,再沿着边界向外阅读:
- 为什么 Barn 没有 Project:一份 Inventory、一个 Owner-scope Deployment,不制造第二份事实。
- 为什么每个节点都有两张网卡:实验室固定身份与管理出网分离。
- 声明式不等于破坏式:逐节点 Drift、显式重建与删除。
- PID 不是虚拟机身份:QMP 身份、进程证据、Journal 与有界恢复。
repo.yaml是意图,catalog.json是证据:生成元数据必须与 实际 qcow2 字节一致的静态镜像仓库。
当前行为以文档为准,带日期的验证边界见当前状态。 这些设计记录解释契约为何存在;它们不会把设计、构建或本地测试升级成发布证据。
本组文章保留原始写作日期,于 2026-09-26 对照源码校准,并于 2026-09-29 同步 Barn 0.9.0 更名。涉及未发布候选的 变化会单独标记;历史验证结果仍以原有日期和范围为准。
| repo.yaml 是意图,catalog.json 是证据 | 镜像供应链Catalog | |
| PID 不是虚拟机身份 | QMP恢复安全 | |
| 声明式不等于破坏式 | 生命周期Drift安全 | |
| 为什么每个 Barn 节点都有两张网卡 | 网络QEMUPigsty | |
| 为什么 Barn 没有 Project | 架构Inventory状态 |
repo.yaml 是意图,catalog.json 是证据
为什么 Barn 把人工维护的镜像策略与必须匹配实际 qcow2 工件的生成元数据分离。
PID 不是虚拟机身份
为什么 Barn 在发送信号或删除任何东西前,必须让 QMP 身份、进程证据、类型化 Invocation 与 Journal 相互吻合。
声明式不等于破坏式
Barn 如何用逐节点哈希与显式操作保证配置缺席永远不能授权删除。
为什么每个 Barn 节点都有两张网卡
为什么 Barn 把管理出网与宿主、节点、Ansible 和 Pigsty 使用的固定地址网络分离。
为什么 Barn 没有 Project
为什么 Barn 用一份 Pigsty Inventory 驱动一个 Owner-scope Deployment,取代按目录组织的 Project 状态。
-
repo.yaml 是意图,catalog.json 是证据
说明 2026-09-29 更名: Barn 0.9.0 尚未发布;本文名称已同步更新。2026-09-26 校准记录: 保留原始写作日期;下文已按当前实现更新。公开版本与未发布候选的 边界见当前状态,不以本文日期代替发布或验收日期。 静态镜像仓库看起来只是一些 qcow2 文件加一个 JSON 索引。真正困难的问题是:哪些事实允许 维护者手写,哪些事实必须从即将发布的字节中推导。 如果 Checksum 与 Size 放在手写源文件里,它们很容易被错误复制;如果策略只存在于生成 JSON 中 …
说明 2026-09-29 更名: Barn 0.9.0 尚未发布;本文名称已同步更新。2026-09-26 校准记录: 保留原始写作日期;下文已按当前实现更新。公开版本与未发布候选的 边界见当前状态,不以本文日期代替发布或验收日期。 静态镜像仓库看起来只是一些 qcow2 文件加一个 JSON 索引。真正困难的问题是:哪些事实允许 维护者手写,哪些事实必须从即将发布的字节中推导。 如果 Checksum 与 Size 放在手写源文件里,它们很容易被错误复制;如果策略只存在于生成 JSON 中 …
-
PID 不是虚拟机身份
说明 2026-09-29 更名: Barn 0.9.0 尚未发布;本文名称已同步更新。2026-09-26 校准记录: 保留原始写作日期;下文已按当前实现更新。公开版本与未发布候选的 边界见当前状态,不以本文日期代替发布或验收日期。 Pidfile 只能回答一个问题:写入文件时,某个进程使用了哪个整数。它不能证明进程仍然存活, 不能证明 PID 没有被复用,不能证明可执行文件就是 QEMU,也不能证明这个 QEMU 正是操作者 想停止的节点。 这些证据不足以授权 SIGKILL,更不足以授权 …
说明 2026-09-29 更名: Barn 0.9.0 尚未发布;本文名称已同步更新。2026-09-26 校准记录: 保留原始写作日期;下文已按当前实现更新。公开版本与未发布候选的 边界见当前状态,不以本文日期代替发布或验收日期。 Pidfile 只能回答一个问题:写入文件时,某个进程使用了哪个整数。它不能证明进程仍然存活, 不能证明 PID 没有被复用,不能证明可执行文件就是 QEMU,也不能证明这个 QEMU 正是操作者 想停止的节点。 这些证据不足以授权 SIGKILL,更不足以授权 …
-
声明式不等于破坏式
说明 2026-09-29 更名: Barn 0.9.0 尚未发布;本文名称已同步更新。2026-09-26 校准记录: 保留原始写作日期;下文已按当前实现更新。公开版本与未发布候选的 边界见当前状态,不以本文日期代替发布或验收日期。 “声明式”常被简化成“让现实等于文件”。在文件完整、分支正确时,这是一句好口号;但当配置 暂时不完整、检出了错误分支,或某个 YAML Group 被误删时,把“缺席”理解成“删除”就会让普通 编辑错误直接变成破坏操作。 Barn 采用一条更窄的规则: 期望状态 …
说明 2026-09-29 更名: Barn 0.9.0 尚未发布;本文名称已同步更新。2026-09-26 校准记录: 保留原始写作日期;下文已按当前实现更新。公开版本与未发布候选的 边界见当前状态,不以本文日期代替发布或验收日期。 “声明式”常被简化成“让现实等于文件”。在文件完整、分支正确时,这是一句好口号;但当配置 暂时不完整、检出了错误分支,或某个 YAML Group 被误删时,把“缺席”理解成“删除”就会让普通 编辑错误直接变成破坏操作。 Barn 采用一条更窄的规则: 期望状态 …
-
为什么每个 Barn 节点都有两张网卡
说明 2026-09-29 更名: Barn 0.9.0 尚未发布;本文名称已同步更新。2026-09-26 校准记录: 保留原始写作日期;下文已按当前实现更新。公开版本与未发布候选的 边界见当前状态,不以本文日期代替发布或验收日期。 Pigsty Inventory 用稳定地址标识机器。PostgreSQL 复制、etcd 成员、HAProxy 后端、VIP、 监控目标与 Ansible 都假设 10.10.10.11 始终代表同一个节点。回环端口转发可以把 SSH 或 PostgreSQL …
说明 2026-09-29 更名: Barn 0.9.0 尚未发布;本文名称已同步更新。2026-09-26 校准记录: 保留原始写作日期;下文已按当前实现更新。公开版本与未发布候选的 边界见当前状态,不以本文日期代替发布或验收日期。 Pigsty Inventory 用稳定地址标识机器。PostgreSQL 复制、etcd 成员、HAProxy 后端、VIP、 监控目标与 Ansible 都假设 10.10.10.11 始终代表同一个节点。回环端口转发可以把 SSH 或 PostgreSQL …
-
为什么 Barn 没有 Project
说明 2026-09-29 更名: Barn 0.9.0 尚未发布;本文名称已同步更新。2026-09-26 校准记录: 保留原始写作日期;下文已按当前实现更新。公开版本与未发布候选的 边界见当前状态,不以本文日期代替发布或验收日期。 Barn 最初采用了一套很熟悉的虚拟机管理器抽象:工作目录就是 Project,隐藏 Marker 提供 身份,注册表负责重新发现 Project,宿主全局 Lease 防止它们争用私有网络。这种模型可以承载 多套彼此独立的虚拟机,但它并不适合 Barn 最终要 …
说明 2026-09-29 更名: Barn 0.9.0 尚未发布;本文名称已同步更新。2026-09-26 校准记录: 保留原始写作日期;下文已按当前实现更新。公开版本与未发布候选的 边界见当前状态,不以本文日期代替发布或验收日期。 Barn 最初采用了一套很熟悉的虚拟机管理器抽象:工作目录就是 Project,隐藏 Marker 提供 身份,注册表负责重新发现 Project,宿主全局 Lease 防止它们争用私有网络。这种模型可以承载 多套彼此独立的虚拟机,但它并不适合 Barn 最终要 …