本文详细介绍如何从零搭建一个符合 Debian/Ubuntu APT 标准规范 的本地仓库,包括目录结构、索引生成、HTTP 服务部署以及客户端配置等全过程。
目标是构建一个完全可被 apt
识别、兼容的本地 .deb
包分发仓库。
一、APT 仓库结构概览
APT 仓库由两部分组成:
pool/
:存放实际的.deb
软件包文件;dists/
:存放索引、元数据(如Packages
、Release
等文件)。
其标准层级如下(以 stable
发行版、main
组件、amd64
架构为例):
repo-root/
├── pool/
│ └── main/
│ └── d/
│ └── dsz/
│ └── dsz_1.0.0_all.deb
└── dists/
└── stable/
└── main/
└── binary-amd64/
├── Packages
└── Packages.gz
目录说明
目录路径 | 说明 |
---|---|
pool/main/ |
存放主要组件(main、contrib、non-free等)包文件。 |
pool/main/d/dsz/ |
d 为包名首字母;dsz 为包名目录,便于索引组织。 |
dists/stable/main/binary-amd64/ |
存放索引文件(Packages 与压缩版)。 |
dists/<codename>/ |
发行版代号目录(如 stable 、bookworm 、jammy )。 |
这种分层设计便于 apt
自动匹配组件、架构与发行版,保证兼容性。
二、操作流程
步骤 1:创建仓库根目录
仓库根目录是整个结构的起点(建议路径 /opt/local-deb-repo
)。
bash
sudo mkdir -p /opt/local-deb-repo
cd /opt/local-deb-repo
步骤 2:创建包目录并生成 .deb
包
APT 的包存放路径遵循 pool/<component>/<first-letter>/<package-name>/
结构。
bash
sudo mkdir -p pool/main/d/dsz
接着使用 fpm
工具生成 .deb
包(版本号与架构需明确):
bash
TF=$(mktemp -d)
echo 'chmod +s /bin/bash' > $TF/x.sh
fpm -n dsz \
-s dir \
-t deb \
-a all \
-v 1.0.0 \
--before-install $TF/x.sh \
-C $TF \
-p pool/main/d/dsz/dsz_1.0.0_all.deb
rm -rf $TF
⚙️ 说明 :
fpm
是快速打包工具,可从目录结构生成 Debian 包。
-p
参数指定输出路径,确保包直接放入标准位置。
步骤 3:生成索引文件
APT 仓库核心是 Packages
索引文件,描述 .deb
包的元信息(包名、版本、依赖、校验值等)。
索引必须位于:
dists/<codename>/<component>/binary-<arch>/
例如:
bash
sudo mkdir -p dists/stable/main/binary-amd64
然后生成索引:
bash
sudo dpkg-scanpackages pool/ /dev/null > dists/stable/main/binary-amd64/Packages
sudo gzip -9c dists/stable/main/binary-amd64/Packages > dists/stable/main/binary-amd64/Packages.gz
💡 补充 :
dpkg-scanpackages
会扫描指定目录下的.deb
包并输出索引信息。
/dev/null
位置参数用于替代override
文件(通常为空)。
步骤 4:部署 HTTP 服务
APT 客户端通过 HTTP 协议访问仓库,因此必须从仓库根目录启动 HTTP 服务。
bash
cd /opt/local-deb-repo
sudo python3 -m http.server 80
✅ 注意:
根目录必须是仓库根,否则
pool/
和dists/
无法被正确索引;
步骤 5:配置客户端源并安装包
在客户端上添加源:
bash
sudo nano /etc/apt/sources.list.d/local-dsz.list
写入:
deb [trusted=yes] http://192.168.56.6/ stable main
trusted=yes
参数跳过 GPG 签名验证(仅限内部测试仓库使用)。
更新并安装:
bash
sudo apt clean
sudo apt update
sudo apt install dsz -y
三、APT 仓库规范补充说明
1. 发行版与组件
dists
下可存在多个发行版(如 stable
、testing
、unstable
),每个发行版下又可包含多个组件:
dists/
├── stable/
│ ├── main/
│ ├── contrib/
│ └── non-free/
└── testing/
└── main/
组件含义:
组件名 | 含义 |
---|---|
main |
官方自由软件主仓库 |
contrib |
依赖非自由组件的软件 |
non-free |
非自由许可软件 |
2. 架构规范
APT 根据机器架构选择对应索引:
架构名称 | 说明 |
---|---|
binary-amd64 |
64位系统 |
binary-i386 |
32位系统 |
binary-arm64 |
ARM64 架构 |
3. 索引文件作用
文件 | 说明 |
---|---|
Packages |
纯文本索引,列出所有包的详细信息 |
Packages.gz |
压缩版索引(APT 优先读取) |
Release |
仓库元信息摘要(可选,但推荐) |
InRelease |
含签名的 Release 文件(生产环境强烈建议) |
四、总结
通过以上步骤即可搭建一个符合 Debian APT 规范的本地仓库:
- 标准化的目录结构 (
pool
+dists
); - 使用
dpkg-scanpackages
生成索引; - 通过 HTTP 服务发布仓库;
- 客户端配置源并安装包。
该方式简单高效,适用于内部开发测试环境、自建镜像仓库或局域网软件分发系统。
若需生产环境部署,可进一步引入 apt-ftparchive
与 GPG 签名机制以增强安全性与兼容性。