在Debian软件包的/etc中创建配置文件

我目前正在开发一个更新的picockpit-client版本,它应该在/etc/picockpit-client中为各个模块(PiDoctor & PiControl)添加额外的配置文件。

picockpit-client是一个用于picockpit.com的Raspbian软件包,将网络平台与你的个人Raspberry Pi联系起来。

由于Raspbian是基于Debian的,以下信息对Debian和衍生产品(例如Ubuntu)的一般包装是正确的。

dh-virtualenv

我强烈推荐我的 其他关于 Debian 包装的文章 作为介绍和补充材料,如果你对打包Python应用程序感兴趣的话。

在这篇文章中,我将讨论与打包有关的一般概念,特别是在/etc/Library中安装文件。

前面有一个说明。构建软件包的 "入口 "是makefile文件 debian/rules.

而你可以使用以下命令来构建软件包。

dpkg-buildpackage -uc -us -b

这个命令是在你的软件包的顶部目录下运行,而不是在debian/目录下。

基本概述

形象

你可以看到一个Debian软件包所需的文件夹结构(包含在picockpit-client-package文件夹中)。

最重要的是,它包含一个文件夹 debian,其中包含用于构建软件包的几个配置文件。

这个文件布局被用来构建软件包,使用 鏂囩歞ean,大多数软件包都使用它,因为它能自动完成许多任务。

更新日志

这个文件包含更新日志信息(针对debian软件包)。它是用来设置软件包的版本的。

例子内容。

形象

请注意,必须用空格缩进(*符号前有两个空格,-符号前有一个空格)。

在我的例子中,最新的软件包版本(顶部的条目)是0.18.5

兼容性

这个文件包含一个数字,后面是一个换行。

形象

这个版本是 鏂囩歞ean 你的应用程序与之兼容。(从第12版开始,这也可以在debian/control中指定,但为了向后兼容,debian/compat中仍将支持--见此 手册)

控制

形象

这个文件用于提供依赖关系、软件包名称和其他相关的软件包元数据。

版权

形象

这个文件提供了你的软件包的版权信息。

.安装

形象

在我的例子中,该文件被称为picockpit-client.install,因为我的软件包是picockpit-client软件包。

这个文件是由 dh_install (这是 debhelper 的一部分)。它复制一个文件或几个文件到软件包的一个目录中(以后会被安装到这个绝对的系统位置)。

在这种情况下,我希望文件 etc/dinosaur/dinosaur.cfg 要安装在/etc/dinosaur中,作为/etc/dinosaur/dinosaur.cfg。

我在研究这个问题时遇到了一个问题,就是要了解,相对于picockpit-client.install,etc/dinosaur/dinosaur.cfg应该放在哪里。

重要的是,要知道 在哪些搜索地点 dh_install会寻找这些文件。

这里是答案。

默认情况下,它在". "和 "debian/tmp "中查找。

". "是debian文件夹所在的目录。

因此,要观察文件夹结构。

形象

所以,正如你所看到的,"etc "与 "debian "处于同一文件夹级别。请注意,我可以任意命名,因为我在picockpit-client.install中指定了这个位置。

etc/dinosaur/dinosaur.cfg etc/dinosaur

我可以把这个修改为简单的dinosaur.cfg,那么dinosaur.cfg就必须和debian文件夹在同一个父目录下。

关于进入/etc的文件的特殊作用的更多信息,以及一个重要的dh_install调试提示,请见下文。

.链接

这将设置符号链接,例如,为了将你的应用程序添加到寻找二进制文件的系统路径中。

形象

.postinst

一个在安装后运行的脚本。set -e在这个脚本中很重要,它也必须返回0来表示成功(这样软件包的安装才能最终完成)。

我有一个模板的默认值。

形象

.服务

这是一个需要为你的应用程序添加的systemd服务条目。例如,我有

形象

.触发器

我不完全确定这是干什么用的;对我来说,它看起来是这样的(而且可以工作)。

形象

规则

规则是一个用于构建软件包的makefile。这将有所不同,取决于你构建的是什么样的软件包。我在这里复制我的规则文件以方便你。

正如你所看到的,它使用了 dh_virtualenv,这是一个为Python代码创建虚拟环境的解决方案(使不兼容的软件包能够在同一个系统上共存,并且你能够控制你部署的环境)。

如果你对dh_virtualenv感兴趣,请阅读我的文章,关于 如何用dh_virtualenv为Raspbian打包Python软件包.

#!/usr/bin/make -f
#
# 使用以下方法构建Debian软件包 https://github.com/spotify/dh-virtualenv
#
# 下面的目标通过以下方式创建一个干净的工作目录副本
#使用 "sdist",否则 "pip "在安装时就会出错。
# sourcedir ".",因为这包括debian构建阶段。
#,而当符号链接被跟踪时,就会出现递归爆炸。
#
# 它还确保你的MANIFEST是完整的,至少涵盖了
#发布构建所需的所有文件。

# 增加跟踪记录,参见 debhelper(7) (取消注释即可启用)
#dh_verbose=1

export DH_VIRTUALENV_INSTALL_ROOT=/usr/share
SNAKE=/usr/bin/python3
EXTRA_REQUIREMENTS=-预安装 "setuptools>=17.1,=7" -预安装 "wheel" -预安装 "no-manylinux1"
DH_VENV_ARGS=-with python-virtualenv -setuptools -python $(SNAKE) $(EXTRA_REQUIREMENTS) #-v
PACKAGE=$(shell dh_listpackages)
VERSION=$(shell $(SNAKE) setup.py -version)
SDIST_DIR=debian/$(PACKAGE)-$(VERSION)。

洁净。
     测试 !-d dist || rm -rf dist
     测试!-d $(SDIST_DIR) || rm -rf $(SDIST_DIR)
     dh $@ $(DH_VENV_ARGS)

build-arch。
     $(SNAKE) setup.py sdist -formats tar
     mkdir -p $(SDIST_DIR)
     tar -x -C $(SDIST_DIR) -strip-components=1 -exclude '*. egg-info' -f dist/*.tar
     #dh $@ $(DH_VENV_ARGS) -sourcedir $(SDIST_DIR) -sourcedir .
     dh $@ $(DH_VENV_ARGS) -sourcedir .

%:
     #dh $@ $(DH_VENV_ARGS) -sourcedir $(SDIST_DIR) -sourcedir .
     dh $@ $(DH_VENV_ARGS) -sourcedir .

请注意,WordPress往往会弄乱代码的语法,所以只能把这个作为一个粗略的指南,而不是复制和粘贴

关于/etc和dh_install的更多信息

重要的附注/错误修正

我花了很多时间来调试以下问题。

dh_install:无法找到(任何匹配的)"etc/dinosaur/dinosaur.cfg"(在debian/picockpit-client-0.18.5, debian/tmp中尝试)。

dh_install: picockpit-client缺少文件: etc/dinosaur/dinosaur.cfg
dh_install: 缺少文件,中止运行

这个问题与 "错误 "条目有关,在 debian/rules

形象

正如你在这里看到的,在这个(对初学者来说)相当难懂和神秘的语法中,一个叫做-sourcedir的参数被设置在build-arch和%条目的dh命令中。

形象

dh_install 文档,我们可以读到,这个参数配置了安装时应该在哪个源目录下搜索文件。

形象

由于这已经在我的 debian/rules dh_install在debian/picockpit-client-0.18.5和debian/tmp中寻找,但在顶层目录中没有。

解决办法很简单。

形象

dh $@ $(DH_VENV_ARGS) -sourcedir .

我只是将". "作为目录名传递给-sourcedir

请注意,传递两个sourcedir条目将不会像预期的那样工作。

形象

在这种情况下,第一个条目将被覆盖。

形象

所以只有". "会被检查,而$(SDIST_DIR)中传递的目录不会被检查。

等是特殊的

dh_install把要安装在etc中的文件当作所谓的 文件.

这是自动确定的,你不需要为此添加任何额外的配置(只需在你的.install文件中添加配置文件作为一行)。

再说一遍:如果你使用debhelper进行打包,你会做 不是 需要创建 文件 debian目录下的文件。 debhelper会帮你做。

dpkg管理这些配置文件,并确保用户的配置在软件包更新之间和简单的软件包删除时被保存。

阅读这篇精彩的概述,关于 拉斐尔-赫佐格的《锥形瓶对用户意味着什么》。.

假设我已经安装了我的软件包(有一个虚构的/etc/dinosaur/dinosaur.cfg)。

然后我在/etc/dinosaur/dinosaur.cfg中增加了一个条目 "新恐龙冒险"。

形象

如果我只是简单地删除包。

apt-get remove picockpit-client

然后,软件包将被删除,但配置文件将被保留下来。

形象

为了把修改过的配置文件也处理掉,我们需要清除这个包。

apt-get purge picockpit-client

形象

它将通知你它正在做什么。"清理picockpit-client(0.18.5)的配置文件..."

注意:如果你删除了软件包,你不需要修改配置文件,它就会留下来。未经修改的文件也会被保留下来。

好吧,现在我们假设你已经修改了文件,并准备升级或重新安装软件包。

形象

在这种情况下,你修改过的版本会保留(或者会有提示)。

形象

配置文件的版本,以及你的修改是基于哪个版本,都源于MD5和。

你可以通过以下方式检查这些md5sums。

dpkg -status picockpit-client

形象

你可以看到,在Conffiles部分,文件/etc/dinosaur/dinosaur.cfg显示了它的原始MD5和。

dpkg可以比较软件包升级后的MD5总和,看看维护者的版本是否有变化。

如果你不修改原始配置文件(作为系统用户),维护者的新版本将被安装。

如果两者都修改了他们的文件,那么就会提示你做出选择。

参考文献

对于dh_virtualenv。