赞
踩
在工作中,偶尔看到有些机器的网口名字是以ethX命令,有些则以enpXsX这种名字命名。网上的资料说的都不太明白,资料也无据可查,很难让人信服。于是决定自己查了下官方的资料和源码,把这些搞清楚。
官方文档:PredictableNetworkInterfaceNames
官方文档:systemd.net-naming-scheme
网卡的名字是由systemd给出来的,在 v197 systemd/udev中,废弃了eth0,eth1这种命名,转而改为以下这几个命名。(原文描述:Starting with v197 systemd/udev will automatically assign predictable, stable network interface names for all local Ethernet, WLAN and WWAN interfaces. This is a departure from the traditional interface naming scheme ("eth0", "eth1", "wlan0", ...), but should fix real problems.)
前缀 | 描述 | 示例 |
en | Ethernet以太网接口 | eno1 - 以太网onboard设备1 |
ib | InfiniBand接口 | ib0 - InfiniBand接口0 |
sl | Serial line IP (slip)串行线路IP(SLIP)接口 | |
wl | Wireless local area network (WLAN)无线局域网接口 | wlp0s20f0 - PCI总线0插槽20功能0的无线网卡 |
ww | Wireless wide area network (WWAN)无线广域网接口,如蜂窝网络 |
* 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 * ccw<name> -- CCW bus group name * o<index>[d<dev_port>] -- on-board device index number * s<slot>[f<function>][d<dev_port>] -- hotplug slot index number * x<MAC> -- MAC address * [P<domain>]p<bus>s<slot>[f<function>][d<dev_port>] * -- PCI geographical location * [P<domain>]p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>] * -- USB port number chain
我们可以通过以下命令来查看我们的一个网口都有哪些名字
$ udevadm info -e | grep -A 11 ^P.*ens33 P: /devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33 E: DEVPATH=/devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33 E: ID_BUS=pci E: ID_MM_CANDIDATE=1 E: ID_MODEL_FROM_DATABASE=82545EM Gigabit Ethernet Controller (Copper) (PRO/1000 MT Single Port Adapter) E: ID_MODEL_ID=0x100f E: ID_NET_DRIVER=e1000 E: ID_NET_LINK_FILE=/lib/systemd/network/99-default.link E: ID_NET_NAME_MAC=enx000c2984660a E: ID_NET_NAME_PATH=enp2s1 E: ID_NET_NAME_SLOT=ens33 E: ID_OUI_FROM_DATABASE=VMware, Inc.
从结果上,我们可以看出这个网口在内核里面最少给他起了三个名字,分别是:enx000c2984660a enp2s1 ens33
ID_NET_NAME_MAC=enx000c2984660a
ID_NET_NAME_PATH=enp2s1
ID_NET_NAME_SLOT=ens33
刚才说到,同一个网口,根据不同的规则会又不用的名字,那么究竟哪个规则是最先被生效的呢?
在 src/udev/net/link-config.c中,对于这些命名规则的优先顺序:
- name_policy) {
- NamePolicy *policy;
-
- for (policy = config->name_policy;
- !new_name && *policy != _NAMEPOLICY_INVALID; policy++) {
- switch (*policy) {
- case NAMEPOLICY_KERNEL:
- respect_predictable = true;
- break;
- case NAMEPOLICY_DATABASE:
- new_name = udev_device_get_property_value(device, "ID_NET_NAME_FROM_DATABASE");
- break;
- case NAMEPOLICY_ONBOARD:
- new_name = udev_device_get_property_value(device, "ID_NET_NAME_ONBOARD");
- break;
- case NAMEPOLICY_SLOT:
- new_name = udev_device_get_property_value(device, "ID_NET_NAME_SLOT");
- break;
- case NAMEPOLICY_PATH:
- new_name = udev_device_get_property_value(device, "ID_NET_NAME_PATH");
- break;
- case NAMEPOLICY_MAC:
- new_name = udev_device_get_property_value(device, "ID_NET_NAME_MAC");
- break;
- default:
- break;
- }
- }
- }
如果我们查看整体案例陈述,您可以看到第一个匹配项是优先匹配项。从上到下工作,udev 采取以下的优先级顺序:
ID_NET_NAME_FROM_DATABASE ID_NET_NAME_ONBOARD ID_NET_NAME_SLOT ID_NET_NAME_PATH ID_NET_NAME_MAC
也就是说:
第一优先:ID_NET_NAME_FROM_DATABASE。你自己在udev里面自定义的网口名字,例如net0这种。
第二优先:ID_NET_NAME_ONBOARD。如果你的主板上又一张网卡是板载的,那么这张网卡的网口名字,会被命名为enoX这种名字。至于Linux为什么能识别到哪个网口是不是板载的网口,其实是根据smbios的type41来的。enoX里面的这个X也是根据smbios的type41里面的Type Instance。可以使用dmideoce -t 41查看是什么网卡类型。
第三优先:ID_NET_NAME_SLOT。 如果你插入的是一张可热插拔网卡,使用dmidecode -t 41命令,能看到你那张网卡的类型是SLOT类型,此时你的网口名字,会被命名为ensX,例如ens33
第四优先:ID_NET_NAME_PATH。也就是根据bus号,device号,function号来命名。例如:enp2s1
第五优先:ID_NET_NAME_MAC。根据mac地址命名,例如enx000c2984660a。
总的来说,网口名字的规则优先极如下:你自定义udev的名字 > 板载网口eno1 > 可热插拔网口名字ens33 > PCI插槽名字enp2s1 > 网口mac地址名字enx000c2984660a
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。