最早接触 reprepro 可以追述到使用 Arch 前,大约是6、7年前,当时偶尔会在 ubuntu 下定义编译一些软件,为了让其他同事也方便使用,在局域网提供了一个内部仓库。 那时没有深究,照着教程一顿操作。那时生产环境主要用的还是RHEL,故没太多需求。
到目前的敝社,生产环境敲定使用 ubuntu server 后,对生产环境的软件版本有要求时, 也想到了自己编译打包,方便安装,同样使用到reprepro。从 trusty 14.04 一路用来, 似乎也没遇到问题。
不过随着容器技术的普及,对操作系统的内核以及版本有所要求后,生产环境的系统也慢慢从 trusty 需要升级到 xenial 16.04 以及 bionic 18.04 后,发现原本一股脑往同一个仓库 里塞的做法往往已经不能满足多版本的需求。尤其是 14.04 仍然在使用 upstart 作为 init 系统,而 16.04 开始换成 systemd ——别说,笔者的看法也发生了改变,虽然在日常使用 Gentoo 系统时坚持 OpenRC ,但随着流行服务器发行版大多采用 systemd 后,必然也要 跟上时代的步伐。
于是本次介绍一下 reprepro 同时用于服务多个版本、仓库的 deb 包时,如何正确配置。
reprepo 用处
按照官方文档的说法, reprepro 是用于管理 deb 格式软件包,生成用于分发的仓库管理工具。
支持 .dsc/.deb/.udeb
等格式;会根据配置生成 Packages/Sources
文件以及压缩版本,
并对 Release
(根据配置还生成 Release.gpg
) 。
简而言之:我们可以用这个工具来建立私有的 deb 仓库,而不需要将包推到操作系统官方仓库才 使用。
文档
老规矩先放出文档,实际上下面在使用过程中提到的问题,大多数在文档里都有提到。 文档并不长,耐心读完可以打消大部分疑虑哦。
不过……有意思的是,reprepro 似乎并没有项目主页。 能找到比较官方的https://salsa.debian.org/brlink/reprepro。
manpage 与 manual 内容是完全不同的,前者只是 reprepro
命令参数的解释,而搭建仓库
的方法以及配置方法则在手册中,http://mirror.physics.ox.ac.uk/ubuntu/oxford-local-testing/reprepro/docs/manual.html。
下面分几个步骤介绍 reprepo 的用法
-
安装
-
配置,包括生成用于签名的 GPG 钥匙,以及选项
-
仓库对外服务需要搭建 web 服务器
-
deb 包的管理操作
安装
在 debian/ubuntu 下比较简单,直接 apt 即可。在 Gentoo 下因为 portage 没有该软件, 故需要自行打包。https://github.com/aleiphoenix/cirno-overlay/tree/master/app-arch/reprepro 。
配置与搭建
准备签名的 GPG 钥匙
当然也可以不签名,不过对于其他系统而言, apt 在更新索引文件以及安装包时会报警比较麻烦。 所以还是生成一个 GPG 钥匙用于签名。
交互式生成,默认选择 RSA/RSA ,长度 2048即可,过期时间根据需要设置
$ gpg --gen-key
生成完毕后,得到钥匙 ID
$ gpg --list-keys
# 得到类似这样的输出
# 这里 pub 对应的 DF65B496 即公钥ID
pub 2048R/DF65B496 2019-09-18
uid aleiphoenix <aleiphoenix@gmail.com>
sub 2048R/961C9AA5 2019-09-18
创建目录与配置文件
首先创建用于存放仓库的目录,假定为 /var/www/html/deb
$ export DEB_PATH=/var/www/html/deb
$ mkdir -p ${DEB_PATH}
$ cd ${DEB_PATH}
$ mkdir -p conf db dists pool
$ touch conf/distributions
$ touch conf/options
-
distributions
文件用于描述不同仓库 -
options
则用于描述仓库本身的选项
distributions 里一节相当于 apt source.list
文件中的 ${suite}
,即一行一个仓库
的 suite
# deb|deb-src [arch=...] ${mirror_url} ${suite} ${components...}
deb http://example.com/ubuntu bionic main multiverse universe
deb http://example.com/ubuntu xenial main multiverse universe
#
deb http://example.com/debian buster main contrib non-free
deb http://example.com/debian stretch main contrib non-free
distributions
支持多个仓库,例如用于不同的操作系统版本
# 这里的信息会在添加deb包进索引时附上
# 例1 例如本仓库包括 ubuntu 18.04 使用的包
Origin: ubuntu
Suite: xenial
Label: ubuntu
Codename: xenial
Architectures: i386 amd64
# components 可以添加多个以空格风格,客户端系统可以根据实际需要添加
# 参考 source.list 里的写法
Components: main multiverse universe
Description: Apt repository for project x
# 使用哪个 gpg 钥匙进行签名,ID获取方法参考上面 GPG 钥匙部分
SignWith: DF65B496
# 例2 例如本仓库包括 ubuntu 18.04 使用的包
Origin: ubuntu
Suite: bionic
Label: ubuntu
Codename: bionic
Architectures: i386 amd64
Components: main multiverse universe
Description: Apt repository for project x
SignWith: DF65B496
# 例3 例如本仓库包括 debian 10 使用的包
Origin: debian
Suite: buster
Label: debian
Codename: buster
Architectures: i386 amd64
Components: main contrib non-free
Description: Apt repository for project x
SignWith: DF65B496
options
verbose
basedir /var/www/html/deb
其他还支持使用 askpass
等工具,在对仓库索引修改时,输入带有密码保护 GPG 钥匙的密码。
有关设置字段
关于 distribution/codename/component/suite
这些术语,debian官方是有解释的。
按照 debian 与 ubuntu 的惯例,一般 codenam 与 suite 一致,都是各个版本的代号。
不过实际上这些都是自有设置的,可以根据实际需求进行修改
导出 GPG 公钥
$ gpg --export --armor ${keyID} > ${DEB_PATH}/gpg-public.key
配置 web 服务器
这里以 Nginx 为例,假设我们希望客户端使用 http://example.com/ubuntu
为根访问
server {
listen 80;
server_name example.com default;
root /var/www/html;
autoindex on;
charset utf-8;
# 对比较敏感的文件进行权限控制
location /ubuntu/conf/ {
deny all;
}
location /ubuntu/db/ {
deny all;
}
location /ubuntu/incoming/ {
deny all;
}
}
deb包的管理
# 嫌传递 -b 参数麻烦的话,可以 cd ${DEB_PATH} 再操作
# 或者 alias reprepro="reprepro -b ${DEB_PATH}"
# 列出某个 suite 下 某个 component 的所有包
$ reprepro -b ${DEB_PATH} list -C ${component} ${suite}
# 删除包
$ reprepro -b ${DEB_PATH} remove -C ${component} ${suite} ${package}
# 添加包
$ reprepro -b ${DEB_PATH} includedeb -C ${component} ${suite} /path/to/deb
使用仓库
先添加 GPG 钥匙
$ curl -s http://example.com/ubuntu/gpg-public.key | apt-key add -
这里主机地址没有限制,只只要客户机能访问得到即可,根据实际 web 服务器配置走即可
如果 web 服务端是 HTTPS 的话,可以先在客户机安装 apt-transport-https
包
# deb|deb-src [arch=...] ${mirror_url} ${suite} ${components...}
deb http://example.com/ubuntu bionic main multiverse universe
deb http://example.com/ubuntu xenial main multiverse universe
#
deb http://example.com/debian buster main contrib non-free
deb http://example.com/debian stretch main contrib non-free
参考资料
\_\_END\_\_