当前位置:   article > 正文

Linux的网口名字的命名规则_linux持久性接口命名规则 网络接口

linux持久性接口命名规则 网络接口

在工作中,偶尔看到有些机器的网口名字是以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.)

一 linux系统中都包含了哪几种网卡名字?

前缀

描述

示例

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

二 网口名字的含义

  • 板载设备示例:
    • eno1 - PCI firmware index 1的板载设备
    • eno1d0 - devicetree别名index 0的板载设备
    • eno2o3 - PCI设备onboard index 3的板载设备
    • eno1laWLAN - PCI固件WLAN文本标签的板载设备
  • PCI/USB设备示例:
    • enp2s0f0 - 总线2插槽0功能0的以太网接口
    • wlp3s1 - PCI总线3的无线网卡
    • ib0s1f0 - InfiniBand总线0插槽1功能0
    • enx12345 - MAC地址为12:34:45的以太网接口
  • 多功能设备示例:
    • enp6s0f0 - 总线6插槽0功能0
    • enp6s0f1 - 总线6插槽0功能1
  • 虚拟设备示例:
    • eno1v5 - eno1的SR-IOV虚拟设备5
    • eno2r3 - eno2的SR-IOV代表设备3
  • 路径属性示例:
    • ID_NET_NAME_PATH=enp0s31f6
    • ID_NET_NAME_SLOT=enp5s0
  • 特殊接口示例:
    • USB端口号链:enp0s15u2u3
    • BCMA核心号: enp0s31b1

我们可以通过以下命令来查看我们的一个网口都有哪些名字

$ 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

三 linux系统是如何给这些规则排优先顺序的?

刚才说到,同一个网口,根据不同的规则会又不用的名字,那么究竟哪个规则是最先被生效的呢?

src/udev/net/link-config.c中,对于这些命名规则的优先顺序:

  1. name_policy) {
  2. NamePolicy *policy;
  3. for (policy = config->name_policy;
  4. !new_name && *policy != _NAMEPOLICY_INVALID; policy++) {
  5. switch (*policy) {
  6. case NAMEPOLICY_KERNEL:
  7. respect_predictable = true;
  8. break;
  9. case NAMEPOLICY_DATABASE:
  10. new_name = udev_device_get_property_value(device, "ID_NET_NAME_FROM_DATABASE");
  11. break;
  12. case NAMEPOLICY_ONBOARD:
  13. new_name = udev_device_get_property_value(device, "ID_NET_NAME_ONBOARD");
  14. break;
  15. case NAMEPOLICY_SLOT:
  16. new_name = udev_device_get_property_value(device, "ID_NET_NAME_SLOT");
  17. break;
  18. case NAMEPOLICY_PATH:
  19. new_name = udev_device_get_property_value(device, "ID_NET_NAME_PATH");
  20. break;
  21. case NAMEPOLICY_MAC:
  22. new_name = udev_device_get_property_value(device, "ID_NET_NAME_MAC");
  23. break;
  24. default:
  25. break;
  26. }
  27. }
  28. }

 

 

如果我们查看整体案例陈述,您可以看到第一个匹配项是优先匹配项。从上到下工作,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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/119408
推荐阅读
相关标签
  

闽ICP备14008679号