Home ¦ Archives ¦ Atom

Using systemd-networkd with wpa_supplicant to manage wireless network configuration with roaming

As of version 210, systemd now includes support for basic network configuration through udev and networkd. Systemd-networkd is a system daemon that manages network configuration. It detects and configures network devices as they appear, as well as creates virtual network devices.

There are a lot of tools for managing wireless network (i.e. wifi) configuration for linux: connman, netcfg, netifd, NetworkManager, WICD, wicked, etc…

They sometimes do a worse job than the underlying tools themselves will do when used directly, for example with roaming. Here I'll describe my network setup that uses wpa_supplicant and systemd-networkd and works seamlessly.

Systemd-networkd configuration

Systemd-networkd uses /etc/systemd/network/ for configuration files. It is not intended to configure low-level settings of network interfaces as this remains udev's job.

Any .network file present in /etc/systemd/network/ will apply a network configuration for a matching device. I currently have two files in this directory, eth.network and wlp2s0.network. There structure is pretty self-explanatory:

-- /etc/systemd/network/eth.network

# Will match eth0, eth1, ethX…
# This will start DHCP on each interface whose name starts with eth

-- /etc/systemd/network/wlp2s0.network


Refer to systemd.network (5) for more informations.

wpa_supplicant configuration

Wpa_supplicant will be used for roaming and connection to wireless network. Here is my {basic,classic} configuration:

-- /etc/wpa_supplicant/wpa_supplicant-wlp2s0.conf



I usually add new network to this file using this command: wpa_passphrase <ESSID> <passphrase> >> wpa_supplicant-wlp2s0.conf

By enabling systemd-networkd.service and wpa_supplicant@wlp2s0.service, wpa_supplicant will automatically connect to any network available on the wlp2s0 interface, as configured in the wpa_supplicant-wlp2s0.conf file, bringing up the wlp2s0 interface. Since this interface is matched by the systemd-networkd configuration, the support for dhcpv4 will be enabled and this interface will get an ip. And if one wireless AP suddenly disappears, wpa_supplicant will handle the roaming.

By enabling systemd-resolved.service, systemd will automatically configure /run/systemd/resolve/resolv.conf when using DHCP, instead of your /etc/resolv.conf. As stated in the man page of systemd-resolved, as /run/systemd/resolve/resolv.conf should not be used directly but only through a symlink from /etc/resolv.conf, I made a symlink.

It just works. And since you cannot use Archlinux without systemd nowadays, due to its viral nature, well, I'm using it.


© Rémy G.. Built using Pelican. Theme by Giulio Fidente on github.