On Wed, 23 Sep 2020 at 23:39, Orion Poplawski orion@nwra.com wrote:
On 9/23/20 7:07 AM, Stephen John Smoogen wrote:
On Wed, 23 Sep 2020 at 04:33, Carlos Lopez clopmz@outlook.com wrote:
Hi all,
With SystemD, how can I make certain service dependent on certain
network
interfaces being up?
For example, I have an 802.1ad bond interface I need to wait on for
being
up (this interface has no ip address assigned, it is used to capture networks packets with a tcpdump’s script). Every time this service
fails
because bond interface is not up.
I have configured the service as:
[Unit]
Description=tcpdump capture script
After=network.target
Wants=network-online.target
But it doesn’t work …. Any tip or trick?
So the network just calls the scripts and exits so they can take a
while to
get working. I think this website covers what you want to do
https://unix.stackexchange.com/questions/257888/systemd-wait-for-network-int...
systemctl list-units --no-pager | grep subsystem-net
Then look for the device which matches the one you are listening to.
Change
the After=network.target to
BindsTo=sys-devices-virtual-net-<device>.device After=sys-devices-virtual-net-<device>.device
where <device> is the interface you found (aka eth2, br9, bond0 etc)
Hmm, there seems to be several layers here.
I think sys-devices-<device>.device is "started" when <device> appears in the kernel:
Sep 23 19:37:25 kernel: virtio_net virtio0 ens3: renamed from eth0
# systemctl status sys-subsystem-net-devices-ens3.device ● sys-subsystem-net-devices-ens3.device - Virtio network device Loaded: loaded Active: active (plugged) since Wed 2020-09-23 19:37:25 MDT
This is not what most people would consider "up" - i.e. have an IP address. ens3 doesn't get it's IP address until much later.
Oh good point. I didn't think about that.
This works for Carlos though because he doesn't need an IP address - just the device existing.
It may or may not.. I just realized that the device may need to get recognized by a switch etc which on a bond may take time.
I have no idea how it worked for the stackexchange poster. Apparently because "lan0" is a virtual device as well ("sys-devices-virtual-net-lan0") that they need, not a more "physical" device like "net-devices-ens3", and it gets an IP address at the same time as creation.
I've been dealing with issues like this for a while - systems with multiple interfaces, some of which do not come up for quite a while, and I need to wait for all to be up before running certain tasks. Still haven't found anything very satisfactory.
All good points. Thank you for that douse of reality.
I'm just wondering, is there a chance to make this work reliable without modifying the source code of systemd?
Simon