systemd $HOME 环境变量与预期不同

Ale*_*lex 5 root environment-variables systemd home

我有一个以 root 身份运行的服务:

[Unit]
Description=my service
After=docker.service network-online.target
Requires=docker.service network-online.target

[Service]
TimeoutStartSec=0
RestartSec=60
Restart=always
User=root
Group=root

ExecStart=/usr/bin/myservice

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

我遇到了一些意想不到的行为:

当我查看导致失败的环境变量时,环境变量$HOME被设置为。/rootmyservice

但是,作为 root 用户,我得到:

$ echo $HOME
/home/root
Run Code Online (Sandbox Code Playgroud)

这与我所看到的一致/etc/passwd

root:x:0:0:root:/home/root:/bin/sh
Run Code Online (Sandbox Code Playgroud)

当我myservice手动运行时,它会获取正确的$HOME环境变量并且可以工作。

我愿意$HOME成为/home/root,但不是/root。所以...

  1. 从哪里systemd获取/root,为什么会$HOME被覆盖?
  2. systemd除了$HOME在服务文件中显式设置环境变量之外,如何防止在全局范围内执行此操作?<-- 在查看源代码后,这似乎不会产生影响

Ale*_*lex 5

检查源代码后,我发现systemd实际上homeroot用户硬编码了目录。我没有找到任何可以更改此设置的配置文档,因此对于使用默认主目录的 Yocto 项目来说,需要注意这一点。

我通过修改https://github.com/systemd/systemd/blob/main/src/basic/user-util.c中的硬编码/root值来确认这一点,并观察到修改后的值正在使用正确的变量生成服务。/home/rootsystemd$HOME

到目前为止,符号链接/root/home/root一个很好的解决方法。为了与 Linux 世界的其他部分保持一致,将默认值切换ROOT_HOME/root可能不是一个坏主意。