搭建自有的Debian软件源并注册软件包,然后从该软件源安装软件包

首先

因为紧急情况需要,我试着建立了自己的Debian软件仓库,所以我整理了建立软件仓库的步骤和从该仓库安装软件包的方法。

背景 – (background)

起源是我在尝试在Debian 11(代号 bullseye)上使用pyspf-milter时遇到了异常终止的错误。为了解决这个问题,需要定制较新的testing/unstable软件包并进行回溯。关于这方面的详细信息已总结在以下文章中。

 

虽然可以直接安装已创建的软件包,但考虑到希望能像通常的软件包一样通过apt install命令进行安装,所以决定自建一个软件仓库来尝试安装。

前提 – 只需要一个选择

Note: The translation provided is in Simplified Chinese.

关于仓库的先决条件

構建存储库的前提条件如下所示。

    1. 仓库是在进行了构建的系统上建立包的地方。

 

    仓库通过使用Web服务器,使得可以通过HTTP进行访问。

如果您拥有先前创建的软件包以及用于对其进行签名的GnuPG密钥,则可以在其他系统上构建该软件包。为了简化问题,我们假设在同一系统上构建该软件包。

关于包装的前提条件

关于包裹的问题,就是要使用在前面的文章中创建的包裹,具体的条件可以列举如下。

    1. 该软件包是在稳定版之后的不稳定版(sid)进行了自定义后,才经过了稳定版(bullseye)的后移处理。

 

    软件包是通过使用debuild进行构建,并使用GnuPG密钥进行签名的。

在以下的说明中,假设包位于~/work/debian/spf-engine/中。

% ls -1F ~/work/debian/spf-engine
postfix-policyd-spf-python_2.9.3-1.1~bpo11+1_all.deb
pyspf-milter_2.9.3-1.1~bpo11+1_all.deb
python3-spf-engine_2.9.3-1.1~bpo11+1_all.deb
spf-engine/
spf-engine_2.9.3-1.1~bpo11+1.debian.tar.xz
spf-engine_2.9.3-1.1~bpo11+1.dsc
spf-engine_2.9.3-1.1~bpo11+1_amd64.build
spf-engine_2.9.3-1.1~bpo11+1_amd64.buildinfo
spf-engine_2.9.3-1.1~bpo11+1_amd64.changes
spf-engine_2.9.3.orig.tar.gz

准备

在构建存储库时,使用reprepro命令。由于存在相同名称的软件包提供。

apt install reprepro

如果您这样做,就可以安装。

建立代码库

创建存储库顶层目录

構築するため、/var/www/debianを使用する必要があります。

mkdir -p /var/www/debian

将其翻译成中文:

为此进行创建。在添加软件包时,使用了用于对软件包进行签名的 GnuPG 密钥,因此需要一个具有 GnuPG 密钥的帐户可读可写该目录。这次将把目录的所有者更改为具有 GnuPG 密钥的帐户。

chown taro /var/www/debian

创建存储库的配置文件

在仓库的顶级目录下创建一个名为”conf”的文件夹,然后在其中创建一个名为”distributions”的文件夹。

cd /var/www/debian
mkdir conf
cd conf
vi distributions

配置文件的内容如下所示。

Codename: bullseye-backports
Architectures: amd64 source
Components: main
Origin: deb.example.org
Label: deb.example.org
Description: Example.org Debian repository
SignWith: 7F4DBC5AFC3010FF

以下是各项目的意思。

代号

 

配布软件包的代码名称列表(必填项)。根据软件包的前提条件,在这种情况下使用的软件包是将unstable版本回溯到stable(bullseye)版本的软件包,因此使用bullseye-backports。

架构
要分发的软件包的架构列表(必填项)。source意味着分发软件包的源代码。

组件
存储库提供的组件列表(必填项)。Debian的官方存储库包括main、contrib、non-free等,但还可以指定任意值。

来源
表示此存储库的分发源的字符串。最好使用分发源的主机名或URL等。在apt的配置文件中,可以使用此处指定的值作为条件进行指定。

标签
针对此存储库的标签。与来源类似,在apt的配置文件中,可以使用此处指定的值作为条件进行指定。

描述
此存储库的描述。

SignWith
用于对软件包进行签名的GnuPG密钥的密钥标识值。可以使用`gpg –list-keys –keyid-format long`命令查看密钥标识值。

添加包
执行以下命令将软件包添加到存储库中。
cd /var/www/debian
reprepro include bullseye-backports ~/work/debian/spf-engine/spf-engine_2.9.3-1.1\~bpo11
+1_amd64.changes

由于需要使用用于签名的GnuPG密钥来添加软件包,因此必须使用拥有密钥的帐户来执行此命令。
添加软件包成功后,可以使用`reprepro list`命令列出已添加到存储库中的软件包。
% cd /var/www/debian
% reprepro list bullseye-backports
bullseye-backports|main|amd64: postfix-policyd-spf-python 2.9.3-1.1~bpo11+1
bullseye-backports|main|amd64: pyspf-milter 2.9.3-1.1~bpo11+1
bullseye-backports|main|amd64: python3-spf-engine 2.9.3-1.1~bpo11+1
bullseye-backports|main|source: spf-engine 2.9.3-1.1~bpo11+1
%

公钥分发
由于在该存储库中分发的软件包已使用GnuPG密钥进行签名,因此从该存储库安装软件包的用户需要验证签名,并需要使用用于签名的GnuPG密钥的公钥。使用以下命令提取公钥:
gpg –export –armor –output “输出文件路径” “要提取的公钥的密钥标识”

本示例中使用的GnuPG密钥如下:
% gpg –list-keys –keyid-format long taro@example.org
pub rsa3072/7F4DBC5AFC3010FF 2022-11-16 [SC] [expires: 2024-11-15]
F954C7608427047664E784FC7F4DBC5AFC3010FF
uid [ultimate] Taro Yamada <taro@example.org>
sub rsa3072/49AB5A578599DCA8 2022-11-16 [E] [expires: 2024-11-15]

%

因此,执行以下命令:
gpg –export –armor –output /var/www/debian/gpg.key.asc 7F4DBC5AFC3010FF

这将在存储库的顶层目录下创建名为gpg.key.asc的公钥文件。

使用Web服务器发布存储库
使用Web服务器通过网络访问已构建的存储库。本例中的设置如下:

使用apache2软件包作为Web服务器。
将存储库的顶层目录设置为http://deb.example.org/,使其可访问。
在这里我们只写下了配置处理使存储库的顶层目录http://deb.example.org/可访问的VirtualHost的配置,省略了Apache的基本配置。
创建一个名为/etc/apache2/sites-available/deb.example.org.conf的文件,内容如下:

ServerName deb.example.org
DocumentRoot /var/www/debian/
<Directory “/var/www/debian”>
Options FollowSymLinks Indexes
Require all granted

<Directory “/var/www/debian/conf”>
Require all denied

<Directory “/var/www/debian/db”>
Require all denied

<Directory “/var/www/debian/incoming”>
Require all denied

主要设置是指定了DocumentRoot并拒绝了对存储库子目录conf、db和incoming的访问。创建配置文件后,执行以下命令将存储库的顶层目录设置为http://deb.example.org/可访问:
a2ensite deb.example.org
systemctl reload apache2.service

bannerAds