Why is my ethernet interface called enp0s10 instead of eth0?

When I run ifconfig -a, I only get lo and enp0s10 interfaces, not the classical eth0

What does enp0s10 mean? Why is there no eth0?

Asked By: Nico Rodsevich

||

That’s a change in how now udevd assigns names to ethernet devices. Now your devices use the “Predictable Interface Names”, which are based on (and quoting the sources):

  1. Names incorporating Firmware/BIOS provided index numbers for on-board devices (example: eno1)
  2. Names incorporating Firmware/BIOS provided PCI Express hotplug slot index numbers (example: ens1)
  3. Names incorporating physical/geographical location of the connector of the hardware (example: enp2s0)
  4. Names incorporating the interfaces’s MAC address (example: enx78e7d1ea46da)
  5. Classic, unpredictable kernel-native ethX naming (example: eth0)

The why’s this changed is documented in the systemd freedesktop.org page, along with the method to disable this:

ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules

or if you use older versions:

ln -s /dev/null /etc/udev/rules.d/80-net-name-slot.rules
Answered By: Braiam

Answer on "What does enp0s10 means?" question:

enp0s10:
| | |
v | |
en| |   --> ethernet
  v |
  p0|   --> bus number (0)
    v
    s10 --> slot number (10)

Source: udev-builtin-net_id.c on GitHub

Answered By: DIG mbl

As mentioned above, enp0s10 refers to ethernet (en), prefix 0 (p0), slot 10 (s10).

The bus number, device number, and function number are pulled from the Bus Device Function (BDF) notation for PCI devices to create the prefix, slot, and function portions of the Predictable Network Interface Name (PNIN).

If the function is 0, the f0 portion is sometimes omitted. I changed the prefix from p0 to p4, and the function from f0 to f1, for clarity in this example. BDF uses hex values which get converted to decimal values in the PNIN.

Expanding on the answer posted by DIG mbl:

enp4s10f1                        pci 0000:04:0a.1
| | |  |                                |  |  | |
| | |  |                   domain <- 0000  |  | |
| | |  |                                   |  | |
en| |  |  --> ethernet                     |  | |
  | |  |                                   |  | |
  p4|  |  --> prefix/bus number (4)   <-- 04  | |
    |  |                                      | |
    s10|  --> slot/device number (10) <--    10 |
       |                                        |
       f1 --> function number (1)     <--       1

https://wiki.xen.org/wiki/Bus:Device.Function_(BDF)_Notation
https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames

I came across a device with a u7 at the end, for USB port. Some of the different label possibilities are included in this documentation on predictable network interface device names.

A second example for the case where the PCI domain is something other than 0 (P stands for PCI geographical location):

P1enp4s10f1                        pci 0001:04:0a.1
| | | |  |                                |  |  | |
P1| | |  |  --> PCI geo loc/domain <-- 0001  |  | |
  | | |  |                                   |  | |
  en| |  |  --> ethernet                     |  | |
    | |  |                                   |  | |
    p4|  |  --> prefix/bus number (4)   <-- 04  | |
      |  |                                      | |
      s10|  --> slot/device number (10) <--    10 |
         |                                        |
         f1 --> function number (1)     <--       1
Answered By: mhck

You can use

net.ifnames=0

in kernel command line arguments and your interface name will be called eth0 again.

Answered By: Yonatan Amir

To quote the full text on disabling linked by @Braiam:

I don’t like this, how do I disable this?

You basically have three options:

  1. You disable the assignment of fixed names, so that the unpredictable kernel names are used again. For this, simply mask
    udev’s .link file for the default policy: ln -s /dev/null /etc/systemd/network/99-default.link
  2. You create your own manual naming scheme, for example by naming your interfaces "internet0", "dmz0" or "lan0". For that create your
    own .link files in /etc/systemd/network/, that choose an explicit
    name or a better naming scheme for one, some, or all of your
    interfaces. See systemd.link(5) for more information.
  3. You pass the net.ifnames=0 on the kernel command line

TL;DR: it has been renamed to 99-default.link

Answered By: serv-inc
Categories: Answers Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.