我想知道如何用我自己的版本替换某个包中的服务单元文件。也就是说,我在该服务单元文件中发现了一些问题并已更正它们。但是,随着该软件包的下一次更新,我的更改将丢失。
我知道我可以修改原始包、使用固定等。但在这种情况下,这似乎过于复杂,我真的很想以正常的方式获取相应软件包的更新。这只是我想保留在更正版本中的服务单元文件。
我想到了以下解决方案:
- 将 /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/
您的更改所在的目录。它有点古怪而且很容易被错过,所以它可能会在未来咬住你。
您不能以这种方式替换内容,只能添加一些新内容,因为覆盖已合并到单元中。 (不过不确定,我上次使用这个是不久前的事了。)