建立私有软件的 apt 仓库

Mar 24, 2022 • 预计阅读时间 2 分钟

使用私有软件源可以很方便的安装自己开发或者编译的软件。

第三方软件源的存放在 /etc/apt/sources.list.d 目录:

创建一个软件源文件:

/etc/apt/sources.list.d/swift-toolchain.list

软件源文件的内容如下:

deb http://127.0.0.1/repo swift-toolchain main

以上几部分拆开来解析:

  • deb:表示是 deb 安装包
  • URL:仓库链接,可以是网络地址 http://, https://,也可以是本地路径 file:/// 开头的地址,也可以是光驱 cdrom:
  • Codename:自定义的代号,swift-toolchain
  • Component:所属分类,常用的是 main,如果是商业软件一般用 non-free

deb 安装包在服务器上的位置就由 URL,Codename 和 Component 决定。

apt 作为包管理器,还有自己的一套版本控制规则,在 URL 指向的目录下,需要有 distspool 两个目录。

dists:用于存放 deb 的元数据,哈希值和签名信息等。

pool:用于存放 deb 安装包。

在网站的 repo 目录下,需要有 distspool 两个目录:

repo
├── dists
└── pool

软件源 URL 中的路径 swift-toolchainmaindists 目录中的结构:

main 目录存放的是不同 CPU 框架的包的元信息。

Packages 文件记录的是 deb 软件包的信息,如果是放在网络上,必须经过压缩。

Release 文件记录的是本目录和子目录文件的哈希值。

InRelease 和 Release.gpg 是 Release 文件的签名,分别是可读的文本和二进制格式形式。

apt-get update 的时候会先校检 Release 文件的签名信息,如果不符合则认为是无效的仓库。

校检签名使用的公钥放在 /usr/share/keyrings 目录下,如果是私有仓库则需要把公钥添加这个目录中。

所以在这种验证机制下,即使是使用 HTTP 明文传输,也能够保证数据的安全性。

dists
└── repo
    ├── InRelease
    ├── main
    │   ├── binary-amd64
    │   │   ├── Packages
    │   │   ├── Packages.xz
    │   │   └── Release
    │   └── binary-arm64
    │       ├── Packages
    │       ├── Packages.xz
    │       └── Release
    ├── Release
    └── Release.gpg

deb 软件安装包则在放在 pool/main 目录下:

pool
└── main
    └── repo
        ├── swift-toolchain-5.6-1_amd64.deb
        └── swift-toolchain-5.6-1_arm64.deb

Package 生成方法:

dpkg-scanpackages -a amd64 -m pool/main/swift-toolchain > dists/swift-toolchain/main/binary-amd64/Packages
dpkg-scanpackages -a arm64 -m pool/main/swift-toolchain > dists/swift-toolchain/main/binary-arm64/Packages

Release 文件生成方法, Codename 参数是需要有的,否则会有警告信息:

Codename 可以随意,但一般建议是使用和发行版一样的代号,以后管理起来方便。

apt-ftparchive -o APT::FTPArchive::Release::Codename="swift-toolchain" \
               release dists/swift-toolchain/main/binary-amd64 \
               > dists/swift-toolchain/main/binary-amd64/Release

apt-ftparchive -o APT::FTPArchive::Release::Codename="swift-toolchain" \
               release dists/swift-toolchain/main/binary-arm64 \
               > dists/swift-toolchain/main/binary-arm64/Release

apt-ftparchive -o APT::FTPArchive::Release::Codename="swift-toolchain" \
               release dists/swift-toolchain \
               > dists/swift-toolchain/Release

使用 GNUPG 对 Release 进行签名,生成 InReleaseRelease.gpg

gpg --yes --local-user Lvv.me \
    --armor --detach-sign \
    --output dists/swift-toolchain/Release.gpg \
    dists/swift-toolchain/Release

gpg --yes --local-user Lvv.me \
    --armor --clearsign \
    --output dists/swift-toolchain/InRelease \
    dists/swift-toolchain/Release

导出 GNUPG 的公钥并导入系统的钥匙环:

gpg --yes --armor --local-user Lvv.me --export --output ~/swift-toolchain.gpg.key
gpg --yes --dearmor --output /usr/share/keyrings/swift-toolchain.gpg ~/swift-toolchain.gpg.key

更新软件源文件,增加验证签名的公钥信息:

deb [signed-by=/usr/share/keyrings/swift-toolchain.gpg] http://127.0.0.1/repo swift-toolchain main

Note

解决 apt-get update 警告信息:

W: Conflicting distribution: http://10.211.55.30/repo swift-toolchain InRelease (expected swift-toolchain but got )

这个警告的原因是 InRelease 里缺少 Codename 字段。

如果软件源是 HTTPS ,需要安装依赖:

apt-get install ca-certificates

最后

这是我自己编译的 Swift toolchain 软件源,支持 aarch64 和 amd64:

https://swift-toolchain.com

aptDebianUbuntu
版权声明:如果转发请带上本文链接和注明来源。

lvv.me

iOS/macOS Developer

安装 DEB 安装包并自动安装依赖

ssh 客户端通过代理连接服务器