Why is Netplan/Networkd not bringing up a static ethernet interface?
I have a machine running Ubuntu Server 18.04. The network is configured using Netplan, so I have this config in /etc/netplan/01-netcfg.yaml
:
network:
version: 2
renderer: networkd
ethernets:
enp1s0f0:
optional: false
addresses:
- 10.0.0.1/24
wifis:
wlp2s0:
optional: true
dhcp4: yes
access-points:
[...]
enp1s0f0
is connected to a device that may or may not be on (at boot or any other time). I want to run a DHCP server on this interface.
The trouble is, when I boot there's a delay of a few minutes and I see this message:
A start job is running for Wait for Network to be Configured
Eventually it times out, the boot continues, but enp1s0f0
is never configured or brought up. ip link show enp1s0f0
gives:
2: enp1s0f0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether 10:dd:b1:ef:65:21 brd ff:ff:ff:ff:ff:ff
I have no idea what the significance of NO-CARRIER
is, but in case it's relevant, here's the output of sudo lspci -v
:
01:00.0 Ethernet controller: Broadcom Limited NetXtreme BCM57766 Gigabit Ethernet PCIe (rev 01)
Subsystem: Broadcom Limited NetXtreme BCM57766 Gigabit Ethernet PCIe
Flags: bus master, fast devsel, latency 0, IRQ 16
Memory at a0400000 (64-bit, prefetchable) [size=64K]
Memory at a0410000 (64-bit, prefetchable) [size=64K]
Capabilities: [48] Power Management version 3
Capabilities: [50] Vital Product Data
Capabilities: [58] MSI: Enable- Count=1/8 Maskable- 64bit+
Capabilities: [a0] MSI-X: Enable+ Count=6 Masked-
Capabilities: [ac] Express Endpoint, MSI 00
Capabilities: [100] Advanced Error Reporting
Capabilities: [13c] Device Serial Number 00-00-10-dd-b1-ef-65-21
Capabilities: [150] Power Budgeting <?>
Capabilities: [160] Virtual Channel
Capabilities: [1b0] Latency Tolerance Reporting
Kernel driver in use: tg3
Kernel modules: tg3
Now if I turn the attached device on, sure enough enp1s0f0
comes up:
2: enp1s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 10:dd:b1:ef:65:21 brd ff:ff:ff:ff:ff:ff
But it's of no use at this point — the DHCP server won't work, because it couldn't start with enp1s0f0
no up at boot time. I need enp1s0f0
up and configured during boot, which I thought was the whole point of a static IP configuration. Even stranger is that it always has an IPv6 address, even when it's down:
2: enp1s0f0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 10:dd:b1:ef:65:21 brd ff:ff:ff:ff:ff:ff
inet6 fe80::12dd:b1ff:feef:6521/64 scope link
valid_lft forever preferred_lft forever
If I check Netplan's debug output, I see:
$ sudo netplan --debug apply
** (generate:1555): DEBUG: 20:39:27.253: Processing input file //etc/netplan/01-netcfg.yaml..
** (generate:1555): DEBUG: 20:39:27.254: starting new processing pass
** (generate:1555): DEBUG: 20:39:27.254: wlp2s0: adding wifi AP 'Jeff Winger's Wireless Hairbrush'
** (generate:1555): DEBUG: 20:39:27.254: wlp2s0: setting default backend to 1
** (generate:1555): DEBUG: 20:39:27.254: enp1s0f0: setting default backend to 1
** (generate:1555): DEBUG: 20:39:27.254: Generating output files..
** (generate:1555): DEBUG: 20:39:27.254: wlp2s0: Creating wpa_supplicant configuration file run/netplan/wpa-wlp2s0.conf
** (generate:1555): DEBUG: 20:39:27.254: Creating wpa_supplicant service enablement link /run/systemd/system/multi-user.target.wants/[email protected]
** (generate:1555): DEBUG: 20:39:27.254: NetworkManager: definition wlp2s0 is not for us (backend 1)
** (generate:1555): DEBUG: 20:39:27.254: NetworkManager: definition enp1s0f0 is not for us (backend 1)
DEBUG:netplan generated networkd configuration exists, restarting networkd
DEBUG:no netplan generated NM configuration exists
DEBUG:replug enp1s0f0: unbinding 0000:01:00.0 from /sys/bus/pci/drivers/tg3
DEBUG:replug enp1s0f0: rebinding 0000:01:00.0 to /sys/bus/pci/drivers/tg3
DEBUG:device wlp2s0 operstate is up, not replugging
DEBUG:netplan triggering .link rules for wlp2s0
DEBUG:device lo operstate is unknown, not replugging
DEBUG:netplan triggering .link rules for lo
My configuration for isc-dhcp-server
is to have /etc/default/isc-dhcp-server
contain:
INTERFACESv4="enp1s0f0"
...and /etc/dhcp/dhcpd.conf
contain (amongst other things):
subnet 10.0.0.0 netmask 255.255.255.0 {
...
}
In theory, this should serve DHCP over enp1s0f0
. However, since enp1s0f0
is never brought up, the DHCP server fails to start:
No subnet declaration for enp1s0f0 (no IPv4 addresses).
** Ignoring requests on enp1s0f0. If this is not what
you want, please write a subnet declaration
in your dhcpd.conf file for the network segment
to which interface enp1s0f0 is attached. **
Not configured to listen on any interfaces!
This wasn't an issue under ifupdown
(I have no idea why enp1s0f0
doesn't just come up during boot, whether or not anything is at the other end of the cable; I thought that was the whole point of having a static IP). Is it possible to get it working in Netplan? Or is it possible to have the DHCP server start when enp1s0f0
is up?
It looks like you're hitting the bug that will be solved by https://github.com/CanonicalLtd/netplan/pull/34 - currently devices will only be configured if they have a carrier, but that requirement is going away.
In the mean time, you can probably fix this by configuring the device with systemd-networkd
directly. Remove the enp1s0f0
stanza from the netplan config and add something like this (untested) systemd config in /etc/systemd/network/10-enp1s0f0.network
:
[Match]
Name=enp1s0f0
[Link]
RequiredForOnline=no
[Network]
ConfigureWithoutCarrier=true
Address=10.0.0.1/24
The key bit is the ConfigureWithoutCarrier
which I have pulled directly from the pull request.
(You can see what netplan generates and go from there - the file will be in /run/systemd/network
.)
Alternatively, you can make use of the fact that netplan and ifupdown can coexist, apt install ifupdown
and configure enp1s0f0
with ifupdown.
It looks like Netplan has a smart system of figuring out when the iface has a link or not and assign addresses only when the link is up, automatically.
When that interface has no link (carrier signal), it remains unconfigured, however, if I turn on the other device in the other end of the cable, the interface automatically brings itself up with IP address and everything it needs.
For DHCP, a solution would be not to bind it to a specific interface...