如何在网络启动之前启动systemd服务?


11

我正在尝试建立一个新服务(在Debian Jessie下),该服务需要设置一些用于存储网络配置的安装架,因此该服务必须在启动network.service之前完成

我尝试了以下方法:

[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
#Before=network-pre.target
Before=networking.service

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=networking.service

使用“ systemd-analyze plot我”可以看到我的服务已启动,但networking.service大约提前了3秒:

在此处输入图片说明

显然我的配置有误,但是我很难找到问题所在。任何帮助都将不胜感激。

更新资料

我目前通过更改服务配置local-fs.target而不是之前开始解决了它networking.service

[Unit]
DefaultDependencies=no
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
Before=local-fs.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=local-fs.target

还是,我想了解为什么我的第一个配置无法按预期工作...?


由于systemd的工作方式,事物运行的字面时间顺序可能并不重要。建立网络时,是否成功按照该目录中的文件进行操作?
汤姆·亨特

我不确定我是否理解您的问题。无论如何,/etc/network/interfaces都有对ip-up驻留在另一个分区中的脚本的引用。该分区是由一个复杂的脚本安装/opt/intermodul-mounts/start.sh的是必须被设置网络之前运行。当前,这些ip-up脚本实际上无法启动,因为它们在启动时无法访问。service networking restart随后运行,将正确调出所有接口。
Udo G 2015年

Answers:


8

network-pre.target是可用于在配置任何网络接口之前订购服务的目标。它的主要目的是与要在任何网络接口启动之前建立防火墙的防火墙服务一起使用。它是一个被动单元:您不能直接启动它,它不是由网络管理服务引入的,而是由要在其之前运行的服务引入的。

network-pre.target如果要在网络启动前进行设置,请使用

想要在配置网络之前运行的服务应放置Before = network-pre.target并设置Wants = network-pre.target以将其插入。

您应该将它们放在以下[Unit]部分中:

Before=network-pre.target
Wants=network-pre.target

参考


1
嗨,@ edwardtorvalds,我正在为某些网络配置设置进行此操作,但是该设备似乎永远无法运行。答案systemctl is-enabled <unit>永远是static。当然,我无法启用它,因为没有WantedBy=。毕竟,它想要什么?在加载网络之前,需要进行一些设置。
deitch

您可以尝试通过= remote-fs.target或mount-fs.target来尝试。
爱德华·托瓦尔兹

2
谢谢。我最终做了Before=network-pre.targetWants=network-pre.target[Install]我们做了WantedBy=network.target。最后一部分强制要求网络进行连接,前一部分则将其整理好。不过很痛苦
Deitch

因为您肯定比systemd更好,所以您可以看看我的另一个q吗?unix.stackexchange.com/questions/277783/…仍在尝试找出方法。
deitch

我很困惑,因为我没有加密分区的经验,如果您可以简单地请我这样做
Edward Torvalds

3

就像在Debian Jessie中所做的那样,netfilter-persistent包(允许在网络启动之前加载iptables规则)的netfilter-persistent.service如下所示:

# https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
# based on the netfilter-persistent package
[Unit]
Description=netfilter persistent configuration
DefaultDependencies=no

Before=network-pre.target
Wants=network-pre.target

Wants=systemd-modules-load.service local-fs.target
After=systemd-modules-load.service local-fs.target

Conflicts=shutdown.target
Before=shutdown.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/netfilter-persistent start
ExecStop=/usr/sbin/netfilter-persistent stop

[Install]
WantedBy=multi-user.target

为什么与之冲突shutdown.target?!
亚历克西斯威尔克

1

错误很简单,我经常混淆的主要问题之一:您将Before和混合在一起RequiredBy。那并不在一起。其他人对目标是正确的。


0
[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=basic.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
WantedBy=basic.target

沿着这些路线进行操作将确保该设备在网络运行之前运行,但在大多数其他重要设置发生之后运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.