服务端 apt 软件源介绍
https://wiki.debian.org/DebianRepository/Format?action=show&redirect=RepositoryFormat
软件源目录介绍
Ubuntu软件源示例: http://mirrors.163.com/ubuntu/
Index of /ubuntu/
../
bin/ 26-Mar-2019 17:09 -
boot/ 19-Mar-2019 16:27 -
cephfs/ 19-Mar-2019 16:28 -
dists/ 23-Apr-2021 19:26 -
indices/ 07-May-2021 12:44 -
pool/ 27-Feb-2010 14:30 -
project/ 28-Jun-2013 19:52 -
ls-lR.gz 07-May-2021 05:30 20M
Debian 软件源示例: http://mirrors.163.com/debian/
Index of /debian/
../
dists/ 27-Mar-2021 17:11 -
doc/ 07-May-2021 09:52 -
indices/ 07-May-2021 10:12 -
pool/ 20-Dec-2000 04:10 -
project/ 18-Nov-2008 07:05 -
tools/ 11-Oct-2012 00:29 -
zzz-dists/ 07-Jul-2019 22:21 -
Archive-Update-in-Progress-mirrors.163.com 07-May-2021 12:04 6
README 27-Mar-2021 17:11 1188
README.CD-manufacture 26-Jun-2010 17:52 1290
README.html 27-Mar-2021 17:11 2898
README.mirrors.html 05-Mar-2017 04:08 291
README.mirrors.txt 05-Mar-2017 04:08 86
extrafiles 07-May-2021 10:17 176K
ls-lR.gz 07-May-2021 04:11 13M
/dists/: 目录包含"发行版"(distributions), 此处是获得 Debian 发布版本(releases)和已发布版本(pre-releases)的软件包的正规途径. 有些旧软件包及 packages.gz 文件在里面./pool/: 目录为软件包的物理地址. 软件包均放进一个巨大的 “池子(pool)”, 按照源码包名称分类存放. 为了方便管理, pool 目录下按属性再分类(“main”, “contrib” 和 “non-free”), 分类下面再按源码包名称的首字母归档. 这些目录包含的文件有: 运行于各种系统架构的二进制软件包, 生成这些二进制软件包的源码包.你可以执行命令apt-cache showsrc mypackagename, 查看 ‘Directory:’ 行获知每个软件包的存放位置. 例如: apache 软件包存放在pool/main/a/apache/目录中.另外, 由于lib*软件包数量巨大, 它们以特殊的方式归档: 例如, libpaper 软件包存放在pool/main/libp/libpaper/./tools/: 用于创建启动盘, 磁盘分区, 压缩/解压文件, 启动 Linux 的 DOS 下的小工./doc/:基本的 Debian 文档, 如 FAQ, 错误报告系统指导等../indices/: 维护人员文件和重载文件.project/: 大部分为开发人员的资源, 如: project/experimental/ 本目录包含了处于开发中的软件包和工具, 它们均处于 alpha 测试阶段. 用户不应使用这些软件, 因为即使是经验丰富的用户也会被搞得一团糟.)
根目录下至少有两个文件夹:dists 和 pool。dists 文件夹里存储的是关于软件包的信息数据,包括:文件名称、大小、位置、校验码等。而pool文件下是具体的软件包存放位置,单独把文件放在pool文件夹里是为了防止文件的重复。
Release/InReleas 文件
文件位于 $ARVHIVE_ROOT/dists/$DISCTRIBUTION 文件夹内,InRelease文件是内部自认证的,而Release文件需要伴随Release.gpg文件出现。这个文件包含该发布版(所在的文件夹)的索引文件和对应的hash。内部所列文件的位置是相对该文件的。比如上面的的source.list内容,为了获取main组件,apt会扫描http://mirrors.163.com/ubuntu/dists/precise/Release文件得到main/binary-amd64/Packages.gz组合成最终的地址http://mirrors.163.com/ubuntu/dists/precise/main/binary-amd64/Packages.gz。这里面就是precise发布版里main组件的所有软件索引。
以binary-$arch命名的文件夹里是二进制文件的目录,源文件的目录在source文件夹。 Package列出的文件是相对于$ARCHIVE_ROOT的。
- Packages 和 Sources目录是是控制文件,包括索引、翻译和差异等。
.deb文件是 debian 的二进制包文件.dsc是 debian 的源码描述文件.tar是打包的文件.gz和.bz2是压缩的文件
Release 文件
上面已经说到,Release 文件就是索引文件。除了具体文件的 hash 和位置之外,一般还有其他的信息。
下面是 Release 为文件的截图,注意:这只截取了开头的部分,完整的内容请参看实际的文件。
$ cat Release
Origin: Ubuntu
Label: Ubuntu
Suite: bionic
Version: 18.04
Codename: bionic
Date: Thu, 26 Apr 2018 23:37:48 UTC
Architectures: amd64 i386
Components: main restricted
Description: Ubuntu Bionic 18.04
Acquire-By-Hash: yes
SHA256:
f7f13d78f7852b850f0a4afcc520128dcb51d4b24f07b33de3019fffc15e0771 96 main/binary-amd64/Release
fb400f6268f088f19da0b59fd6b753cb567506bf9ac08fd98210268d59d3a589 15636 main/binary-amd64/Packages.gz
6bf464b654f697d3ba4ecfef91f0a2e85a2cc931cffd2f259a18c549cf71d358 52757 main/binary-amd64/Packages
31c11066c797feb03125e25e07e95be77a6a579b21413a711e5335ac409a45d9 95 main/binary-i386/Release
3523565078b936dcb91ce049516e6e3ca79bfd8eedec30aa0acc78c38f796fc6 3977 main/binary-i386/Packages.gz
f641bad6115b676f349224a61f2313b931a979d74bd948660f4ecef07f690629 10732 main/binary-i386/Packages
5b8304e8a5292551f998034835188b506e7594f28a01ee11fefae8c23911f101 102 restricted/binary-amd64/Release
5335a779632c1b3831f688506cee170eb43ec56504cb4cca01247b70003b240a 763 restricted/binary-amd64/Packages.gz
3a6db3a302bb2173d260fe50622642f5ab44b3ed0e26696ab9bcb12f594212a5 1894 restricted/binary-amd64/Packages
7cc9b25600a859c8faa784dc728f89812e98efed980e3aced1d479ac608b97cc 101 restricted/binary-i386/Release
e7ab72b8f37c7c9c9f6386fb8e3dfa40bf6fe4b67876703c5927e47cb8664ce4 40 restricted/binary-i386/Packages.gz
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 restricted/binary-i386/Packages
可选项,这些提供了一些repo的基本信息
- Description: 描述
- Origin:repo 的来源
- Label:标签说明
- Suite: 套件,就是前面说的 distribution
- Codename: 发布的代号
决定 repo 布局的选项
- Components: 对应前面的组件
- Architectures:系统的架构
功能性的选项
- Date:release 文件的创建日期
- Valid-Util:保质期
- MD5Sum, SHA1, SHA256: 指使文件的位置和认证索引文件的真伪,包括:
- checksum
- 文件大小
- 文件名
其中四个选项是 server 端必须的:
- SHA256
- Suite and/or Codename
- Architectures
- Components
Package 文件
Package: virt-viewer
Architecture: amd64
Version: 6.0-2
Priority: extra
Section: admin
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian Libvirt Maintainers <pkg-libvirt-maintainers@lists.alioth.debian.org>
Installed-Size: 1433
Depends: libc6 (>= 2.4), libgdk-pixbuf2.0-0 (>= 2.25.2), libglib2.0-0 (>= 2.38), libgovirt2 (>= 0.3.4), libgtk-3-0 (>= 3.11.5), libgtk-vnc-2.0-0 (>= 0.4.1), libpango-1.0-0 (>= 1.14.0), librest-0.7-0 (>= 0.8.0), libspice-client-glib-2.0-8 (>= 0.33), libspice-client-gtk-3.0-5 (>= 0.32), libvirt-glib-1.0-0 (>= 0.0.7~), libvirt0 (>= 1.2.8~rc2), libxml2 (>= 2.7.4)
Suggests: netcat
Filename: ./virt-viewer_6.0-2_amd64.deb
Size: 256264
MD5sum: 09c3870aecf54cbcc06a39d6e290ebc3
SHA1: 23455210fb36b3907428633a9eba003066571cca
SHA256: fcd77e030d99665ada9ed96e91e2a3fd96567b20a7199f1c2bf1ce43aa72f169
SHA512: 7ec479b13dac421663e25035ba7082e82409409ac5530ad9dbac15eaf7240a536bee2287a0bb73be5dfa2e7cc08e68e8f4a4c408482b003ee013df4df8e7c96a
Homepage: http://virt-manager.org
Description: Displaying the graphical console of a virtual machine
The console is accessed using the VNC or SPICE protocol. The guest can be
referred to based on its name, ID, or UUID. If the guest is not already
running, then the viewer can be told to wait until is starts before attempting
to connect to the console The viewer can connect to remote hosts to lookup the
console information and then also connect to the remote console using the same
network transport.
文件 dists/$DIST/$COMP/binary-$ARCH/Packages 是二进制包的索引。这个文件分成很多段,每一段是一个具体文件包的说明,上图是一个包的完整实例。其中包括的选项有:
- Filename:文件名,相对于$ARCHIVE_ROOT的路径(必须)
- Size: 文件大小,byte为单位(必须)
- MD5Sum, SHA1,SHA256:加密hash,验证wfjm(推荐)
- Description-md5(可选)
Sources 文件
文件 $DIST/$COMP/source/Sources 被称为源码文件索引。它们和 Packages 文件相似,分为很多段,每一段描述一个源码文件包。
几个重要的选项有:
- Directory: 文件包所在的目录
- Package: 文件名
- version: 版本号
- Priority: 优先级,包括source、optional等选项
- Files: 包括的文件
- Checksums-Sha1(256): 校验和
Packages.gz 和 Sources.gz
https://www.debian.org/doc/manuals/repository-howto/repository-howto
Packages.gz 是 deb 二进制包索引文件
Sources.gz 是 src 源码包的索引文件
可以通过如下方法创建索引
$ cd my-repository
$ dpkg-scanpackages binary /dev/null | gzip -9c > binary/Packages.gz
$ dpkg-scansources source /dev/null | gzip -9c > source/Sources.gz
apt-get 的流程
了解到上面各个文件和文件夹的用处和内容之后,apt的工作流程也就很好理解了。
- apt 程序解析
/etc/apt/source.list文件,根据配置的的 url 和发行版得到 Release 的文件的位置 - dns 解析 url 的 ip,请求 Release 文件,解析组件的 Release 文件和 Package 文件,根据 Package 文件里的内容找到所要装的文件包,并验证所有文件的合法性。
- 如果文件包有依赖(depends),继续使用上述的方法定位到依赖的安装包。安装所有依赖后,再安装该软件包。
- 如果文件包没有依赖,直接安装。
定制自己的source.list文件
找到repo的根目录($ARCHIVE_ROOT),就是包含dists和pool目录的那个目录,记为 打开dists目录,记下其中的子目录名称,找到自己要使用的版本名 打开pool目录,找到里面的组件名称 编写自己的source.list,格式为deb url codename component。 更新一下:sudo apt-get update。
http 和 file 路径问题:取决于在什么地方生产的 Package 文件,路径中根就是当前路径