我可以使用符号链接作为 systemd 的服务吗?

我可以使用符号链接作为 systemd 的服务吗?

例如,我有一个在目录mysshd.service下命名的服务/usr/lib/systemd/system/。我可以创建一个符号链接,例如:

ln -s /usr/lib/systemd/system/mysshd.service /usr/lib/systemd/system/fool.service

这样我对fooll.service所做的任何操作都会反映到mysshd.service( systemctl enable/disable start/stop fool.servce)?

我的目的是通过我自己的 sshd 服务的符号链接覆盖本机 sshd 服务。

答案1

link与绝对路径一起使用:

systemctl link /home/nick/myservice.service

请注意,您无法链接到本身已经是链接的文件。

答案2

据我所知,systemd 不能很好地处理这个问题。据我了解,您想覆盖 的行为sshd.service,对吧?

幸运的是,systemd 就是为这种事情而设计的。只需将您的服务定义放入 中/etc/systemd/system/ssh.service,执行systemctl daemon-reload以重新加载单元文件,systemd 将自动使用该配置而不是系统ssh.service

也想有systemctl enable mysshd.service工作吗?没问题。在[Install]单元文件的部分中,添加一行Alias=mysshd.service.然后执行systemctl reenable ssh.service让 systemd 修复单元符号链接,你就成功了。

现在,您还没有详细说明mysshd.service应该做什么。如果它与正常的完全不同ssh.service,那就太好了!使用上面的方法。但是,如果您只想改变一件小事,那么您就使用了错误的方法。 systemd 允许您创建单元文件的“片段”,并将其应用到普通单元文件之上。这允许您添加或覆盖单个指令,同时允许单元文件的其余部分接收来自包管理器的更新。为此,只需创建/etc/systemd/system/ssh.d/my-custom-config.conf(您可以更改my-custom-config.conf为您想要的任何内容,也可以有多个覆盖文件)。在该文件中,放置您想要更改或添加到常用ssh.service.您甚至可以添加Alias=指令,这样就systemctl start mysshd.service可以了!只需记住systemctl daemon-reload在完成后执行(并且,如果您使用Alias=, systemctl reenable ssh.service)。

顺便说一句,从来没有,曾经/usr/lib/systemd更改 中的systemd 单元文件曾经!文件系统层次结构标准需要/usr视为只读。实际上,这意味着包管理器处理/usr(除了/usr/local),并且您不会触及包管理器处理的内容 - 特别是因为您所做的任何更改最终都可能被覆盖。相反,将你的东西放在类似的地方/etc

答案3

符号链接以前不可能。但他们从今天开始就是这样。

答案4

其他人已经回答了这个问题,但是没有人指出您无法创建指向用户主目录中的单元的符号链接。他们必须生活在它之外。即使它由 root 拥有,配置为 644 权限,它也不会工作。必须在 /home 之外。

@evandrix 指出您可以使用 --user 标志。这个过程比这更复杂。 “--user”只能应用于在用户目录中启用的 systemd 单元。这允许用户在 --system 域之外控制自己的服务。请注意,只有特定版本的 systemd(我忘记了除了 2.37 及更高版本之外哪些版本对我有用)使用 --user 域。我建议阅读这篇文章:

https://nts.strzibny.name/systemd-user-services/

此外,这个拱门页面也提供了很好的信息:

https://wiki.archlinux.org/title/systemd/User

快速分解如何做到这一点:

  1. 用户帐户必须有密码。如果帐户没有密码,这将不起作用
  2. 您应该ps -aux | grep systemd看到特定用户的“/usr/lib/systemd/systemd --user”。该服务在用户第一次登录时由 pam.d 启动
  3. /home/YourUserName/.config/systemd/user/ 目录是否存在?如果是这样,请将您的单元文件放在那里。如果它没有创建它,请将您的单位放在那里。
  4. 将您的设备移至上述目录后注销并重新登录。
  5. 执行这些命令
$ systemctl --user enable myuser.service
$ systemctl --user daemon-reload

现在您可以以用户身份运行所有 systemctl 命令,但需要包含 --user 标志。

$ systemctl --user status myuser.service
$ systemctl --user start myuser.service
$ systemctl --user restart myuser.service
$ systemctl --user stop myuser.service

请注意,您设备的[服务]部分中的“用户”和“组”设置需要进行适当设置。另外,当使用 --user 时,不要使用systemctl link myuser.service它不会起作用,因为它只在系统域中起作用。用户的符号链接是在运行时构建的systemctl --user enable myuser.service,并链接到/home/YourUserName/.config/systemd/user/multi-user.target.wants/

相关内容