Is this proof that systemd is completely broken?

Sam Varshavchik mrsam at courier-mta.com
Sat Jul 12 19:16:41 UTC 2014


Tom H writes:

>
> "NetworkManager-wait-online.service" has:
>
> <begin>
> After=NetworkManager.service
> Wants=network.target
> Before=network.target network-online.target
> </end>
>
> Perhaps you should replicate that in "wait-for-network.service" for it
> to behave as you intend it.
>
> I assume that you can replicate "After=NetworkManager.service" with
> "After=network.service" even though your network's being brought up by
> "/etc/rc.d/init.d/network".

s/even though/because/

Ok, I tried the following variation:

[Unit]
Description=Wait for network ports to be initialized
Before=network.target network-online.target
After=network.service
Wants=network.target

[Service]
Type=oneshot
ExecStart=/root/bin/wait-for-network

[Install]
WantedBy=multi-user.target

With this, the first reboot initialized all servers properly, and the  
console logging during the boot went back to what it was about a month or  
two ago, before everything went off the rails.

> What do you have in "/root/bin/wait-for-network"?

Nothing particularly exciting. I'll attach it below. But whatever it does or  
does not have, it should not affect the order in which systemd starts  
processes. It can't possibly affect the order in which systemd starts  
processes. It has no means of controlling the order; yet, with the previous  
service file, with having just a "Before=network.target", systemd was  
clearly launching a different service that stated "After=network.target",  
before this one finished. Which was broken.

On the last boot, the following script logged that all interfaces were  
already up when it started. Previously, it showed that only lo0 was up, and  
the rest came up after it waited ten seconds. So the difference now is  
clearly because of "After=network.service", but that alone doesn't explain  
it. Even without it, this service doesn't officially start, according to the  
documented specification of a one-shot service, until network.service  
finished bringing up all the interfaces.

So that leaves the addition of "Wants=network.target". It apparently has an  
effect on the ordering of services that get started. Now, you read its  
description, in systemd's documentation and tell me if it says anything  
about controlling the order of services. The plain reading of the  
documentation only suggests that this controls what gets started, and not  
which order anything gets started with.

After grepping around, it became even more obvious how brain-dead systemd  
is. The new service that I added is the only service that specifies  
"Wants=network.target". None of the stock Fedora services – including the  
ones that fail to start properly until the network connections are up –  
specify "Wants=network.target". No Fedora server package, that I have  
installed, specifyis "Wants=network-online.target" either; but I have some  
non-Fedora packages that specify "Wants=network-online.target". And until I  
installed this custom service, nothing else wanted network.target either.

So… Looks like the bug is as follows. The system comes up with systemd  
configured to bring up multi-user.target. But unless something explicitly  
specifies Wants=network.target, systemd is going to completely ignore this  
target, and completely ignore all Before or After network.target  
specification, from any service that it is starting, and ignore any obvious  
dependencies that result from Before or After network.target. All without  
giving any hint as to what it's doing.

As I said: this used to work, at least for me, reliably, until about a month  
or two ago, and I see that there have been a couple of systemd updates  
since. I can almost hear someone already bleating "this is how systemd is  
designed to work, and the problem is with incorrect service files".

Presuming that my guess as to what the bug is, is correct: this is a bunk  
answer. Either this was a major change in systemd's behavior, recently, or  
not. If not: 1) systemd documentation is crap, and this should've been  
documented under in the "Wants" documentation a long time ago, 2) systemd  
just broke everything, without bothering to announce this major change in  
behavior. And this is also crap.

But this should not surprise anyone. Recall, earlier this year, Linus  
calling out systemd's maintainer for pulling the exact same kind of a stunt:  
breaking something, in this case a kernel boot with the "debug" option, and  
then acting as if it's the kernel's problem to solve. Same exact snobbery  
and arrogance.

Well, anyway, here's my script, FWIW, which is really a moot point; since by  
using After=network.service it's not really necessary, any more.

#! /usr/bin/perl

use IO::File;
use strict;
use warnings;

open(LOG, ">/tmp/wait-for-network.log");

sub get_ifconfig {
    my $fh=IO::File->new;

    open($fh, "-|", "/usr/sbin/ifconfig") or exit 0;

    my $up=0;

    print LOG ((scalar localtime) . "\n");
    while (defined ($_=<$fh>))
    {
	chomp;

	next unless /^([^ ]+):/;

	my $ifname=$1;

	my $found=0;

	while (defined ($_=<$fh>))
	{
	    chomp;
	    last unless /^ /;
	    $found=1 if /^ +inet/;
	}

	print LOG "Interface: $ifname is " . ($found ? "up":"down") . "\n";

	return 0 unless $found;  # Some network interface does not have an IP address, yet
	++$up unless $ifname eq "lo";
    }
    return $up;
}

foreach (1..60)
{
    exit 0 if get_ifconfig;
    sleep(5);
}

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.fedoraproject.org/pipermail/users/attachments/20140712/1e812277/attachment.sig>


More information about the users mailing list