这是本节的多页打印视图。 .
关于 Farrow
1 - 设计
一个有用的抽象
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 - 当前状态
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;- 根目录
farrow、farrow-hosts-helper、catalogsign二进制; - Hugo 的
public/与resources/。
构建与源码门禁
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 逐字节导出命令:
导出器原子且绝不覆盖。Catalog 签名与应用 Release 签名使用不同密钥与信任域。
证据纪律
历史 M0–M4 记录在实现期有价值,但不是产品文档。可长期保留的结论已收敛到设计 与当前状态。后续源码修改不会自动继承真机证明;每条状态结论都应说明日期、宿主、 路径与剩余门禁。