This post is originally published on yoursunny.com blog https://yoursunny.com/t/2021/WiFi-rename/
During an experiment, I need to use three WiFi interfaces on a Raspberry Pi running Ubuntu 20.04.
In addition to Raspberry Pi's internal WiFi interface, I added two USB WiFi adapters.
Three network interfaces showed up in the system (ip link
command), and they are named wlan0, wlan1, and wlan2 by default.
I often need to capture packets with tcpdump
, and I often have to be type these interface names manually.
It isn't easy to remember the purpose of each network interface, so I wanted to rename the interfaces to reflect their role in my application.
However, this isn't as easy as it sounds.
🚫 Netplan
Ubuntu 20.04 configures network interfaces using Netplan, so my first thought was: I can write a Netplan configuration that matches network interfaces with their MAC addresses, and assigns the desired name to each network interface.
The config file would look like this:
network:
version: 2
wifis:
uplink:
optional: true
match:
macaddress: ba:fe:de:f0:b9:e4
set-name: uplink
access-points:
home:
password: rP8jKHJ64
dhcp4: true
dhcp6: true
accept-ra: true
However, this method would not work:
$ sudo netplan apply
ERROR: uplink: networkd backend does not support wifi with match:, only by interface name
🚫 70-persistent-net.rules
Many online guides refer to a file /etc/udev/rules.d/70-persistent-net.rules
, which is processed by udev during boot.
The file should have been created automatically by the system upon discovery of the network interfaces, and I just need to modify the interface names to the desired names.
However, this file does not exist in Ubuntu 20.04, so it's another dead end.
✔️ systemd.link
After carefully reading Debian's NetworkInterfaceNames guide, I found the correct way: systemd.link.
To rename WiFi interfaces, I can create a systemd configuration file for each network interface:
echo '[Match]
MACAddress=ba:fe:de:f0:b9:e4
[Link]
Name=uplink' | sudo tee /etc/systemd/network/10-uplink.link
After rebooting, the network interface is renamed to what I wanted.
Top comments (3)
I tried implementing the systemd.link approach. It did not work for me. I have a raspberry pi 3b+ rev 1.3 with raspberry pi o/s (Debian GNU/Linux 12 (Bookworm)) and a Realtek external wifi. Sometimes the internal is wlan0 and the external is wlan1, other times they are flipped. I need the internal to consistently be wlan1 and the external wlan0. Also, when the external is wlan0 and I put the external in monitor mode, the internal is not connected to my local wifi. I have to manually connect it.
I used ifconfig to determine the mac address of each of the two devices. The first file I created was 10-managed.link for the internal with Name=wlan1 and the second file is 11-monitor.link with Name=wlan0
I did notice that there are two link files: /etc/systemd/network/73-usb-net-by-mac.link -> /dev/null and /etc/systemd/network/99-default.link -> /dev/null. Do I need to do anything with these?
When a systemd unit is symlinked to
/dev/null
, it's impossible to activate them.If your setup works without these units activated, you don't need to edit these symlinks.
I came up with an alternate approach. From within my application, I check the mac address of wlan0 and wlan1 with "ip -brief link show dev [wlan0 | wlan1]" I expect the internal wifi to begin "b8:27:eb" for Broadcom. If I find a match on wlan0, then wlan1 becomes the monitor; otherwise wlan0 is set as the monitor. It may not be foolproof, but it works for automating the configuration of several units so far.