使用私有软件源可以很方便的安装自己开发或者编译的软件。
第三方软件源的存放在 /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-toolchainComponent
:所属分类,常用的是main
,如果是商业软件一般用non-free
deb 安装包在服务器上的位置就由 URL,Codename 和 Component 决定。
apt 作为包管理器,还有自己的一套版本控制规则,在 URL 指向的目录下,需要有 dists
和 pool
两个目录。
dists
:用于存放 deb 的元数据,哈希值和签名信息等。
pool
:用于存放 deb 安装包。
在网站的 repo
目录下,需要有 dists
和 pool
两个目录:
repo
├── dists
└── pool
软件源 URL 中的路径 swift-toolchain
和 main
在 dists
目录中的结构:
在 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 进行签名,生成 InRelease
和 Release.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: