包池与元数据视图
Managed 仓库将每个包对象保存在 pool/ 中。Dist 和架构视图只包含引用这些包字节的索引。
存储范围是一个仓库。同一个包放入其他仓库或发布目标后,分别占用相应仓库或目标的命名空间。
RPM 视图
RPM Dist 为每个配置架构生成一个元数据目录:
demo/
pool/
- e/example/example-1.0-1.x86_64.rpm
- d/demo-data/demo-data-1.0-1.noarch.rpm
dists/el9/
x86_64/repodata/
- <sha256>-primary.xml.gz
- <sha256>-filelists.xml.gz
- <sha256>-other.xml.gz
- repomd.xml
aarch64/repodata/
- ...
x86_64 视图包含 x86_64 和 noarch 包,aarch64 视图包含 aarch64 和 noarch 包。
两个视图引用同一份 noarch 文件。
包位置相对于架构目录:
客户端指向 dists/el9/x86_64/,服务端提供完整 demo/ 目录,使相对包路径可以解析。
sow check 检查索引路径没有逃出仓库,并指向预期包对象。
APT 视图
APT 索引使用相对于仓库根的路径:
每个配置架构在 dists/<dist>/main/binary-<arch>/ 下有 Packages、Packages.gz
和 SHA-256 by-hash 条目。Dist 根包含 Release,已签名时还有 InRelease、Release.gpg。
all 包出现在每个适用架构索引中,包体仍只有一份包池对象。
SOW 不生成每视图包副本,也不生成每架构 Release 文件。
为 dnf reposync 导出
默认 dnf reposync 会拒绝越过其单仓库下载目录的 Managed RPM 路径。
此工作流可使用独立仓库导出:
RPM Dist 必须属于当前构建快照且处于干净状态。即使后续构建只更新了其他 Dist,只要该 RPM Dist 状态干净,也可以直接导出,因为 SOW 会把未变更的视图沿用到当前构建快照中。运行前先检查导出前提。
导出包含本地包路径、独立 repodata、清单和 .sow-export.json 完成标记。
目标目录应位于仓库和所有已配置 filesystem 发布目标的预期路径(endpoint + prefix)之外。
默认复制文件。--hardlink 要求同一文件系统,使导出包与源包共用 inode,因此应保持导出文件只读。导出不会创建 Dist 成员或保留构建快照,也不是 sow publish 的输入。
交付完整仓库
在线更新使用已配置的发布目标。删除某个 Dist 或架构后,先运行覆盖整库的 sow build -r REPO 再发布,使当前构建快照覆盖完整仓库并允许 sow publish 安全撤下远端已移除的入口指针。需要其他传输方式时,先将完整、已稳定的
pool/ + dists/ 复制到单独暂存目录,检查副本后再切换上线。缓存中的索引所引用的包 URL
应保持可访问,直到缓存过期。完整传输流程见对外服务。
只复制某个 RPM 架构目录,会使包路径无法解析。
sow changes 0 在 pool/ 下列出每个包一次,再列元数据和客户端入口。
它描述本地文件;目标进度与缓存处理由 sow publish 管理。