在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=1export 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总和,看看维护者的版本是否有变化。
如果你不修改原始配置文件(作为系统用户),维护者的新版本将被安装。
如果两者都修改了他们的文件,那么就会提示你做出选择。
参考文献
- 鏂囩歞ean manpage (包括debhelper命令的列表dh_xx)
- 拉斐尔-赫尔佐格关于锥体的信息
- https://www.debian.org/doc/manuals/maint-guide/dother.en.html
- https://www.debian.org/doc/manuals/packaging-tutorial/packaging-tutorial.en.pdf
- https://vincent.bernat.ch/en/blog/2019-pragmatic-debian-packaging
- https://manpages.debian.org/buster/debhelper/dh_installdeb.1.en.html
对于dh_virtualenv。