例如,我有一个在目录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
快速分解如何做到这一点:
- 用户帐户必须有密码。如果帐户没有密码,这将不起作用
- 您应该
ps -aux | grep systemd
看到特定用户的“/usr/lib/systemd/systemd --user”。该服务在用户第一次登录时由 pam.d 启动 - /home/YourUserName/.config/systemd/user/ 目录是否存在?如果是这样,请将您的单元文件放在那里。如果它没有创建它,请将您的单位放在那里。
- 将您的设备移至上述目录后注销并重新登录。
- 执行这些命令
$ 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/