Ubuntu 搭建 APT 仓库
前言
最近公司需要搭建一个 APT 仓库,方便安装内部开发的 Debian 包,然后就研究了一下 APT 仓库的部署。因为我比较懒目前使用的 Debian 包比较少,所以就搭建了一个简单的仓库甚至没有添加校验。简单版的仓库没有对 Debian 包进行分类,不简单版本的仓库可以参考 Debian/Ubuntu 的官方仓库,这里就不说明了,以后可能会更新一篇博客说明吧。
原理
使用 http 服务器对外提供访问的地址和端口,仓库本身的一些 list 文件使用 apt 和 dpkg 的工具生成,校验方面使用 gpg 的密钥。搭建好仓库之后,客户端需要添加信任仓库的公钥,再配上源地址就可以从仓库中下载安装 Debian 包了。下面的例子使用 Apache 搭建 http 服务器,使用 Nginx 也可以。但是我没试过。
APT 仓库搭建
安装 Apache2
1)安装
$ sudo apt install apache2
2)查看 Apache 服务状态
$ systemctl status apache2
默认是安装完自启动的,没有启动的话可以用命令启动:
$ sudo systemctl start apache2
3)修改 Apache 端口号
默认使用的端口是 80 ,我发现好像很多服务端口默认都是 80 的,建议修改成其他,以免冲突。修改前先查一下端口有没有被占用。
例如,查看 8080 端口是否被占用
$ netstat -ap | grep 8080
修改 Apache 端口
把 /etc/apache2/ports.conf 文件 “Listen 80” 的 80 改成你想要的端口。
文件的注释说还要修改 /etc/apache2/sites-enabled/000-default 文件,把这个文件 VirtualHost 语句的 80 也改成你想要的端口。
改完两个文件应该稳了,重启服务
$ sudo systemctl restart apache2
4)测试 Apache
浏览器输入URL:http://[IP]:[PORT]
本机测试 IP 可以填 localhost ,PORT 填刚才修改的端口。
如无意外,你可以看到 Apache 的宣传页面。有意外的话,出门左转百度一下
APT 仓库配置
Apache 服务默认的目录是 “/var/www/html”,要改成其他路径的话,修改 “/etc/apache2/sites-available/000-default.conf” 文件的 “DocumentRoot” 语句,把后面的路径改成你想要的就可以了,改完需要重启服务。
1)创建目录
用于存放你的 Debian 包,在 Apache 的目录下就好
$ sudo mkdir -p /var/www/html/debian/release
把 Debian 包拷贝到这个目录
2)扫描 Debian 包生成 Packages 文件
Packages 文件记录当前目录所有 Debian 包的信息,类似 list 文件。
$ cd /var/www/html/debian/release
$ dpkg-scanpackages -m . > Packages
3)生成 Release 文件
Release 文件包含了 Packages 等文件的大小和校验和(包括MD5/SHA256/SHA512),主要用于客户端校验。新版本的 APT 为了加强安全性,需要仓库生成一个 Release 文件做校验,如果 Release 文件描述和实际读取的不一致,APT 就会拒绝这个仓库,好像在 Ubuntu 16.04 和之后的版本都是这样。
生成 Release 文件
$ cd /var/www/html/debian/release
$ apt-ftparchive release . > Release
密钥
使用 gpg 生成的密钥做签名和校验。
1)生成密钥
安装 gnupg
$ sudo apt install gnupg
生成密钥
$ gpg --gen-key
根据提示完成操作
查看用户密钥
$ gpg --list-keys
2)生成 Release.gpg 文件和 InRelease 文件
Release.gpg 是签名文件,和 Release 一起使用,旧版本 APT 只认这两个文件;
InRelease 是内嵌签名的(可以当做是 Release.gpg 和 Release 的组合),新版本 APT 支持;
生成 Release.gpg
$ cd /var/www/html/debian/release
$ gpg --armor --detach-sign -o Release.gpg Release
生成 InRelease
$ gpg --clearsign -o InRelease Release
3)导出公钥
导出的公钥提供给客户端添加信任,可以把公钥上传到服务器提供下载。
导出公钥
$ cd /var/www/html/debian/release
$ gpg --armor --output lk.asc --export lk@163.com
这里导出公钥的文件名是 lk.asc 可以自定义
邮箱填写你 创建密钥时填写的邮箱
客户端使用
添加软件源
可以把源地址直接添加到 /etc/apt/sources.list 文件,这里新建文件保存。
$ echo “deb http://[IP]:[PORT]/debian/release ./” | sudo tee /etc/apt/sources.list.d/lk.list
PS:
1)/etc/apt/sources.list.d 目录可以存放不同的第三方源,文件后缀是 .list 即可;
2)IP 和 PORT 填写 Apache 服务器的;
3)不需要校验的话,可以添加信任选项,加上 [trusted=yes] 字段,就不用添加公钥了,源地址改为:
deb [trusted=yes] http://[IP]:[PORT]/debian/release ./
添加公钥
1)从 Apache 服务器下载前面生成的公钥文件
$ wget http://[IP]:[PORT]/debian/release/lk.asc
2)添加公钥
$ sudo apt-key add lk.asc
如果不需要了,可以删除公钥,步骤:
查看公钥列表
$ apt-key list
删除公钥
$ sudo apt-key del lk@163.com
邮箱填导出公钥时的邮箱,也可以用公钥的 ID(公钥列表有)
安装 Debian 包
1)更新软件包列表
$ sudo apt update
2)安装
$ sudo apt install xxxx
PS:
如果想对服务器的 Debian 包做简单的分类可以在服务器创建不同的目录,构建多个仓库,然后客户端把对应的源地址添加上就可以了。虽然有点麻烦,但也是不是不能用。如果确实比较详细的分类,可以参考 Ubuntu/Debian 的官方仓库来部署。