我有一个简单的包 (.deb),其主要目标是创建一个 Upstart 作业。将其命名为 Foo。它无法创建作业文件/etc/init/Foo.conf
。
包定义
我已使用 创建了包源dh_make --createorig
并将其添加Foo.upstart
到debian
目录中。我使用 构建包debuild -us -uc
。
安装
sudo dpkg -i Foo_1.0-1_all.deb
当我在一台机器上安装该软件包时,一切顺利,但在另一台机器上安装失败。(已添加 Foo.conf/etc/init
并启动服务)。 也就是说,Foo.conf 没有被添加到/etc/init
。向后兼容的 Foo 脚本(符号链接到upstart-job
)确实已添加到/etc/init.d
,并且 doc 文件已添加到/usr/share/doc/Foo
。但是/etc/init/Foo.conf
缺失了。
编辑
最初我认为问题出在架构上。这只是因为我在 amd64 上安装了可以正常工作的软件,但问题发生在 i386 机器上。我忽略了之前我在 i386 机器上手动安装和卸载过,dpkg 避免了干扰。
答案1
故障排除
当软件包安装失败时,您可以使用 Debug 开关进行故障排除。它需要一个位字段来确定级别和主题。值 D=7777 将显示所有内容。对于这个问题,我们知道我们特别关注 conf 文件,因此我们可以使用 D=220。
sudo dpkg -D=220 -i Foo_1.0-1_all.deb
您的输出可能会显示类似以下内容:
D000200: conffderef in='/etc/init/Foo.conf' current working='/etc/init/Foo.conf'
D000200: conffderef nonexistent
D000020: deferred_configure '/etc/init/Foo.conf' (= '/etc/init/Foo.conf') useredited=1 distedited=0 what=2002
关键线索是useredited=1
默认情况下dpkg
不会替换用户编辑的配置文件。手动删除 .conf 文件视为编辑该文件,因此 dpkg 不会替换丢失的文件可能会让您感到惊讶。对于那些在其他操作系统上安装服务有经验的人来说,Upstart Job 被视为配置可能会更加令人惊讶。
强制安装缺失的 conf
dpkg 有一些强制选项。你可以强制替换丢失的 .conf 文件,如下所示:
sudo dpkg -i --force-confmiss Foo_1.0-1_all.deb
还有其他强制选项可用于类似场景;请查看手册页或使用dpkg --force-help
以获取详细信息。应谨慎使用这些选项,尤其是对于第三方软件包。
封装开发/测试周期
在开发 .deb 包(例如 Upstart 作业)时,您将多次安装和删除该包。有时,您还可能手动调整 .conf 文件。默认情况下dpkg -r
(或apt-get remove
)不会删除 .conf 文件。(令人惊讶的是,upstart 作业仍然存在,而相关的二进制文件可能已经消失。)为此,您必须使用清除选项。因此,要测试完全删除并重新安装 upstart 作业,您可以执行以下操作:
sudo dpkg -i Foo_1.0-1_all.deb
# testing...
sudo apt-get purge Foo
现在您了解了强制和调试选项,您可以根据需要应用它们。
参考
删除文件算作“编辑”它,因为对于许多配置文件来说,文件的缺失是有意义的。