功能
Plain/Managed 仓库生成、包池、策略、签名、事务、发布与审计。
SOW 提供两条相互隔离的运行路径。Plain 模式无状态地重建一个目录;Managed 模式在工作区中 持续记录软件包成员关系与不可变仓库 Generation。两者都不会暗中接管对方的状态。
能力矩阵
| 能力 | Plain | Managed |
|---|---|---|
| RPM 与 DEB 元数据 | 是 | 是 |
| RPM + DEB 混合操作 | 同一目录 | 同一 Repository、不同 Dist |
| 持久成员关系与 Generation | 否 | 是 |
| 分架构视图与中性包投影 | 否 | 是 |
exclude 与版本 limit 策略 |
否 | 是 |
| 元数据签名 | 否 | RPM 与 DEB |
| RPM 包签名 | --sign-with |
never、fill、always |
| 事务日志与恢复 | 重新运行 create |
Workspace、Repository、发布 |
| 可查询 Operation Log 与 JSONL 导出 | 否 | 是 |
| 发布目标 | 否 | filesystem 与 R2 |
SOW 在进程内解析软件包并渲染元数据,不调用 createrepo_c、dpkg-scanpackages、
reprepro 或 modifyrepo_c。RPM 包签名是例外:它会改写包体,因此需要主机上的 rpm
命令与 GPG 环境。
仓库格式
| 表面 | RPM/YUM | DEB/APT |
|---|---|---|
| 包事实来源 | RPM header | DEB control archive |
| 身份 | NEVRA + 确切字节 SHA-256 | name=version:arch + 确切字节 SHA-256 |
| 索引 | primary、filelists、other、repomd.xml |
Packages、Packages.gz、Release |
| 中性架构 | noarch |
all |
| 不可变索引路径 | 校验和命名 rpm-md | by-hash/SHA256 |
| Managed 元数据签名 | repomd.xml.asc |
InRelease、Release.gpg |
SOW 有意不生成 SQLite rpm-md、zchunk、modulemd、源码包索引与 MD5/SHA1 DEB manifest。 它负责构建仓库文件,不提供 HTTP 服务或 CDN。
按问题阅读
| 问题 | 页面 |
|---|---|
sow create 写什么、替代什么? |
Plain 平面仓库 |
| Workspace、Repository、Dist 与私有状态如何关联? | Managed 工作区 |
| 一个包池如何供给多个纯元数据视图? | 包池与元数据视图 |
| 为什么软件包被排除或限量? | 成员策略 |
| 哪把密钥签哪个对象? | 签名模型 |
| 中断后会发生什么? | 事务与恢复 |
| 如何查看、校验并审计仓库? | 可观测与审计 |
Release 目标、文件系统要求、客户端与 Provider 见平台与集成。
Plain 平面仓库
sow create 的单遍扫描、覆盖重建契约,以及确定性输出与 Pigsty 完成标记。
Managed 工作区
工作区 → 仓库 → Dist 三层模型、固定磁盘布局、sow.yml 如何驱动一切,以及发现与选择规则。
包池与元数据视图
一份软件包、一个属主、纯元数据 APT/RPM 视图:正典包池寻址、中性包、搬迁与显式 reposync 导出。
成员策略
exclude 与 limit 如何决定哪些包留在 Dist 里:规则字段、glob 匹配、版本排序,以及放宽策略为什么永远不会复活已移出的成员。
签名模型
两条独立信任链、四种密钥引用形态、进程内与外部签名的分工,以及安全换钥方式。
事务与恢复
Managed 模式的操作日志、两级锁模型、固定提交顺序与证据驱动崩溃恢复。
可观测与审计
正确使用 status、check、changes、retention 与操作日志,不混淆状态和证明。