如何覆盖 systemd 单元文件设置?

fdm*_*ion 33 systemd

我已经在我的 Arch Linux 服务器上安装了 MySQL。我将数据目录移动到 /home 下的一个位置,我的 RAID 卷安装在该位置。我注意到默认情况下 mysqld 不会在此配置中启动,因为 systemd 单元包含设置ProtectHome=true

我要重写只是此设置。我不想重新指定ExecStart或类似的命令,以防它们在软件包升级时发生变化。

我尝试在/etc/systemd/system调用时创建一个简单的文件mysqld.service并只添加了以下几行:

[Service]
ProtectHome=false
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它看起来像是 /etc 中的服务替换而不是覆盖系统服务。

有没有办法在不直接修改 /usr/lib/systemd/system 中的文件的情况下以这种方式覆盖 systemd 单元文件中的设置?(这是我现在所做的临时修复,尽管如果更新包最终会恢复)

use*_*ser 57

systemctl edit将创建一个插入文件,您可以其中覆盖大部分设置,但这些文件有一些值得一提的细节:

请注意,对于插入文件,如果想要从解析为列表(并且不是依赖项)的设置中删除条目,例如AssertPathExists=(或例如ExecStart=在服务单元中),则需要先清除列表,然后再重新- 添加除要删除的条目之外的所有条目。

#/etc/systemd/system/httpd.service.d/local.conf
[Unit]
AssertPathExists=
AssertPathExists=/srv/www
Run Code Online (Sandbox Code Playgroud)

依赖项(After=等)无法重置为空列表,因此依赖项只能添加到插件中。如果要删除依赖项,则必须覆盖整个单元。

要覆盖整个单元,请使用systemctl edit --full/etc如果还没有,这将创建一个副本并让您编辑它。

另请参阅Systemd 删除覆盖

  • +1 有关清除 `ExecStart` 的提示 (8认同)
  • @AndreasT:这是帖子中链接的文档的直接引用(“[drop-in](https://www.freedesktop.org/software/systemd/man/systemd.unit.html) file”)。或者我误解了你的问题? (2认同)

jdw*_*olf 25

您可以使用覆盖 systemd 单元文件

systemctl edit mysqld.service
Run Code Online (Sandbox Code Playgroud)

覆盖文件中的任何语句都将具有优先权。

  • @Hvisage如果以非交互方式编写覆盖文件,您可能随后需要运行`sudo systemctl daemon-reload`。 (3认同)