核心概念
SOW 模型:Plain 与 Managed、包池与视图、Desired Membership 与 Built Generation。
Plain 还是 Managed
两条运行路径相互独立。
| Plain | Managed | |
|---|---|---|
| 入口 | sow create DIR |
init、repo、dist、add、rm、build |
| 状态 | 软件包目录 | sow.yml 加私有 SQLite/操作日志 |
| 公共布局 | 平面 RPM/DEB 索引 | Repository pool/ + dists/ |
| 格式 | RPM 与 DEB 可共存于一个目录 | 每个 Dist 一种格式 |
| 架构视图 | 无 | 有 |
| 策略与审计 | 无 | 有 |
| 元数据签名与发布目标 | 无 | 有 |
目录内容已经等于目标仓库时使用 Plain。需要由 SOW 管理成员、策略、Generation、签名、 审计或发布时使用 Managed。
Managed 层级
- Workspace 是配置与发现边界。
- Repository 是隔离、Generation、发布和公共树边界。不同 Repository 之间不去重包体。
- Dist 是单一包格式的具名成员集合。
- 架构视图 是派生输出,不是第二套成员关系。
noarchRPM 与allDEB 会进入所有适用 视图,但包池字节不重复。
一条规范包体路径
Package Object 以确切字节的 SHA-256 标识;逻辑坐标来自 RPM header 或 DEB control, 不来自文件名。
每个已接受包体在 Repository pool/ 下只有一条规范路径。RPM 架构视图只含 repodata/,
包位置通过父级相对路径回到包池;APT Packages 直接指向同一包池。
普通包管理器与镜像工具是不同契约。默认 dnf reposync 会拒绝规范 RPM 视图中的父级跳转。
需要自包含 RPM 镜像 leaf 时,使用 sow export rpm-leaf 生成独立产物。
Desired 与 Built
Managed 模式分别追踪意图与公共字节:
add 与 rm 默认构建受影响的 Dist。--skip 只记录成员变更,Repository 会保持 dirty;
随后用 sow build 把 Desired 收敛为新的 Built Generation。
sow status低成本读取状态,并报告ready_to_copy。sow check执行完整只读交付证明。dirty 或 recovering 状态不可交付。sow changes [BASE_GENERATION]描述某个已记录 Generation 到当前 Built Generation 的 物理差异。它是证据与计划输出,不能替代发布恢复或远端验证。sow publish TARGET通过配置的 Provider 发布已校验 Generation,并记录 target 级恢复与 checkpoint 状态。
事务与失败状态
写操作由 Workspace 或 Repository 锁串行化,并在公共变更前记录意图。包体与不可变元数据 先准备,可变协议指针最后更新。下一条 writer 会先恢复被中断操作,再开始新工作。
| 状态 | 含义 |
|---|---|
clean |
Desired 与 Built 一致 |
dirty |
Desired 已变化;Built 仍是上一个已提交 Generation |
recovering |
存在必须解决的非终态操作 |
error |
持久证据冲突;SOW 拒绝猜测 |
用 status 诊断,用 check 做发布门禁。ready_to_copy=false 的 Repository 不应发布。