Ubuntu软件仓库的结构是怎样的?

一个Ubuntu仓库中的文件是如何组织的?仓库中有哪些重要的文件?当一个仓库变得不一致、损坏或正在同步时会发生什么?

如果你对apt仓库的文件结构感兴趣,Debian文档详细描述了实现细节:Debian仓库格式 - Zach Bloomquist
2个回答

Joao回答了我问题的后半部分,所以我自己调查了前半部分。在根目录下,有四个文件夹和一个文件。
root
| -- dists
| -- pool
| -- indices
| -- project
| -- ls-lr.gz

(同样在我的大学仓库中,只有前两个条目存在。所以最后3个似乎对仓库的运行没有必要。)
文件ls-lr.gz包含了在仓库根目录上运行ls -lr命令的输出。 dists目录似乎包含了大部分元数据,包括所有的packages.gz文件(其中包含了一个包列表)和签署该包的Release.gpg/Release文件。(感谢Joao提供的信息) pool目录包含了实际的.deb文件。组织结构为/pool/[section]/[letter]/[group]/packagename.deb。因此,python-subversion包的实际位置是/pool/main/s/subversion/python-subversion_1.3.2-3ubuntu2%7edapper1_amd64.deb,因为subversion是python-subversion包的组,而s是subversion的首字母。 projects目录似乎包含了一些详细说明镜像如何与原始仓库同步的文件。 indices目录中包含许多文件,其中大部分为空。非空文件似乎为软件包提供了一些额外的元数据。

2如何在sources.list文件中使用pool文件? - Tarun Maganti
@TarunMaganti pool是一种约定,请查看Debian文档中的"Sources" Indices"部分:https://wiki.debian.org/DebianRepository/Format - Zach Bloomquist

根据您的apt源上的deb行,apt将获取以下内容: 它验证Release.gpg是否是Release文件的有效签名,并且Packages.gz的内容是否与Release文件上的完整性校验和匹配。如果不匹配,则报告存储库签名完整性失败。
所请求包的包文件名是根据先前检索到的Packages.gz内容确定的。它会被下载,其内容校验和必须与Packages.gz的校验和内容匹配,否则将报告完整性失败。
您最后一个问题并不是关于镜像结构本身,而是关于镜像同步,这取决于镜像过程。可以使用临时位置进行同步,而不会破坏归档完整性。我不确定所有Ubuntu镜像是否都这样做。

很抱歉,链接已经损坏。 - bluish
1它们并没有损坏,只是模板而已。你需要替换其中的“发布”、“组件”、“二进制”等动态字段。 - João Pinto