搭建自有的Debian软件源并注册软件包,然后从该软件源安装软件包
首先
因为紧急情况需要,我试着建立了自己的Debian软件仓库,所以我整理了建立软件仓库的步骤和从该仓库安装软件包的方法。
背景 – (background)
起源是我在尝试在Debian 11(代号 bullseye)上使用pyspf-milter时遇到了异常终止的错误。为了解决这个问题,需要定制较新的testing/unstable软件包并进行回溯。关于这方面的详细信息已总结在以下文章中。
虽然可以直接安装已创建的软件包,但考虑到希望能像通常的软件包一样通过apt install命令进行安装,所以决定自建一个软件仓库来尝试安装。
前提 – 只需要一个选择
Note: The translation provided is in Simplified Chinese.
关于仓库的先决条件
構建存储库的前提条件如下所示。
-
- 仓库是在进行了构建的系统上建立包的地方。
- 仓库通过使用Web服务器,使得可以通过HTTP进行访问。
如果您拥有先前创建的软件包以及用于对其进行签名的GnuPG密钥,则可以在其他系统上构建该软件包。为了简化问题,我们假设在同一系统上构建该软件包。
关于包装的前提条件
关于包裹的问题,就是要使用在前面的文章中创建的包裹,具体的条件可以列举如下。
-
- 该软件包是在稳定版之后的不稳定版(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