Do You Know the New Names for Linux Network Interfaces?

Do you know how to check the IP address of a Linux server?

“Of course!”, you say, and you type this:

$ ifconfig eth0

Not anymore! Both the command ifconfig and the interface name eth0 have been obsolete for a few years now.

However, many organizations still use something like Red Hat Enterprise Linux 6, where the old commands and interface names work.

Red Hat officially released RHEL 7 in June 2014, and RHEL 8 in June 2019. Organizations are finally moving to more recent releases of Red Hat and its derivatives like CentOS and Oracle Linux. It’s time to learn the new names and commands.

This week I’ll explain the interface names, including why the change is helpful. Next week I’ll explain the new commands.

PCI slot Ethernet card

What was wrong with eth0, eth1, and so on?

If you have multiple Ethernet interfaces on current hardware, you can’t predict the order in which the system detects them. This includes wired Ethernet devices eth[0-9]* and wireless interfaces wlan[0-9]*.

Some time ago I wrote about systemd, a new master process to control the system state and all services on Linux. Its philosophy is to start everything simultaneously, letting services work out their order dependencies by communicating over sockets. That gets the system up and running quickly, but we can’t predict the precise order of events.

Time to upgrade!

BIOS firmware was replaced by UEFI (or Unified Extensible Firmware Interface) several years ago. Unless you are using a very old motherboard, you should have what’s needed. Use the dmidecode or biosdecode command and look for SMBIOS version 2.6 or later.

You will also need systemd/udev version 197 or later, they came out a number of years ago.

Yes, if you want the old unpredictable names you can pass biosdevname=0 or net.ifnames=0 to the kernel at boot time. But why?

Stability through hardware addresses

Learning Tree’s Linux server administration course describes SysFS. It appears as a file system hierarchy below /sys, but that’s a human-friendly representation of kernel data structures. This includes the hardware details of detected interfaces including Ethernet, SATA, SCSI, and more.

The kernel detects device hardware locations in terms of PCI bus number, slot number, and device number. That will not change unless you unplug it and move it to a different expansion slot. The new names are based on these physical parameters, and so they do not change from one boot session to the next.

What are these names?

Example names

en01, en02, … andem1, em2, …

Firmware-numbered interfaces embedded on the motherboard.

ens1, ens2, …

Firmware-numbered PCIe hotplug interfaces.


At PCI bus address 02:00.0.


A card plugged into PCIe slot #7.

When I first looked into this, I was frustrated as I could never predict a network device name in advance.

Would the embedded interface be en01 or em1?

Would a card plugged into a slot be enp2s0 or p2p1?

Then I realized that I don’t care!

I can’t see any benefit of predicting a device name in advance. Shut the system down, plug in the new card, and start it up. Then list the network devices:

$ ls /sys/class/net

Those names will always be the same until you move an expansion card.

If you want to dig deeper, try these commands on your system:

$ ls -l /sys/class/net
[... see the links to physical addresses ...]
$ dmesg | egrep --color -C 2 'eth[0-9]|e[nm][0-9]|p[0-9][ps][0-9]|wlan|wl[0-9]|wlp[0-9]'
[... see the kernel discovering devices and
     the udev daemon assigning consistent names ...]

Getting away from the overly generic names like eth0 brings Linux more in line with other UNIX family operating systems. I’m writing this on an OpenBSD system, where the Ethernet interface is re0 as it was detected by the re Realtek kernel module. Replace it with an Intel-based device, and it’s ie0. Does anyone else remember hearing of “Happy Meal Ethernet” on UltraSPARC platforms? That name comes from the days of the hme kernel module in Solaris discovering and naming interface hme0.

Using the names

This is really no big deal. Configuration on Red Hat or a similar system goes in a file named ifcfg-name in the directory /etc/sysconfig/network-scripts/, the same as always.

The software loopback device is still lo, and everything else is a wired or wireless network connection.

And those commands…

Come back next week to learn how the ip command now does almost everything. We can no longer trust our old friends ifconfig, arp, route, and netstat.

Interface name changes are no big deal. But command syntax and semantics — that’s huge!

Master Linux with the right training

View Linux Training Courses

Type to search

Do you mean "" ?

Sorry, no results were found for your query.

Please check your spelling and try your search again.