我正在尝试设置一个新服务(在 Debian Jessie 下),它需要设置一些存储网络配置的挂载,因此该服务必须完全的在 Networking.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
不过,我想了解为什么我的第一个配置没有按预期工作......?
答案1
network-pre.target 是可用于在配置任何网络接口之前订购服务的目标。它的主要目的是与想要在任何网络接口启动之前建立防火墙的防火墙服务一起使用。它是一个被动单元:您无法直接启动它,并且它不是由网络管理服务拉入,而是由想要在其之前运行的服务拉入。
network-pre.target
如果您想在网络启动之前进行某些设置,则需要使用
想要在配置网络之前运行的服务应该放置 Before=network-pre.target 并设置 Wants=network-pre.target 将其拉入。
您应该将这些放在以下[Unit]
部分下:
Before=network-pre.target
Wants=network-pre.target
答案2
正如 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
答案3
这个错误很简单,也是我经常混淆的主要事情之一:你混合了Before
和RequiredBy
。那不符合。其他人关于目标的看法是正确的。
答案4
[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
沿着这些思路做一些事情将确保该单元在网络之前运行,但在大多数其他重要设置发生之后。