Theme Preview

Hue:

You are using an outdated browser that does not support OKLCH colors. The color setting will not take effect.

如何搭建私有APT源仓库?

1593 字

一、前言

我们期望使用私有的APT源仓库来发布自定义的一些工具,具体步骤如下:

  1. 制作Deb包
  2. 制作APT源仓库
  3. 配置APT源并使用

接下来就上面的步骤进行介绍。在开始之前我们先来了解一下什么是APT源仓库?

二、APT源仓库

APT(Advanced Package Tool)源仓库是指存储了大量Debian及其衍生发行版(如Ubuntu、Linux Mint等)软件包的地方。这些仓库通常由官方维护,但也可能由第三方提供。APT源仓库的作用是让用户能够方便地通过APT工具(如apt-get、apt-cache等)安装、更新或卸载软件包。Linux系统下通常配置在 /etc/apt/sources.list 文件中。如下所示:

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse

如下对一些常用配置项进行说明:

  1. 类型
  • deb : 用于安装二进制软件包。
  • deb-src : 用于下载源码包。
  1. URI
  1. 分布
  • 指定仓库的发型版本名称,如 focal 对应 Ubuntu 20.04 LTS。
  1. 组件
  • main : 包含自由软件,完全遵循Debian自由软件指导方针(DFSG),并且由Ubuntu官方支持。
  • restricted : 包含非自由的硬件驱动程序,这些软件通常受到版权或其他法律限制,但由Ubuntu官方支持。
  • universe : 包含社区维护的自由软件,但不是由Ubuntu官方支持的。
  • multiverse : 包含非自由的软件,可能不符合DFSG标准,也不由Ubuntu官方支持
  1. 可选配置项
  • trusted : 表示是否信任该仓库,默认为false,表示不信任。
  • arch : 指定要安装的软件包架构

三、制作 Deb 包

我们利用 dpkg 工具将我们的 可执行程序或者 shell 脚本打包成 deb 包。这里以简单的 shell 脚本形式为例,这个脚本的主要功能是用来检测 GGA 语句的时序和查分龄期, 结构如下:

ggacheck
├── DEBIAN
│   └── control
└── usr
└── local
└── bin
└── ggacheck

其中 DEBIAN/control 是用来描述软件包的元数据的文件,其内容如下:

Package: ggacheck
Version: 1.0
Architecture: all
Maintainer: zsk <zhangshaokun12138@163.com>
Depends: bash (>= 4.0)
Installed-Size: 10
Section: base
Priority: optional
Homepage: https://www.zsk-crs.top
Description: A tool to check the consistency and age of GGA statements

而 usr/local/bin/ggacheck 是实际执行的脚本,这个目录表示,用户通过 apt 安装时会将这个脚本安装到 /usr/local/bin 目录下。这里需要特别注意的是: 这里上传的脚本或者可执行程序必须具有执行权限,否则用户下载之后还需要手动设置执行权限。

执行如下指令生成 Deb 包:

dpkg-deb --build ggacheck/ ggacheck_1.0.0_amd64.deb

四、制作 APT 源仓库

这里采用 Nginx 作为我们的 APT 源仓库服务器,以下是我的配置:

# Default server configuration
#
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/hexo;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
location /aptrepo {
alias /var/www/aptrepo/;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
}

server {
root /var/www/hexo;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
location /aptrepo {
alias /var/www/aptrepo/;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/zsk-crs.top/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/zsk-crs.top/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
if ($host = zsk-crs.top) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80 ;
listen [::]:80 ;
server_name zsk-crs.top;
return 404; # managed by Certbot
}

server {
root /var/www/hexo;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
location /aptrepo {
alias /var/www/aptrepo/;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}

listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/zsk-crs.top/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/zsk-crs.top/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
if ($host = www.zsk-crs.top) {
return 301 https://$host$request_uri;
} # managed by Certbot

listen 80 ;
listen [::]:80 ;
server_name www.zsk-crs.top;
return 404; # managed by Certbot
}

只需关注 location /aptrepo 配置即可:

location /aptrepo {
alias /var/www/aptrepo/;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}

这里的 /var/www/aptrepo/ 就是我们存放deb包的目录,我们将之前准备的deb包以如下目录结构存放:

var
├──www
├──aptrepo
├── dists
│   └── focal
│   └── universe
│   └── binary-amd64 //架构目录,存放x86_64的deb包
└── pool
└── universe
└── ggacheck_1.0.0_amd64.deb

使用dpkg-scanpackages 来生成Packages.gz(存放所有包的信息,以便用户获取):

sudo sh -c 'dpkg-scanpackages pool/universe | gzip -9c > dists/focal/universe/binary-amd64/Packages.gz'

这里我们就将我们的软件发布到自己的APT源服务器了,当然这并没有考虑签名等问题,这里只是做简单的演示。接下来就如何使用这个源仓库。

五、使用私有APT源仓库

  1. 添加源仓库

在我们本机的 /etc/apt/sources.list 中添加如下内容:

deb [arch=amd64 trusted=yes] https://www.zsk-crs.top/aptrepo/ focal universe

因为我们并没有启用签名,所以这里需要添加 trusted=yes 选项。而这里也指定使用的架构为 amd64。

  1. 更新源仓库&安装软件
sudo apt update
sudo apt install ggacheck
  1. 验证安装
ggacheck -f gga.log

得到结果如下:

六、其他

  1. 如何管理多个deb包?

上面我们只是在 /var/www/aptrepo 中上传了一个deb包,实际上我们可以上传多个deb包,只需要在 pool/universe 目录下创建不同的目录,之后生成Packages.gz文件即可。

  1. 如何维护多个版本的deb包?

上传软件时可以通过 apt 仓库中 changelog 来管理

//