[CentOS] Systemd service unit file needs to wait until a specific interface is up

Thu Sep 24 03:39:02 UTC 2020
Orion Poplawski <orion at nwra.com>

On 9/23/20 7:07 AM, Stephen John Smoogen wrote:
> On Wed, 23 Sep 2020 at 04:33, Carlos Lopez <clopmz at 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-interface-to-be-up-before-running-service
> 
> 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.

This works for Carlos though because he doesn't need an IP address - 
just the device existing.

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.

-- 
Orion Poplawski
Manager of NWRA Technical Systems          720-772-5637
NWRA, Boulder/CoRA Office             FAX: 303-415-9702
3380 Mitchell Lane                       orion at nwra.com
Boulder, CO 80301                 https://www.nwra.com/