问题描述:
ctyunos2 系统默认集成装机后安装mlnx5.1驱动,升级为5.7驱动后,网卡名称从原先的enp129s0f1变化为 enp129s0f1np0,造成原先的网络配置无效
排查过程:
enp129s0f1np0 这个网卡名称是由 systemd-udevd 生成的,它是一种新的网络接口命名方式,用于替代传统的 eth0, eth1 等命名方式。这种命名方式的好处是,它可以保证网络接口的名称在不同的设备和启动顺序下保持一致,避免了混乱和冲突。
这个网卡名称的各个字段的含义如下:
- en 表示 ethernet,即以太网接口。
- p 表示 PCI,即 PCI 总线接口。
- 129 表示 PCI 总线编号,即该网卡所在的 PCI 总线的编号。
- s0 表示 PCI 插槽编号,即该网卡所在的 PCI 插槽的编号。
- f1 表示 PCI 功能编号,即该网卡所支持的 PCI 功能的编号。
- np0 表示网卡上的第几个物理端口,即该网卡所连接的网络端口的编号。
因此,enp129s0f1np0 这个网卡名称表示,该网卡是一个以太网接口,它位于第 129 号 PCI 总线上的第 0 号插槽中,支持第 1 号功能,并连接到第 0 号网络端口上。
网络端口编号是一种用于区分同一网卡上的不同物理端口的标识符。物理端口是指网卡上可以插入网线或光纤的接口,它们通常有一个或多个。网络端口编号是从 0 开始的整数,用于表示网卡上的第几个物理端口。例如,np0 表示第 0 个物理端口,np1 表示第 1 个物理端口,以此类推。
网络端口编号的作用是,它可以让系统和用户知道网卡上的每个物理端口的状态和配置。例如,如果一个网卡有两个物理端口,分别连接到不同的网络,那么系统可以通过网络端口编号来区分它们,并为它们分配不同的 IP 地址、子网掩码、网关等参数。用户也可以通过网络端口编号来查看或修改每个物理端口的信息,如速度、双工模式、链路状态等。
网络端口编号是由 systemd-udevd 自动生成的,它是根据网卡上的物理端口的顺序和类型来确定的。如果一个网卡只有一个物理端口,那么它的网络端口编号就是 0 。如果一个网卡有多个物理端口,那么它们的网络端口编号就是按照从左到右或从上到下的顺序来排列的。如果一个网卡有不同类型的物理端口,比如 RJ45 和 SFP ,那么它们的网络端口编号就是按照类型来区分的,先是 RJ45 ,后是 SFP 。
网卡在内核初始化阶段统一都是命名为eth,udev启动后调用规则进行rename动作
udev rule位于 /usr/lib/udev/rules.d/60-net.rules,它属于initscripts-10.04-1.ctl2.aarch64
ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", RESULT=="?*", NAME="$result"
其中,/lib/udev/rename_device 逻辑:
- 根据 /etc/sysconfig/network-scripts/ifcfg- 后缀文件来重命名网络接口。这些文件是网络配置文件,其中包含了接口的名称、MAC 地址、IP 地址等信息。
- /lib/udev/rename_device 程序会被 /usr/lib/udev/rules.d/60-net.rules 文件中的一条规则调用,该规则指示 udev 在添加网络设备时执行该程序。
- /lib/udev/rename_device 程序会遍历所有的 ifcfg- 后缀文件,如果找到一个文件中的 HWADDR 参数和当前接口的 MAC 地址匹配,那么就会将接口重命名为该文件中的 DEVICE 参数指定的名称。
- 如果没有找到匹配的 ifcfg- 文件,或者没有指定 DEVICE 参数,那么接口不会被重命名。
因此只需要修改 /etc/sysconfig/network-scripts/ifcfg- XXX配置,添加HWADDR物理地址绑定即可。
udevadm生成默认命名,规则源代码定位到systemd-239/src/udev/udev-builtin-net_id.c
[root@localhost test2]# find /sys -name phys_port_name |xargs -I {} sh -c "ls {} ; cat {}" /sys/devices/pci0000:80/0000:80:00.0/0000:81:00.0/net/eth0/phys_port_name p0 /sys/devices/pci0000:80/0000:80:00.0/0000:81:00.1/net/enp129s0f1np1/phys_port_name p1 |
该特性是在systemd官网可以获取到(不让贴地址,不是我不给~~)新增的,旧版本不支持,所以udev版本差异也会有命名不同的问题。升级了系统,网卡名称发生变化就是这个原因。
命名规则:
/* * Predictable network interface device names based on: * - firmware/bios-provided index numbers for on-board devices * - firmware-provided pci-express hotplug slot index number * - physical/geographical location of the hardware * - the interface's MAC address * * * Two character prefixes based on the type of interface: * en — Ethernet * sl — serial line IP (slip) * wl — wlan * ww — wwan * * Type of names: * b<number> — BCMA bus core number * c<bus_id> — bus id of a grouped CCW or CCW device, * with all leading zeros stripped [s390] * o<index>[n<phys_port_name>|d<dev_port>] * — on-board device index number * s<slot>[f<function>][n<phys_port_name>|d<dev_port>] * — hotplug slot index number * x<MAC> — MAC address * [P<domain>]p<bus>s<slot>[f<function>][n<phys_port_name>|d<dev_port>] * — PCI geographical location * [P<domain>]p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>] * — USB port number chain * v<slot> - VIO slot number (IBM PowerVM) * a<vendor><model>i<instance> — Platform bus ACPI instance id * * All multi-function PCI devices will carry the [f<function>] number in the * device name, including the function 0 device. * * When using PCI geography, The PCI domain is only prepended when it is not 0. * * For USB devices the full chain of port numbers of hubs is composed. If the * name gets longer than the maximum number of 15 characters, the name is not * exported. * The usual USB configuration == 1 and interface == 0 values are suppressed. * * PCI Ethernet card with firmware index "1": * ID_NET_NAME_ONBOARD=eno1 * ID_NET_NAME_ONBOARD_LABEL=Ethernet Port 1 * * PCI Ethernet card in hotplug slot with firmware index number: * /sys/devices/pci0000:00/0000:00:1c.3/0000:05:00.0/net/ens1 * ID_NET_NAME_MAC=enx000000000466 * ID_NET_NAME_PATH=enp5s0 * ID_NET_NAME_SLOT=ens1 * * PCI Ethernet multi-function card with 2 ports: * /sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/enp2s0f0 * ID_NET_NAME_MAC=enx78e7d1ea46da * ID_NET_NAME_PATH=enp2s0f0 * /sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.1/net/enp2s0f1 * ID_NET_NAME_MAC=enx78e7d1ea46dc * ID_NET_NAME_PATH=enp2s0f1 * * PCI wlan card: * /sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlp3s0 * ID_NET_NAME_MAC=wlx0024d7e31130 * ID_NET_NAME_PATH=wlp3s0 * * USB built-in 3G modem: * /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/2-1.4:1.6/net/wwp0s29u1u4i6 * ID_NET_NAME_MAC=wwx028037ec0200 * ID_NET_NAME_PATH=wwp0s29u1u4i6 * * USB Android phone: * /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/net/enp0s29u1u2 * ID_NET_NAME_MAC=enxd626b3450fb5 * ID_NET_NAME_PATH=enp0s29u1u2 * * s390 grouped CCW interface: * /sys/devices/css0/0.0.0007/0.0.f5f0/group_device/net/encf5f0 * ID_NET_NAME_MAC=enx026d3c00000a * ID_NET_NAME_PATH=encf5f0 * When the code here is changed, man/systemd.net-naming-scheme.xml must be updated too. */ |
如何论证与udev的关系。将udev服务关闭,关闭openibd服务。此时mlnx驱动处于未加载状态,对应mlnx网卡不识别。
systemctl stop systemd-udevd systemd-udevd-kernel.socket systemd-udevd-control.socket systemctl status systemd-udevd /etc/init.d/openibd stop |
然后手动执行驱动加载命令
modprobe mlx5_ib
可以看到能够识别到mlnx网卡,网卡名称为eth0 eth1
再执行下面命令,可以看到eth1名称发生了变化,但是eth0不变
udevadm test /sys/class/net/eth1
逐步缩小范围,定位到udevadm修改的网卡名称,而非mlnx驱动修改的。
结论:
网卡命名与MLNX驱动无关,与udev规则关联,若驱动中带有udev规则可能会有影响。但实际排查过程还是建议从udev入手,少走弯路。
解决方案:
- 临时变更
ip link set dev enp129s0f1np0 down ip link set enp129s0f1np0 name enp129s0f1 ip link set enp129s0f1 up |
- 永久变更
/etc/sysconfig/network-scripts/目录下添加配置文件(若已有配置,补充相应字段即可),填充
- MAC地址,例如(HWADDR=xx:xx:xx:xx:xx)
- DEVICE名称,例如(DEVICE=enp129s0f0)
udev会根据mac地址,将网卡名称修改为DEVICE值。( /usr/lib/udev/rules.d/60-net.rules)
例如:
# cat /etc/sysconfig/network-scripts/ifcfg-enp129s0f0 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=no IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=enp129s0f0 DEVICE=enp129s0f0 HWADDR=f4:6b:8c:2a:72:c1 ONBOOT=yes IPADDR=192.168.33.199 NETMASK=255.255.255.0 GATEWAY=192.168.33.1 |