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. Warning Generally, Red Hat does not support systems where consistent device naming is disabled. For exceptions, see the Red Hat Knowledgebase solution Is it safe to set net.ifnames=0 . 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 the HWADDR 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 the DEVICE parameter of the ifcfg 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 the biosdevname utility renames the interface according to its naming policy, if it was not renamed in the step. Note Install 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 in udev -internal variables. These variables are then processed in the 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 the udev service, and udev renames the interface based on the order of the policies in the NamePolicy 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: 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, udev does not rename this device. lo database This policy assigns names based on mappings in the udev hardware database. For details, see the hwdb(7) man page on your system. idrac onboard Device names incorporate firmware or BIOS-provided index numbers for onboard devices. eno1 slot Device names incorporate firmware or BIOS-provided PCI Express (PCIe) hot-plug slot-index numbers. ens1 path Device names incorporate the physical location of the connector of the hardware. enp1s0 mac Device names incorporate the MAC address. By default, Red Hat Enterprise Linux does not use this policy, but administrators can enable it. enx525400d5e0fb 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: 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: 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: Reboot the system. Based on the MAC addresses you recorded, identify the new names of network interfaces that have changed due to the different naming scheme: After switching the scheme, udev names in this example the device with MAC address 00:00:5e:00:53:1a eno1np0 , whereas it was named eno1 before. Identify which NetworkManager connection profile uses an interface with the name: Set the connection.interface-name property in the connection profile to the new interface name: Reactivate the connection profile: Verification Identify the naming scheme that RHEL now uses by displaying the ID_NET_NAMING_SCHEME property of a network interface: Additional resources Network interface naming schemes 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 example eno <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 example ens <FID_in_decimal> . 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: Display the device path in the /sys/ file system: Use the path shown in the Device path field in the steps. Display the value of the <device_path> /uid_id_unique file, for example: 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: If UID uniqueness is not enforced ( 0 ), display the FID stored in the <device_path> /function_id file, for example: The outputs of the commands display the UID and FID values in hexadecimal. Convert the hexadecimal identifier to decimal, for example: 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 example eno5122 . If UID uniqueness is not enforced, append the identifier to the ens prefix, for example ens5122 . steps Use one of the following methods to rename the interface to the predictable name: Configuring user-defined network interface names by using udev rules Configuring user-defined network interface names by using systemd link files 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. Important 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 , and em . 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. Install Red Hat Enterprise Linux. Verification To verify the interface names, display the network interfaces: Additional resources Interactively installing RHEL from installation media 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: Record the MAC address of the interface. Display the device type ID of the interface: Create the /etc/udev/rules.d/70-persistent-net.rules file, and add a rule for each interface that you want to rename: Important Use only 70-persistent-net.rules as a file name if you require consistent device names during the boot process. The dracut utility adds a file with this name to the initrd 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 to provider0 : Optional: Regenerate the initrd RAM disk image: 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: Unset the connection.interface-name property in the connection profile: Temporarily, configure the connection profile to match both the new and the interface name: Reboot the system: Verify that the device with the MAC address that you specified in the link file has been renamed to provider0 : Configure the connection profile to match only the new interface name: You have now removed the old interface name from the connection profile. Reactivate the connection 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: Record the MAC address of the interface. If it does not already exist, create the /etc/systemd/network/ directory: For each interface that you want to rename, create a 70-*.link file in the /etc/systemd/network/ directory with the following content: Important Use a file name with a 70- prefix to keep the file names consistent with the udev rules-based solution. For example, create the /etc/systemd/network/70-provider0.link file with the following content to rename the interface with MAC address 00:00:5e:00:53:1a to provider0 : Optional: Regenerate the initrd RAM disk image: 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: Unset the connection.interface-name property in the connection profile: Temporarily, configure the connection profile to match both the new and the interface name: Reboot the system: Verify that the device with the MAC address that you specified in the link file has been renamed to provider0 : Configure the connection profile to match only the new interface name: You have now removed the old interface name from the connection profile. Reactivate the connection 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: 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: For each interface that must have an alternative name, create a copy of the /usr/lib/systemd/network/99-default.link file with a unique name and .link suffix in the /etc/systemd/network/ directory, for example: Modify the file you created in the step. Rewrite the [Match] section as follows, and append the AlternativeName entries to the [Link] section: For example, create the /etc/systemd/network/70-altname.link file with the following content to assign provider as an alternative name to the interface with MAC address 00:00:5e:00:53:1a : Regenerate the initrd RAM disk image: Reboot the system: Verification Use the alternative interface name. For example, display the IP address settings of the device with the alternative name provider : Additional resources What is AlternativeNamesPolicy in Interface naming scheme? (Red Hat Knowledgebase)

Commands:
NamePolicy=kernel database onboard slot path
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
udevadm info --query=property --property=ID_NET_NAMING_SCHEME /sys/class/net/eno1' ID_NET_NAMING_SCHEME=rhel-8.0
grubby --update-kernel=ALL --args=net.naming-scheme= rhel-8.4
reboot
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
nmcli -f device,name connection show DEVICE NAME eno1 example_profile
nmcli connection modify example_profile connection.interface-name "eno1np0"
nmcli connection up example_profile
udevadm info --query=property --property=ID_NET_NAMING_SCHEME /sys/class/net/eno1np0' ID_NET_NAMING_SCHEME=_rhel-8.4
ip link show 2: enP5165p0s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
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"
cat /sys/devices/pci142d:00/142d:00:00.0/uid_id_unique
cat /sys/devices/pci142d:00/142d:00:00.0/uid
cat /sys/devices/pci142d:00/142d:00:00.0/function_id
printf "%d\n" 0x00001402 5122
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
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
cat /sys/class/net/enp1s0/type 1
SUBSYSTEM=="net",ACTION=="add",ATTR{address}==" <MAC_address> ",ATTR{type}==" <device_type_id> ",NAME=" <new_interface_name> "
SUBSYSTEM=="net",ACTION=="add",ATTR{address}==" 00:00:5e:00:53:1a ",ATTR{type}==" 1 ",NAME=" provider0 "
dracut -f
nmcli -f device,name connection show DEVICE NAME enp1s0 example_profile
nmcli connection modify example_profile connection.interface-name ""
nmcli connection modify example_profile match.interface-name "provider0 enp1s0"
reboot
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
nmcli connection modify example_profile match.interface-name "provider0"
nmcli connection up example_profile
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
mkdir -p /etc/systemd/network/
[Match] MACAddress= <MAC_address> [Link] Name= <new_interface_name>
[Match] MACAddress=00:00:5e:00:53:1a [Link] Name=provider0
dracut -f
nmcli -f device,name connection show DEVICE NAME enp1s0 example_profile
nmcli connection modify example_profile connection.interface-name ""
nmcli connection modify example_profile match.interface-name "provider0 enp1s0"
reboot
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
nmcli connection modify example_profile match.interface-name "provider0"
nmcli connection up example_profile
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
mkdir -p /etc/systemd/network/
cp /usr/lib/systemd/network/99-default.link /etc/systemd/network/98-lan.link
[Match] MACAddress= <MAC_address> [Link] AlternativeName= <alternative_interface_name_1> AlternativeName= <alternative_interface_name_2> AlternativeName= <alternative_interface_name_n>
[Match] MACAddress=00:00:5e:00:53:1a [Link] NamePolicy=kernel database onboard slot path AlternativeNamesPolicy=database onboard slot path MACAddressPolicy=persistent AlternativeName=provider
dracut -f
reboot
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