Take the 2-minute tour ×

How or where does Linux determine the assignment of a network device? Specifically, wlan0 or wlan1 for wireless USB devices.

I plugged in a TP USB wireless a while ago, and it was assigned wlan0. I removed it. This week I plugged in an Edimax USB wireless device and it comes up as wlan1. I removed it today to try a second Edimax USB wireless device (I bought two) and now it comes up wlan2.

I know enough of Unix/Linux to know this is being configured somewhere, and if I delete the unused config file I can make the latest Edimax become wlan0. But how/where?

share|improve this question
add comment

2 Answers

up vote 5 down vote accepted

Udev is the system component that determines the names of devices under Linux — mostly file names under /dev, but also the names of network interfaces.

Versions of udev from 099 to 196 come with rules to record the names of network interfaces and always use the same number for the same device. These rules are disabled by default starting from udev 174, but may nonetheless be enabled by your distribution (e.g. Ubuntu keeps them). Some distributions provide different rule sets.

The script that records and reserves interface names for future use is /lib/udev/rules.d/75-persistent-net-generator.rules. It writes rules in /etc/udev/rules.d/70-persistent-net.rules. So remove the existing wlan0 and wlan1 entries from your /etc/udev/rules.d/70-persistent-net.rules, and change wlan2 to wlan0. Run udevadm --trigger --attr-match=vendor='Edimax' (or whatever --attr-match parameter you find matches your device) to reapply the rules to the already-plugged-in device.

share|improve this answer
Thanks very much. This is debian on the raspberry pi (raspbian) so the persistent storage is just a bit different. –  Huntrods Apr 25 '13 at 2:09
The file where specific wlan assignments are stored on this (latest, I think) version of raspbian is: /etc/udev/rules.d/70-persistent-net.rules. I found this out using your info above and then typing "man udev" to see why I could not find 'wlan' in the /lib/udev/rules.d directory. –  Huntrods Apr 25 '13 at 2:11
For raspbian, the wlan number is set based on the mac address of the wireless device (in this case, whichever one is plugged into the USB port). It allocates numbers (wlan0, wlan1, etc.) based on the order it first sees a new mac address when it recognizes and configures the wireless device. Editing this file as you suggest allows you to set any device to any wlan# by it's static IP. - thanks. –  Huntrods Apr 25 '13 at 2:13
add comment

This issue has been solved as of systemd v197 with the introduction of persistent naming for network devices.

According to the freedesktop Predictable Network Interface Names page, the kernel simply assigned names based on the order they were probed by the relevant drivers:


If your distro uses systemd, you can either use the predictably assigned but perhaps unwieldy names like wlp0s11 or you can write a udev rule to give them a name you are more comfortable with, like wifi1, based on the mac address...

Include a file in /etc/udev/rules.d/ called 10-network-device.rules:

SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="22:bb:cc:33:44:dd", NAME="wifi1"
share|improve this answer
You're missing a step here. Huntrods evidently doesn't have a post-197 udev with the new naming scheme, and also evidently has a persistent naming scheme. It's this persistent naming scheme that he needs to tweak. –  Gilles Apr 25 '13 at 0:47
What can I say; I took a punt... –  jasonwryan Apr 25 '13 at 2:40
add comment

Your Answer


