我想在 Linux 主机上为所有用户移动 systemd 用户单元目录。
本机用户单元目录位于
${HOME}/.config/systemd/user
由于各种原因,systemd 无法访问这些单元。因此,用户无法使用这些systemd --user
单元来启用任何用户特定或系统范围的单元。
原则上,Systemd 范围内的用户单元可以由管理员在 下部署/etc/systemd/user
,并由用户启动。但是,启用用户单元时,Systemd 会尝试在 下创建指向该单元的符号链接${HOME}/.config/systemd/user
,但此操作会失败,因为 Systemd 无法访问该用户目录。
因此,我想配置 systemd 将用户基础目录更改为除 之外的其他目录${HOME}/.config/systemd/user
,即将其更改为 systemd 和用户均可平等访问的路径。
我认为问题在于 systemd 在
${HOME}/.config/systemd/user
启用单元时坚持创建符号链接,如果该目录不可访问(NFS 主页/限制权限等常见),那么您就陷入困境。您可以通过创建插入式配置来覆盖 systemd 查找用户单元的位置:
然后创建一个文件
/etc/systemd/system.conf.d/user-units-path.conf
:会
%U
被用户名替换。我选择这个/var/lib/systemd/users/
位置是因为它是一个合理的位置,不会与其他内容冲突,但你也可以选择其他位置。创建此文件后,重新加载 systemd:
然后为每个用户创建必要的目录并设置权限:
现在您的用户可以启用并启动单元
systemctl --user enable whatever.service
,它将在新位置创建符号链接,而不是无法访问~/.config/systemd/user
。我已经运行这个设置几个月了,没有任何问题。希望这能帮到你!
这条路确实如此
$XDG_CONFIG_HOME/systemd/user
。但是,
systemd --user
它是在单独的“服务”环境中运行的(这也可能是它无法在您的奇怪设置中访问用户 HOME 的原因?),因此必须在该服务的环境中设置 XDG_CONFIG_HOME -[email protected]
- 而不仅仅是在用户的“shell”环境中。换句话说,~/.profile 或 ~/.bashrc 不行。你必须在那里设置 XDG_CONFIG_HOME。
systemctl edit [email protected]
请记住,这也会影响所有通过“systemd --user”运行的用户程序,也就是说,它们的配置目录也会移动到新的位置。您或许可以通过
DefaultEnvironment=
或ManagerEnvironment=
在 systemd-user.conf(5) 中撤消此操作。我想问一下为什么,因为 systemd 默认是系统级的,而且使用符号链接。因为
/etc/systemd/
乱动它可能会损坏你的操作系统,所以我建议假设它是一个较新的内核版本,如下所示:如果需要,请仅更改用户级别的符号链接,保留系统范围的默认设置。我个人建议跳过此步骤,直接跳到下面的第 2 步进行系统范围的更改。如果是基于用户的,则可能不建议这样做。
sudo systemctl edit mydaemond
用户使用 systemd 覆盖过程,而不是通过覆盖功能对 systemd 配置文件进行直接文件操作,例如更改、添加等。为了演示编辑过程,在单元文件的 VI 控制台中,用户使用链接键 likeWantedBy=
并添加以下一行WantedBy=multi-user.target
。这将使用覆盖文件来实现更改。使用覆盖文件重新加载守护进程sudo systemctl daemon-reload
(使用覆盖文件重新加载守护进程的单元文件)。然后用 检查
sudo systemctl status mydaemond
。