定制现有的 Debian 软件包
首先因为迫不得已,我尝试定制了一个现有的Debian软件包,所以我总结了这个过程的步骤。
背景在Debian 11(代号为bullseye)中尝试使用pyspf-milter时出现的。Bullseye版本的pyspf-milter是2.9.2,但是这个版本在启动时会出现运行时错误并异常退出的错误。这个问题已经在Debian的错误跟踪系统(BTS)中报告,并且该软件包的维护者在那里
-
この問題はtesting(とunstable)では修正済
-
- この問題はtesting(とunstable)では修正済
- stableでも修正する予定である
在撰写本文时,stable版本尚未修复。
另外,如果在配置文件中指定特定选项的话,会出现错误并异常终止的bug。这个bug在最新的上游版本2.9.3中也存在,在上游的bug追踪系统中已经报告了这个问题,并附带了修复此问题的补丁,但目前还没有进行修复。
为了避免这两个问题,在这种情况下,我们可以在bullseye上采取措施。
-
- 获取修复了前一个问题的testing/unstable源代码包
-
- 在获取的源代码上添加修复了后一个问题的补丁
-
- 从修改后的源代码中创建适用于bullseye的包
- 安装并使用创建的包
以下是需要的步骤:在本文中,将解释如何创建第三个软件包。在以下说明中,我们将假设所有步骤都在amd64的bullseye环境下进行。
准备要自己创建Debian软件包,需要进行以下三个准备工作。
-
パッケージの作成に必要なDebianパッケージのインストール
- パッケージの作成に必要なDebianパッケージのインストール
-
- 作成したパッケージに署名するために用いるGnuPGの鍵の作成
- 環境設定
我們將按照以下的順序進行說明。
安装Debian软件包以创建打包所需的软件包创建包需要安装以下四个包。
-
build-essential
- build-essential
-
- devscripts
-
- git
- wget
构建必备不仅限于Debian软件包,通常构建软件需要使用编译器、库、工具等多种工具。所需工具因所构建的软件而异,但是几乎每个Debian软件包的构建都需要安装build-essential软件包,该软件包包含了在创建Debian软件包时需要安装的工具。Debian软件包的源代码中有一个文件,记录了应该安装的软件包列表,而对于包含在build-essential中的软件包,可以假设已经被安装,不必在此文件中另外记录。因此,在创建Debian软件包之前,必须确保安装了该软件包。
开发脚本就像名字所示,这个软件包中包含了一些方便进行Debian软件包开发的工具(不仅可以自定义现有软件包,还可以创建全新的软件包)。
Git: 使用 Git要构建现有的Debian软件包,需要获取该软件包的源代码。如果只是简单地进行构建,则可以直接在/etc/apt/sources.list文件中。
deb-src http://deb.debian.org/debian/ bullseye main non-free contrib
Git: 使用 Git要构建现有的Debian软件包,需要获取该软件包的源代码。如果只是简单地进行构建,则可以直接在/etc/apt/sources.list文件中。
deb-src http://deb.debian.org/debian/ bullseye main non-free contrib
deb-src http://deb.debian.org/debian/ bullseye main non-free contrib
在添加类似的行之后
apt source (パッケージ名)
如果执行此命令,将会在当前目录下下载所有必要的源代码。然而,这次我们需要修改源代码,并且希望保存这些修改内容,因此决定使用git从Debian软件包的源代码仓库中获取源代码。
使用wget可以使用它来获取软件原始源代码的存档文件。如果可以下载文件,也可以使用其他工具如curl或Web浏览器。
生成 GnuPG 的密钥我会创建一个GnuPG密钥来对包进行签名。虽然如果直接使用dpkg命令安装已创建的包,则不一定需要签名,但这次我希望通过apt install从存储库安装已创建的包,出于安全考虑,我决定对包进行签名。
鉴于签名需要使用GnuPG,因此需要GnuPG密钥。如果已经拥有自己的密钥,也可以使用该密钥,但如果没有,可以执行以下命令进行创建。
gpg --generate-key
执行该程序时会要求输入姓名和电子邮件地址。在后续的说明中,我们假设姓名为Taro Yamada,电子邮件地址为taro@example.org。当输入姓名和电子邮件地址后,会要求确认。之后完成输入密钥密码,密钥将会生成。
环境设置进行必要的环境设置以使用用于创建软件包的工具。
环境变量我在登录shell中使用zsh,所以我将电子邮件地址设置为环境变量DEBEMAIL,将全名设置为DEBFULLNAME,并在~/.zshenv中添加以下行。
export DEBEMAIL="taro@example.org"
export DEBFULLNAME="Taro Yamada"
export DEBEMAIL="taro@example.org"
export DEBFULLNAME="Taro Yamada"
如果您正在使用其他Shell,请根据该Shell进行相应的设置。
开发脚本你可以在~/.devscripts中进行devscripts相关的设置。创建一个包含以下3行内容的~/.devscripts文件。
DEBUILD_DPKG_BUILDPACKAGE_OPTS="-i -I -sa"
DEBUILD_LINTIAN_OPTS="-i -I --show-overrides"
DEBSIGN_KEYID="(署名に用いるGnuPGの鍵のIDの値)"
DEBUILD_DPKG_BUILDPACKAGE_OPTS="-i -I -sa"
DEBUILD_LINTIAN_OPTS="-i -I --show-overrides"
DEBSIGN_KEYID="(署名に用いるGnuPGの鍵のIDの値)"
您可以通过运行命令”gpg –list-keys –keyid-format long”来确认用于签名的GnuPG密钥的ID值。例如,假设输出如下所示:
ppub 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]
在这种情况下,第一行的7F4DBC5AFC3010FF是表示密钥ID的值,因此需要指定它。
圈地。在提交信息中设置用于邮件地址和全名的电子邮件地址和全名。
git config --global user.name "Taro Yamada"
git config --global user.email taro@example.com
获取和确认源代码
获取源代码
按照之前在准备阶段所说明的,这次我们将使用Git从pyspf-milter源包中的spf-engine存储库获取源代码。请移动到工作目录,并执行以下命令。
git clone https://salsa.debian.org/python-team/packages/spf-engine.git
git config --global user.name "Taro Yamada"
git config --global user.email taro@example.com
获取源代码
按照之前在准备阶段所说明的,这次我们将使用Git从pyspf-milter源包中的spf-engine存储库获取源代码。请移动到工作目录,并执行以下命令。
git clone https://salsa.debian.org/python-team/packages/spf-engine.git
git clone https://salsa.debian.org/python-team/packages/spf-engine.git
当执行完成后,源代码将被下载到当前目录的spf-engine文件夹中。源代码将使用默认分支debian/master检索最新提交,但此提交已经比testing/unstable的pyspf-milter包的最新版本2.9.3-1更新。因此,我们将基于2.9.3-1创建一个新的分支,并在以后的工作中使用该分支。
cd spf-engine
git switch -c custom debian/2.9.3-1
需要构建软件包时,需要包含 SPF 引擎的原始源代码的存档文件,因此请下载该文件。
wget https://deb.debian.org/debian/pool/main/s/spf-engine/spf-engine_2.9.3.orig.tar.gz
最后,工作目录中的文件结构如下。
% ls -F
spf-engine/ spf-engine_2.9.3.orig.tar.gz
%
这样获取源代码就完成了。
确认是否能够编译源代码这次获取的是用于构建当前测试和不稳定版本2.9.3的源代码,但一般来说,无法保证测试或不稳定版本的源代码可以在稳定环境下成功构建。因此,首先要进行确认。执行以下命令来构建源代码。
cd spf-engine
debuild
cd spf-engine
debuild
第一次运行时,通常会出现一个错误消息,显示缺少构建所需的包,导致构建失败。根据构建环境的不同,所需安装的包也会有所不同,但是错误消息会显示缺少的包,只需要安装它们然后再次运行命令,就可以顺利完成构建了。由于已确认源代码可以在稳定环境下构建,所以将源代码目录恢复到原始状态。
rm -rf *.deb spf-engine_2.9.3-1*
cd spf-engine
git clean -dfx
git restore .
包裝的個性化定制
补丁的添加根据背景说明,pyspf-milter稳定版本(2.9.2-1)有两个已知的错误,其中一个已经在testing/unstable版本(2.9.3-1)中修复,但另一个还未修复。因此,我们添加了修复后者的补丁。正如之前在背景中解释的那样,关于此问题的上游错误跟踪系统已附带了修复问题的补丁,但无法直接应用于Debian的spf-engine源码,所以我们根据原始补丁创建了以下补丁。
diff --git a/spf_engine/policydspfsupp.py b/spf_engine/policydspfsupp.py
index 8ba8e6c..4ebca3f 100644
--- a/spf_engine/policydspfsupp.py
+++ b/spf_engine/policydspfsupp.py
@@ -153,9 +153,9 @@ def _readConfigFile(path, configData = None, configGlobal = {}):
'Socket': str,
'PidFile': str,
'UserID': str,
- 'UMask': 'int',
+ 'UMask': int,
'InternalHosts': str,
- 'IntHosts': 'bool',
+ 'IntHosts': bool,
'MacroListVerify': str,
}
diff --git a/spf_engine/policydspfsupp.py b/spf_engine/policydspfsupp.py
index 8ba8e6c..4ebca3f 100644
--- a/spf_engine/policydspfsupp.py
+++ b/spf_engine/policydspfsupp.py
@@ -153,9 +153,9 @@ def _readConfigFile(path, configData = None, configGlobal = {}):
'Socket': str,
'PidFile': str,
'UserID': str,
- 'UMask': 'int',
+ 'UMask': int,
'InternalHosts': str,
- 'IntHosts': 'bool',
+ 'IntHosts': bool,
'MacroListVerify': str,
}
将其放置在spf-engine/debian/patches下,并命名为0901-fix-runtime-error.patch。
在构建软件包时应用的补丁列表被记录在spf-engine/debian/patches/series文件中。目前,该文件的内容如下所示。
0001-install-conf-fix.patch
因为是这样的,所以请在此处添加所需的补丁文件名。
0001-install-conf-fix.patch
0901-fix-runtime-error.patch
我会添加类似的东西。
更新变更记录我将更新spf-engine/debian/changelog文件,该文件用于管理Debian软件包的变更历史。我将使用专用命令dch进行更新。由于我不是spf-engine软件包的维护者,因此此次更新将属于非维护者上传(NMU)类别。因此,我将在changelog文件中添加相应的信息。
cd spf-engine
dch --nmu
cd spf-engine
dch --nmu
移至spf-engine目录后,运行dch命令并指定–nmu选项。这将启动编辑器并在文件的开头添加以下行。
spf-engine (2.9.3-2.1) UNRELEASED; urgency=medium
* Non-maintainer upload.
*
-- Taro Yamada <taro@example.org> Thu, 17 Nov 2022 15:13:59 +0900
你可以像下面这样来结束编辑器。
spf-engine (2.9.3-2.1) UNRELEASED; urgency=medium
* Non-maintainer upload.
* Add patch to fix runtime error of pyspf-milter.
-- Taro Yamada <taro@example.org> Thu, 17 Nov 2022 15:13:59 +0900
构建软件包和确认建筑物时一样
cd spf-engine
debuild
cd spf-engine
debuild
假设构建成功,将会生成一个定制化的软件包在工作目录中。
% ls -1F
pyspf-milter_2.9.3-1.1_all.deb
python3-spf-engine_2.9.3-1.1_all.deb
spf-engine/
spf-engine_2.9.3-1.1.debian.tar.xz
spf-engine_2.9.3-1.1.dsc
spf-engine_2.9.3-1.1_amd64.build
spf-engine_2.9.3-1.1_amd64.buildinfo
spf-engine_2.9.3-1.1_amd64.changes
spf-engine_2.9.3.orig.tar.gz
%
保存修改内容鉴于已确认修改的正确运行,将提交修改内容。
cd spf-engine
git add debian/changelog debian/patches/0901-fix-runtime-error.patch debian/patches/series
git commit
软件包的回溯
为了明确移植testing/unstable版本到stable的过程,并确保使用创建的软件包没有问题,我们会进行回溯处理。在确认源代码可以在stable进行构建并清理操作目录之后,我们会执行以下命令。
cd spf-engine
dch --bpo
cd spf-engine
git add debian/changelog debian/patches/0901-fix-runtime-error.patch debian/patches/series
git commit
为了明确移植testing/unstable版本到stable的过程,并确保使用创建的软件包没有问题,我们会进行回溯处理。在确认源代码可以在stable进行构建并清理操作目录之后,我们会执行以下命令。
cd spf-engine
dch --bpo
然后编辑器启动并在文件开头添加以下行。
spf-engine (2.9.3-1.1~bpo11+1) bullseye-backports; urgency=medium
* Rebuild for bullseye-backports.
*
-- Taro Yamada <taro@example.org> Thu, 17 Nov 2022 16:35:19 +0900
这次只是简单地重新构建,所以将按照以下方式进行编辑。
spf-engine (2.9.3-1.1~bpo11+1) bullseye-backports; urgency=medium
* Rebuild for bullseye-backports.
-- Taro Yamada <taro@example.org> Thu, 17 Nov 2022 16:35:19 +0900
关闭编辑器,然后重新执行debuild以构建软件包。构建完成后,将在工作目录下生成已反向移植的软件包。
% ls -1F
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
由于生成的包文件是2.9.3-1.1~bpo11+1版本,因此可以知道这是一个经过了回溯端口处理的版本。
由于成功地回溯了变更,我将更新的内容提交。
cd spf-engine
git add git add debian/changelog
git commit
总结我整理了有关如何定制现有的Debian软件包的方法。希望对即将尝试相同操作的人们有所帮助。
参考资料
-
Debian 维护者指南
-
- Debian 维护者指南
-
- Debian 包装教程
- 第150届东京地区 Debian 学习会资料