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.