Thanks Andrew, Felix, Jeremy, Anssi, Curt, Tomas and Greg for your suggestions and comments.
I followed several of them by trimming my network/interfaces file to nothing and then slowly adding stuff back. The blank file and the one with only the loopback worked: networking.services reported successful completion, and everything mentioned in interfaces was configured. However, adding the ethlan stanza and auto declaration failed. Removing the 2 dns-* lines allowed it to complete successfully. This is consistent with the fact that the hangup seemed to be on /etc/network/if.up/000resolvconf which acts on the dns-* lines. However, I still can't see why it should have hung up. Adding in ethworld with an auto again produces a failure and doing ifdown --force ethworld; ifup -v ethworld did not entirely fix it: the result of the second command was #,,,,, /sbin/ip link set dev ethworld up /sbin/ip route add default via 66.181.128.1 dev ethworld onlink RTNETLINK answers: File exists ifup: failed to bring up ethworld and I was never able to get DNS and routing in a functional state (likely the routing was the key to the problem since the default route was to ethlan, leaving no way to reach external DNS). Note that the ethworld stanza also includes dns-* directives; I guess these account for the hangup in ethworld, but I haven't tested that theory. I removed the auto for ethworld and networking.service was able to complete without error. Once I manually brought up ethworld, networking seemed to be OK. I added the following 2 scripts to help trace what was going on; they show that in addition to the interface-specific events the scripts are also called once with special, generic values (e.g., IFACE=--all), explaining why the scripts seemed to be called too many times. These were in /etc/network/if-pre-up.d/ and /etc/network/if-up.d/: ------------------- 000debug---------------------- #! /bin/sh # scrap to trace activity LFILE=/root/000debug.log echo "----------------------------------------------------" >> $LFILE echo "$0 $$">> $LFILE echo "$*" >> $LFILE date >> $LFILE printenv >> $LFILE echo "----------------------------------------------------" >> $LFILE --------------------- zzzdebug---------------------------------------- #! /bin/sh # scrap to trace activity LFILE=/root/000debug.log echo "Finishing $0 $$">> $LFILE date >> $LFILE echo "----------------------------------------------------" >> $LFILE ------------------------ end------------------------------------------ On the whole ifupdown, systemd, NetworkManager question, I'm trying to stick with ifupdown for several reasons 1. It's what I'm already using. 2. NetworkManager's intended use, as I understand it, is for a roaming laptop, not a box that is the main server and router on a home network. I'm not saying it can't fit my needs, just that I would anticipate getting it to do so might be difficult (as @Jeremy reports). 3. The parts of systemd I know are complex, and I'm frankly annoyed by its apparent desire to take over my whole computer. 4. Some of the components I use for bridging work specifically with the /etc/network/interfaces file. I'll admit that ifup/down is not so easy either! @Jeremy NetworkManager was already disabled. I wasn't aware of masking; at your suggestion I masked it too. The fact that I still had problems almost certainly means they are not NetworkManager's fault. @Ansi: I think I have wpa_supplicant as a result of a generic desktop install; I do also have a wireless card in the machine, though I've never used it and I don't think it works.