Renaming network interfaces
NixOS uses the udev
predictable
naming scheme to assign names to network interfaces. This
means that by default cards are not given the traditional names like
eth0 or eth1, whose order can
change unpredictably across reboots. Instead, relying on physical
locations and firmware information, the scheme produces names like
ens1, enp2s0, etc.
These names are predictable but less memorable and not necessarily
stable: for example installing new hardware or changing firmware
settings can result in a
name
change. If this is undesirable, for example if you have a
single ethernet card, you can revert to the traditional scheme by
setting
to
false.
Assigning custom names
In case there are multiple interfaces of the same type, it’s
better to assign custom names based on the device hardware
address. For example, we assign the name wan to
the interface with MAC address
52:54:00:12:01:01 using a netword link unit:
systemd.network.links."10-wan" = {
matchConfig.MACAddress = "52:54:00:12:01:01";
linkConfig.Name = "wan";
};
Note that links are directly read by udev, not
networkd, and will work even if networkd is disabled.
Alternatively, we can use a plain old udev rule:
services.udev.initrdRules = ''
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", \
ATTR{address}=="52:54:00:12:01:01", KERNEL=="eth*", NAME="wan"
'';
The rule must be installed in the initrd using
services.udev.initrdRules, not the usual
services.udev.extraRules option. This is to
avoid race conditions with other programs controlling the
interface.