跳转到主要内容

这是本节的多页打印视图。 .

返回本页常规视图.

关于 Farrow

简化后的产品模型、实现边界、真机证据、当前限制与发布门禁。
  • 设计:为什么 Farrow 只有一份 Inventory、一套 deployment 与一个固定 IP 网络。
  • 当前状态:严格区分已实现、真机验证与剩余发布门禁。
  • 工程与发布:源码、生成输出、软件包、镜像流水线与证据边界。

1 - 设计

Farrow 简化后的单 deployment 架构、网络、状态、安全边界与评审结论。

一个有用的抽象

Farrow 把一份 Pigsty Inventory 启动成一套本地 QEMU deployment。它刻意不再拥有 project marker、项目注册表、租约模型、Provider Layer 或第二种配置格式。

状态位于当前 Unix 用户的 ~/.farrow。产品假设每台电脑只有一套运行中的 Pigsty; 这并不是 root 强制的跨用户单例。

节点级收敛

Farrow 只提取已记录的 VM 与 Pigsty 原生字段,计算逐节点哈希,并保存应用状态与完整 进程身份。新增节点增量创建;up 也会启动选中的已停止节点,运行中同伴不受影响; 变更需要显式节点重建; 配置缺席永远不授权删除。

运行时选择

Guest 架构是部署级期望状态。省略或 native 跟随宿主;显式 amd64/arm64 会准确 选择对应 Catalog 工件。HVF/KVM 原生加速仍是默认路径;外来架构或 Catalog 已知的 镜像/宿主不兼容规则才会选择固定 TCG Profile。没有用户可传的 Accelerator 参数,也不会 因任意原生失败静默回退。

实际架构与加速器保存在每个 QEMU Invocation 中,并通过 status 展示。执行破坏性 recreate 前,Farrow 会证明所选 QEMU 二进制与版本、网络后端、镜像字节、启动模式与固件。 以后若新二进制改变运行时策略,也不能把新旧节点混跑:Runtime Drift 必须整体重建。

双网卡与一个固定子网

管理网卡负责 DHCP、DNS、出网与回环 SSH;固定 IP 网卡负责宿主、节点间与 Ansible 流量。macOS 使用 socket_vmnet;Linux 优先跟随当前 NetworkManager,否则使用 systemd-networkd,并通过发行版 bridge helper 接入。若 networkd 尚未启动,只有在 Activation-safety 扫描证明现有 Unit 不会接管真实宿主链路后才启动。

Debian helper 会临时、可逆地限制给调用者真实加入的组。setup 必须通过一次非特权 QEMU bridge smoke;失败后按 manifest 自动回滚。

安全边界

QEMU 与所有 Guest 工件都以调用者身份运行。root 仅用于宿主网络与可选 hosts publisher。 销毁必须同时匹配属主、路径包含、节点身份、QMP/进程身份与工件白名单;任何歧义都会停止。

评审结论

对单实验室产品而言,删除 project 与 lease 的 pivot 是正确的,显著降低了认知与状态 复杂度。但真机审查仍不可省略:第一版在控制节点密钥、sudo 策略、Debian helper 权限、 NetworkManager 验证、运行时 preflight、结果消息与失败清理上存在跨层断裂。这些路径已修复, 并在 macOS 与 Linux 真机重放后才重写本文档。后续对抗审查又在 EL7/EL8 提交前发现并 修复了破坏前预检顺序与签名 Catalog 基线升级问题。

2 - 当前状态

当前简化源码已经通过哪些真机验证、哪些仍未验证、什么阻塞 1.0。

Farrow 仍是 pre-1.0。源码测试、带日期的真机重放、软件包、发布、CI 与线上站点是不同门禁。

最近一次有记录的真机重放:2026-08-27

该矩阵只属于当天真正执行过的准确 Checkpoint;后续源码或文档修改不会自动继承真机证明。

宿主 路径 结果
macOS 26.6.2 arm64 HVF、QEMU 11.1、socket_vmnet 单节点与增量四节点通过
Ubuntu 26.04 amd64(mx KVM、QEMU 10.2.1、NetworkManager setup、单节点、增量四节点与卸载通过

两台宿主均通过固定 IP、SSH readiness、默认 CPU/内存/根盘/数据盘、cloud-init、 stop/start、跨目录操作、扩容时控制节点 boot ID 不变、控制节点横向 SSH、忽略未消费的 Pigsty 变更、配置缺席不删除、显式 destroy。

Linux 还验证了 NOPASSWD 自动化、调用者可用的 Debian helper 权限、非特权 bridge smoke、 四个 tap 挂接时拒绝卸载,以及 destroy 后精确恢复宿主状态。

交互式宿主网络与 hosts 命令现在会自行调用 sudo,外部 sudo -v 只是可选优化。 Darwin 的 network.json 丢失时,也可用字节一致的接口双份证据、准确 launchd plist 与 已安装二进制摘要重建仅用于卸载的归属计划。

2026-08-28,校准后的工作树通过 unit、race、vet、staticcheck、govulncheck、四平台交叉 构建、模拟镜像流水线边界、许可证校验与 GoReleaser 配置校验。隔离的本地 GoReleaser Snapshot 还构建并验证了四个平台归档、两个架构的 DEB/RPM、SPDX、Checksum、依赖、权限 以及归档/软件包一致性。没有发布任何产物;这些结果也不会扩展本真机矩阵。

EL7/EL8 兼容性:2026-08-28

Commit 7c666c7 在两轮独立 Claude Code Opus 5 max 对抗审查后恢复 EL7/EL8。第一轮因 破坏前运行时预检顺序与签名 Catalog 基线迁移问题给出 BLOCK;修复并补回归测试后,第二轮 给出 PASS,且没有 Required Fix。

Catalog 2026082801 已在开发仓库签名激活:9 个 Family、17 个镜像工件;包含两份 socket_vmnet Archive 在内的 19 个 Repository Payload 均重新通过完整 SHA 校验。干净客户端 接受了公开签名与准确嵌入摘要。

隔离的 macOS arm64 生命周期重放用内置 TCG 兼容规则启动 Rocky Linux 8.10 arm64, stop/start 后 44.2 秒达到 readiness,并验证 NetworkManager、固定 IP/无路由/无 DNS、 dba UID/GID 88 与 generation/spec marker。EL7 字节、qcow2、BIOS 布局与 4K XFS Root 已验证;当前 Linux/amd64 原生 Farrow 生命周期仍待重放。

仍未完成

  • EL9 + NetworkManager + firewalld 真机重放;
  • 当前 systemd-networkd 重放;
  • 宿主重启持久性;
  • macOS amd64 与 Linux arm64 真机;
  • 当前 Linux/amd64 原生 EL7 生命周期;
  • 当前 9p share 重放;
  • 完整的 Pigsty configure → farrow up → install.yml
  • 公开 Homebrew/DEB/RPM 安装与发布 CI。

当前镜像仍为 testing,只有 EOL EL7 是 deprecated。active/standby Catalog 公钥已经 内置,但镜像仓库仍需迁离开发宿主,私钥托管/轮换与 Release 职责也必须在 1.0 前正式落实。

3 - 工程与发布

源码边界、构建测试门禁、镜像归一化、发布输出与证据纪律。

仓库边界

Farrow 源码仓库只保留代码、测试、构建/打包定义、法律声明与简短入口 README。本网站是 用户、设计、运维与发布文档的唯一权威位置。原始 Review 记录、历史 Scratch Inventory、 Demo 目录、生成二进制与 Release 输出树都不是源码输入,不应提交。

以下输出随时可重建:

  • bin/:开发构建;
  • dist/.goreleaser-*:Release/Snapshot Staging;
  • 根目录 farrowfarrow-hosts-helpercatalogsign 二进制;
  • Hugo 的 public/resources/

构建与源码门禁

make build
make test
make race
make vet
make staticcheck
make vuln
make cross-check
make image-pipeline-test
make license-check

make check 汇总这些门禁。源码绿色不等于真机验证;macOS HVF、Linux KVM/网络、软件包 消费、Release 发布与线上渲染仍是不同门禁。

Release 与软件包契约

packaging/.goreleaser.yaml.github/workflows 属于源码;它们生成的目录不是。 Archive 与 Linux Package 只携带匹配二进制、LICENSE、精简源码 README、 构建元数据,以及根据 go.mod 锁定模块版本重建的准确上游许可证字节。生成的许可证文本 在 Archive 中位于 licenses/,不作为源码跟踪。详细文档留在版本化网站,不再复制到每份 二进制 Payload。

构建成功绝不代表发布。Commit、Tag、Archive/Package、签名/证明、上传、CI 与公开消费是 彼此独立的门禁。

镜像归一化

packaging/image-pipeline/ 只接受显式本地 qcow2,不下载也不上传。它复制并哈希源文件, 强制 qcow2 解析,拒绝 Backing/External/Encryption/未知 Feature,运行 qemu-img check, 并可在显式 QEMU Sandbox 中做无网络 Offline Guest Mutation。UID/GID 88 冲突会拒绝, 不会含糊改写。

Catalog 逐字节导出命令:

go run ./tools/catalogexport /absolute/new/catalog.json

导出器原子且绝不覆盖。Catalog 签名与应用 Release 签名使用不同密钥与信任域。

证据纪律

历史 M0–M4 记录在实现期有价值,但不是产品文档。可长期保留的结论已收敛到设计当前状态。后续源码修改不会自动继承真机证明;每条状态结论都应说明日期、宿主、 路径与剩余门禁。