Chapter 1. Implementing consistent network interface naming
The udev
device manager implements consistent device naming in Red Hat Enterprise Linux. The device manager supports different naming schemes and, by default, assigns fixed names based on firmware, topology, and location information.
Without consistent device naming, the Linux kernel assigns names to network interfaces by combining a fixed prefix and an index. The index increases as the kernel initializes the network devices. For example, eth0
represents the first Ethernet device being probed on start-up. If you add another network interface controller to the system, the assignment of the kernel device names is no longer fixed because, after a reboot, the devices can initialize in a different order. In that case, the kernel can name the devices differently.
To solve this problem, udev
assigns consistent device names. This has the following advantages:
- Device names are stable across reboots.
- Device names stay fixed even if you add or remove hardware.
- Defective hardware can be seamlessly replaced.
- The network naming is stateless and does not require explicit configuration files.
Generally, Red Hat does not support systems where consistent device naming is disabled. For exceptions, see the Is it safe to set net.ifnames=0 solution.
1.1. How the udev device manager renames network interfaces
To implement a consistent naming scheme for network interfaces, the udev
device manager processes the following rule files in the listed order:
Optional:
/usr/lib/udev/rules.d/60-net.rules
The
/usr/lib/udev/rules.d/60-net.rules
file defines that the deprecated/usr/lib/udev/rename_device
helper utility searches for theHWADDR
parameter in/etc/sysconfig/network-scripts/ifcfg-*
files. If the value set in the variable matches the MAC address of an interface, the helper utility renames the interface to the name set in theDEVICE
parameter of theifcfg
file.If the system uses only NetworkManager connection profiles in keyfile format,
udev
skips this step.Only on Dell systems:
/usr/lib/udev/rules.d/71-biosdevname.rules
This file exists only if the
biosdevname
package is installed, and the rules file defines that thebiosdevname
utility renames the interface according to its naming policy, if it was not renamed in the previous step.NoteInstall and use
biosdevname
only on Dell systems./usr/lib/udev/rules.d/75-net-description.rules
This file defines how
udev
examines the network interface and sets the properties inudev
-internal variables. These variables are then processed in the next step by the/usr/lib/udev/rules.d/80-net-setup-link.rules
file. Some of the properties can be undefined./usr/lib/udev/rules.d/80-net-setup-link.rules
This file calls the
net_setup_link
builtin of theudev
service, andudev
renames the interface based on the order of the policies in theNamePolicy
parameter in the/usr/lib/systemd/network/99-default.link
file. For further details, see Network interface naming policies.If none of the policies applies,
udev
does not rename the interface.
Additional resources
- Why are systemd network interface names different between major RHEL versions (Red Hat Knowledgebase)
1.2. Network interface naming policies
By default, the udev
device manager uses the /usr/lib/systemd/network/99-default.link
file to determine which device naming policies to apply when it renames interfaces. The NamePolicy
parameter in this file defines which policies udev
uses and in which order:
NamePolicy=kernel database onboard slot path
The following table describes the different actions of udev
based on which policy matches first as specified by the NamePolicy
parameter:
Policy | Description | Example name |
---|---|---|
kernel |
If the kernel indicates that a device name is predictable, |
|
database |
This policy assigns names based on mappings in the |
|
onboard | Device names incorporate firmware or BIOS-provided index numbers for onboard devices. |
|
slot | Device names incorporate firmware or BIOS-provided PCI Express (PCIe) hot-plug slot-index numbers. |
|
path | Device names incorporate the physical location of the connector of the hardware. |
|
mac | Device names incorporate the MAC address. By default, Red Hat Enterprise Linux does not use this policy, but administrators can enable it. |
|
Additional resources
- How the udev device manager renames network interfaces
-
systemd.link(5)
man page on your system
1.3. Network interface naming schemes
The udev
device manager uses certain stable interface attributes that device drivers provide to generate consistent device names.
If a new udev
version changes how the service creates names for certain interfaces, Red Hat adds a new scheme version and documents the details in the systemd.net-naming-scheme(7)
man page on your system. By default, Red Hat Enterprise Linux (RHEL) 8 uses the rhel-8.0
naming scheme, even if you install or update to a later minor version of RHEL.
If you want to use a scheme other than the default, you can switch the network interface naming scheme.
For further details about the naming schemes for different device types and platforms, see the systemd.net-naming-scheme(7)
man page on your system.
1.4. Switching to a different network interface naming scheme
By default, Red Hat Enterprise Linux (RHEL) 8 uses the rhel-8.0
naming scheme, even if you install or update to a later minor version of RHEL. While the default naming scheme fits in most scenarios, there might be reasons to switch to a different scheme version, for example:
- A new scheme can help to better identify a device if it adds additional attributes, such as a slot number, to an interface name.
-
An new scheme can prevent
udev
from falling back to the kernel-assigned device names (eth*
). This happens if the driver does not provide enough unique attributes for two or more interfaces to generate unique names for them.
Prerequisites
- You have access to the console of the server.
Procedure
List the network interfaces:
# ip link show 2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff ...
Record the MAC addresses of the interfaces.
Optional: Display the
ID_NET_NAMING_SCHEME
property of a network interface to identify the naming scheme that RHEL currently uses:# udevadm info --query=property --property=ID_NET_NAMING_SCHEME /sys/class/net/eno1' ID_NET_NAMING_SCHEME=rhel-8.0
Note that the property is not available on the
lo
loopback device.Append the
net.naming-scheme=<scheme>
option to the command line of all installed kernels, for example:# grubby --update-kernel=ALL --args=net.naming-scheme=rhel-8.4
Reboot the system.
# reboot
Based on the MAC addresses you recorded, identify the new names of network interfaces that have changed due to the different naming scheme:
# ip link show 2: eno1np0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff ...
After switching the scheme,
udev
names in this example the device with MAC address00:00:5e:00:53:1a
eno1np0
, whereas it was namedeno1
before.Identify which NetworkManager connection profile uses an interface with the previous name:
# nmcli -f device,name connection show DEVICE NAME eno1 example_profile ...
Set the
connection.interface-name
property in the connection profile to the new interface name:# nmcli connection modify example_profile connection.interface-name "eno1np0"
Reactivate the connection profile:
# nmcli connection up example_profile
Verification
Identify the naming scheme that RHEL now uses by displaying the
ID_NET_NAMING_SCHEME
property of a network interface:# udevadm info --query=property --property=ID_NET_NAMING_SCHEME /sys/class/net/eno1np0' ID_NET_NAMING_SCHEME=_rhel-8.4
Additional resources
1.5. Determining a predictable RoCE device name on the IBM Z platform
On Red Hat Enterprise Linux (RHEL) 8.7 and later, the udev
device manager sets names for RoCE interfaces on IBM Z as follows:
-
If the host enforces a unique identifier (UID) for a device,
udev
assigns a consistent device name that is based on the UID, for exampleeno<UID_in_decimal>
. If the host does not enforce a UID for a device, the behavior depends on your settings:
-
By default,
udev
uses unpredictable names for the device. -
If you set the
net.naming-scheme=rhel-8.7
kernel command line option,udev
assigns a consistent device name that is based on the function identifier (FID) of the device, for exampleens<FID_in_decimal>
.
-
By default,
Manually configure predictable device name for RoCE interfaces on IBM Z in the following cases:
Your host runs RHEL 8.6 or earlier and enforces a UID for a device, and you plan to update to RHEL 8.7 or later.
After an update to RHEL 8.7 or later,
udev
uses consistent interface names. However, if you used unpredictable device names before the update, NetworkManager connection profiles still use these names and fail to activate until you update the affected profiles.- Your host runs RHEL 8.7 or later and does not enforce a UID, and you plan to upgrade to RHEL 9.
Before you can use a udev
rule or a systemd
link file to rename an interface manually, you must determine a predictable device name.
Prerequisites
- An RoCE controller is installed in the system.
-
The
sysfsutils
package is installed.
Procedure
Display the available network devices, and note the names of the RoCE devices:
# ip link show ... 2: enP5165p0s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 ...
Display the device path in the
/sys/
file system:# systool -c net -p Class = "net" Class Device = "enP5165p0s0" Class Device path = "/sys/devices/pci142d:00/142d:00:00.0/net/enP5165p0s0" Device = "142d:00:00.0" Device path = "/sys/devices/pci142d:00/142d:00:00.0"
Use the path shown in the
Device path
field in the next steps.Display the value of the
<device_path>/uid_id_unique
file, for example:# cat /sys/devices/pci142d:00/142d:00:00.0/uid_id_unique
The displayed value indicates whether UID uniqueness is enforced or not, and you require this value in later steps.
Determine a unique identifier:
If UID uniqueness is enforced (
1
), display the UID stored in the<device_path>/uid
file, for example:# cat /sys/devices/pci142d:00/142d:00:00.0/uid
If UID uniqueness is not enforced (
0
), display the FID stored in the<device_path>/function_id
file, for example:# cat /sys/devices/pci142d:00/142d:00:00.0/function_id
The outputs of the commands display the UID and FID values in hexadecimal.
Convert the hexadecimal identifier to decimal, for example:
# printf "%d\n" 0x00001402 5122
To determine the predictable device name, append the identifier in decimal format to the corresponding prefix based on whether UID uniqueness is enforced or not:
-
If UID uniqueness is enforced, append the identifier to the
eno
prefix, for exampleeno5122
. -
If UID uniqueness is not enforced, append the identifier to the
ens
prefix, for exampleens5122
.
-
If UID uniqueness is enforced, append the identifier to the
Next steps
Use one of the following methods to rename the interface to the predictable name:
Additional resources
- IBM documentation: Network interface names
-
systemd.net-naming-scheme(7)
man page on your system
1.6. Customizing the prefix for Ethernet interfaces during installation
If you do not want to use the default device-naming policy for Ethernet interfaces, you can set a custom device prefix during the Red Hat Enterprise Linux (RHEL) installation.
Red Hat supports systems with customized Ethernet prefixes only if you set the prefix during the RHEL installation. Using the prefixdevname
utility on already deployed systems is not supported.
If you set a device prefix during the installation, the udev
service uses the <prefix><index>
format for Ethernet interfaces after the installation. For example, if you set the prefix net
, the service assigns the names net0
, net1
, and so on to the Ethernet interfaces.
The udev
service appends the index to the custom prefix, and preserves the index values of known Ethernet interfaces. If you add an interface, udev
assigns an index value that is one greater than the previously-assigned index value to the new interface.
Prerequisites
- The prefix consists of ASCII characters.
- The prefix is an alphanumeric string.
- The prefix is shorter than 16 characters.
-
The prefix does not conflict with any other well-known network interface prefix, such as
eth
,eno
,ens
, andem
.
Procedure
- Boot the Red Hat Enterprise Linux installation media.
In the boot manager, follow these steps:
-
Select the
Install Red Hat Enterprise Linux <version>
entry. - Press Tab to edit the entry.
-
Append
net.ifnames.prefix=<prefix>
to the kernel options. - Press Enter to start the installation program.
-
Select the
- Install Red Hat Enterprise Linux.
Verification
To verify the interface names, display the network interfaces:
# ip link show ... 2: net0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff ...
Additional resources
1.7. Configuring user-defined network interface names by using udev rules
You can use udev
rules to implement custom network interface names that reflect your organization’s requirements.
Procedure
Identify the network interface that you want to rename:
# ip link show ... enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff ...
Record the MAC address of the interface.
Display the device type ID of the interface:
# cat /sys/class/net/enp1s0/type 1
Create the
/etc/udev/rules.d/70-persistent-net.rules
file, and add a rule for each interface that you want to rename:SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="<MAC_address>",ATTR{type}=="<device_type_id>",NAME="<new_interface_name>"
ImportantUse only
70-persistent-net.rules
as a file name if you require consistent device names during the boot process. Thedracut
utility adds a file with this name to theinitrd
image if you regenerate the RAM disk image.For example, use the following rule to rename the interface with MAC address
00:00:5e:00:53:1a
toprovider0
:SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="00:00:5e:00:53:1a",ATTR{type}=="1",NAME="provider0"
Optional: Regenerate the
initrd
RAM disk image:# dracut -f
You require this step only if you need networking capabilities in the RAM disk. For example, this is the case if the root file system is stored on a network device, such as iSCSI.
Identify which NetworkManager connection profile uses the interface that you want to rename:
# nmcli -f device,name connection show DEVICE NAME enp1s0 example_profile ...
Unset the
connection.interface-name
property in the connection profile:# nmcli connection modify example_profile connection.interface-name ""
Temporarily, configure the connection profile to match both the new and the previous interface name:
# nmcli connection modify example_profile match.interface-name "provider0 enp1s0"
Reboot the system:
# reboot
Verify that the device with the MAC address that you specified in the link file has been renamed to
provider0
:# ip link show provider0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff ...
Configure the connection profile to match only the new interface name:
# nmcli connection modify example_profile match.interface-name "provider0"
You have now removed the old interface name from the connection profile.
Reactivate the connection profile:
# nmcli connection up example_profile
Additional resources
-
udev(7)
man page on your system
1.8. Configuring user-defined network interface names by using systemd link files
You can use systemd
link files to implement custom network interface names that reflect your organization’s requirements.
Prerequisites
- You must meet one of these conditions: NetworkManager does not manage this interface, or the corresponding connection profile uses the keyfile format.
Procedure
Identify the network interface that you want to rename:
# ip link show ... enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff ...
Record the MAC address of the interface.
If it does not already exist, create the
/etc/systemd/network/
directory:# mkdir -p /etc/systemd/network/
For each interface that you want to rename, create a
70-*.link
file in the/etc/systemd/network/
directory with the following content:[Match] MACAddress=<MAC_address> [Link] Name=<new_interface_name>
ImportantUse a file name with a
70-
prefix to keep the file names consistent with theudev
rules-based solution.For example, create the
/etc/systemd/network/70-provider0.link
file with the following content to rename the interface with MAC address00:00:5e:00:53:1a
toprovider0
:[Match] MACAddress=00:00:5e:00:53:1a [Link] Name=provider0
Optional: Regenerate the
initrd
RAM disk image:# dracut -f
You require this step only if you need networking capabilities in the RAM disk. For example, this is the case if the root file system is stored on a network device, such as iSCSI.
Identify which NetworkManager connection profile uses the interface that you want to rename:
# nmcli -f device,name connection show DEVICE NAME enp1s0 example_profile ...
Unset the
connection.interface-name
property in the connection profile:# nmcli connection modify example_profile connection.interface-name ""
Temporarily, configure the connection profile to match both the new and the previous interface name:
# nmcli connection modify example_profile match.interface-name "provider0 enp1s0"
Reboot the system:
# reboot
Verify that the device with the MAC address that you specified in the link file has been renamed to
provider0
:# ip link show provider0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff ...
Configure the connection profile to match only the new interface name:
# nmcli connection modify example_profile match.interface-name "provider0"
You have now removed the old interface name from the connection profile.
Reactivate the connection profile.
# nmcli connection up example_profile
Additional resources
-
systemd.link(5)
man page on your system
1.9. Assigning alternative names to a network interface by using systemd link files
With alternative interface naming, the kernel can assign additional names to network interfaces. You can use these alternative names in the same way as the normal interface names in commands that require a network interface name.
Prerequisites
- You must use ASCII characters for the alternative name.
- The alternative name must be shorter than 128 characters.
Procedure
Display the network interface names and their MAC addresses:
# ip link show ... enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff ...
Record the MAC address of the interface to which you want to assign an alternative name.
If it does not already exist, create the
/etc/systemd/network/
directory:# mkdir -p /etc/systemd/network/
For each interface that must have an alternative name, create a
*.link
file in the/etc/systemd/network/
directory with the following content:[Match] MACAddress=<MAC_address> [Link] AlternativeName=<alternative_interface_name_1> AlternativeName=<alternative_interface_name_2> AlternativeName=<alternative_interface_name_n>
For example, create the
/etc/systemd/network/70-altname.link
file with the following content to assignprovider
as an alternative name to the interface with MAC address00:00:5e:00:53:1a
:[Match] MACAddress=00:00:5e:00:53:1a [Link] AlternativeName=provider
Regenerate the
initrd
RAM disk image:# dracut -f
Reboot the system:
# reboot
Verification
Use the alternative interface name. For example, display the IP address settings of the device with the alternative name
provider
:# ip address show provider 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff altname provider ...
Additional resources
- What is AlternativeNamesPolicy in Interface naming scheme? (Red Hat Knowledgebase)