如何用自定义版本正确替换包的服务单元文件?

如何用自定义版本正确替换包的服务单元文件?

我想知道如何用我自己的版本替换某个包中的服务单元文件。也就是说,我在该服务单元文件中发现了一些问题并已更正它们。但是,随着该软件包的下一次更新,我的更改将丢失。

我知道我可以修改原始包、使用固定等。但在这种情况下,这似乎过于复杂,我真的很想以正常的方式获取相应软件包的更新。这只是我想保留在更正版本中的服务单元文件。

我想到了以下解决方案:

  • 将 /lib/systemd/system/daemon.service 复制到 /etc/systemd/system/my-daemon.service
  • 禁用和面具daemon.service 以便 systemd 不再启动它,并且包更新希望不会重新启用它
  • 在 my-daemon.service 中进行适当的更正
  • 启用 my-daemon.service

这是一个合理的方法吗?这个问题有“官方”解决方案吗?

答案1

默认情况下,systemd 将使用来自/usr/lib/systemd/system/daemon.service.但是,如果它在 中找到服务单位/etc/systemd/system/daemon.service,它会自动使用该单位并忽略默认单位。

所以基本上

cp /usr/lib/systemd/system/daemon.service /etc/systemd/system/daemon.service

并在文件中进行您需要的任何更改/etc/systemd/system/daemon.service

替代方法:

如果您不喜欢这个或只需要一些小的编辑,您可以systemctl edit daemon.service在那里运行并进行更改。这些变化得到合并systemd 将尝试运行的服务单元,无论该单元是否位于/usr/lib/...或下/etc/...

优点:

如果包提供的单位文件得到更新,这些更改将自动与您的调整合并。

缺点:

如果包提供的单位文件得到更新,这些更改将自动与您的调整合并。 (别开玩笑。有时候,你真的不想要这样。)

它很丑陋 - systemd 创建/etc/systemd/system/daemon.overrides.d/您的更改所在的目录。它有点古怪而且很容易被错过,所以它可能会在未来咬住你。

您不能以这种方式替换内容,只能添加一些新内容,因为覆盖已合并到单元中。 (不过不确定,我上次使用这个是不久前的事了。)

相关内容