跳转到主要内容

设计注记

Barn 源码仓库曾经把重构指令、实现期 ADR 与真机证据和代码放在一起。它们在产品快速变化时 很有价值,但其中不少早期结论后来已经被推翻。本栏目只保留仍然成立的设计理由,并以当前 源码重新表述,而不是把过时计划原样发布。

建议从产品模型开始,再沿着边界向外阅读:

  1. 为什么 Barn 没有 Project:一份 Inventory、一个 Owner-scope Deployment,不制造第二份事实。
  2. 为什么每个节点都有两张网卡:实验室固定身份与管理出网分离。
  3. 声明式不等于破坏式:逐节点 Drift、显式重建与删除。
  4. PID 不是虚拟机身份:QMP 身份、进程证据、Journal 与有界恢复。
  5. 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 是证据

    发布于 设计

    设计镜像供应链Catalog

    说明 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 不是虚拟机身份

    发布于 设计

    设计QMP恢复安全

    说明 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,更不足以授权 …

  • 声明式不等于破坏式

    发布于 设计

    设计生命周期Drift安全

    说明 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 节点都有两张网卡

    发布于 设计

    设计网络QEMUPigsty

    说明 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

    发布于 设计

    设计架构Inventory状态

    说明 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 最终要 …