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

Thu Sep 24 11:41:53 UTC 2020
Simon Matter <simon.matter at invoca.ch>

> On Wed, 23 Sep 2020 at 23:39, Orion Poplawski <orion at 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 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.
>>
>>
>
> 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