最新消息:

CentOS 7 CentOS 8 网卡命名规则

CentOS7 admin 7478浏览 0评论

修改方法

安装依赖 yum install initscripts biosdevname

  1. 修改/etc/default/grub
  2. 在 GRUB_CMDLINE_LINUX 后面添加如下 参数,
    • 需要 em[id] 添加 net.ifnames=1 biosdevname=1
    • 需要 eth[id] 添加 net.ifnames=0 biosdevname=0
    • 需要 enp0s2 添加 net.ifnames=1 biosdevname=0

    GRUB_CMDLINE_LINUX=”crashkernel=auto rhgb quiet net.ifnames=1 biosdevname=1″

  3. 重新生成image # grub2-mkconfig -o /boot/grub2/grub.cfg
  4. 重启

以下是命名规则

   从centos7开始,系统默认的网卡命名有已经不是我们熟悉的ethX方式了,细心的同学会留意到一些比如ens enp等开头的网卡名称,简单了解,可以解释为centos7开始,网卡命名会根据网卡的硬件信息,插槽位置等有关;

   而网上也有为那些依然想使用ethX方式命名的提供了策略。比如在内核启动参数里增加biosdevname=0 net.ifnames=0;

   但是这里忽略了 一个问题,那就是为什么centos7不再使用以前的ethX方式?根本是因为之前ethX方式是不确定的,每次启动可能都不同(如果没有用户自定义网卡名称的前提下);

所以大家提供的这种办法其实是不好的;

   解释完上面内容之后,咱们来看下到底网卡名称是如何命名的。

   核心流程:明确一点是,linux内核启动过程中,会默认给网卡以ethX方式随机命名,然后再通过systemd去rename成其他名称。关键字,rename!

biosdevname和net.ifnames两种命名规范

net.ifnames的命名规范为:

设备类型:

  • en 表示Ethernet
  • wl 表示WLAN
  • ww 表示无线广域网WWAN

设备位置:

Format Description
o<index> on-board device index number
s<slot>[f<function>][d<dev_id>] hotplug slot index number
x<mac> MAC address
p<bus>s<slot>[f<function>][d<dev_id>] PCI geographical location
p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>] USB port number chain

实际的例子:

  • eno1 板载网卡
  • enp0s2 pci网卡
  • ens33 pci网卡
  • wlp3s0 PCI无线网卡
  • wwp0s29f7u2i2 4G modem
  • wlp0s2f1u4u1 连接在USB Hub上的无线网卡
  • enx78e7d1ea46da pci网卡

biosdevname的命名规范为

实际的例子:

  • em1 板载网卡
  • p3p4 pci网卡
  • p3p4_1 虚拟网卡

一、如何rename?

默认rename流程:

  1. step1 依据/usr/lib/udev/rules.d/60-net.rules, 查看是否有ifcfg-xx配置文件(路径在/etc/sysconfig/network-scripts/),是否有定义了指定MAC地址的配置文件(ifcfg-xx ,xx必须和配置文件的内容DEVICE一致),如果有,则命名改网卡;
    1. 如果 /etc/udev/rules.d/70-persistent-net.rules 地址与 ifcfg-xx 匹配使用自定义网卡名
    2. # cat /etc/udev/rules.d/70-persistent-net.rules
      SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:9f:c8:dd", NAME="aaa"
      
      # cat /etc/sysconfig/network-scripts/ifcfg-aaa | grep -E 'aaa|MACADDR'
      NAME="aaa"
      DEVICE="aaa"
      MACADDR="00:0c:29:9f:c8:dd"

       

  2. step2 依据/usr/lib/udev/rules.d/71-biosdevname.rules, 如果系统中安装了biosdevname,且内核参数未指定biosdevname=0,且上一步没有重命名网卡,则按照biosdevname的命名规范,从BIOS中取相关信息来命名网卡。主要是取SMBIOS中的type 9 (System Slot) 和 type 41 (Onboard Devices Extended Information)不过要求SMBIOS的版本要高于2.6,且系统中要安装biosdevname程序。
    1. # cat /usr/lib/udev/rules.d/71-biosdevname.rules
      
      # whitelist all Dell systems
      ATTR{[dmi/id]sys_vendor}=="Dell*", ENV{UDEV_BIOSDEVNAME}="1"   # 是 Dell 型号设置 biosdevname=1
      
      # kernel command line "biosdevname={0|1}" can turn off/on biosdevname
      IMPORT{cmdline}="biosdevname"                                  # 从GRUB启动项重置 biosdevname 配置
      ENV{UDEV_BIOSDEVNAME}=="0", GOTO="netdevicename_end"           # 如果 biosdevname = 0 跳出 end
      ENV{UDEV_BIOSDEVNAME}=="1", GOTO="netdevicename_start"         # 如果 biosdevname = 1 执行 netdevicename_start
      
      # off by default
      GOTO="netdevicename_end"
      
      LABEL="netdevicename_start"
      
      # using NAME= instead of setting INTERFACE_NAME, so that persistent
      # names aren't generated for these devices, they are "named" on each boot.
      SUBSYSTEMS=="pci", PROGRAM="/sbin/biosdevname --smbios 2.6 --nopirq --policy physical -i %k", NAME="%c" OPTIONS+="string_escape=replace"                                                        # 执行 /sbin/biosdevname 命令
      
      LABEL="netdevicename_end"
      

       

  3. step3, 依据/lib/udev/rules.d/75-net-description.rules,将udev工具会根据device属性将填写网卡的属性命名,可能一个网卡会有多个维度的名称哦;

    # udevadm info /sys/class/net/aaa | grep NAME
    E: ID_NET_NAME_MAC=enx000c299fc8dd
    E: ID_NET_NAME_PATH=enp4s0
    E: ID_NET_NAME_SLOT=ens161

  4. step4, /usr/lib/udev/rules.d/80-net-name-slot.rules 如果在60-net.rules ,71-biosdevname.rules这两条规则中没有重命名网卡,且内核未指定net.ifnames=0参数 则udev依次尝试使用以下属性值来命名网卡,如果这些属性值都没有,则网卡不会被重命名。
    1. # cat /usr/lib/udev/rules.d/80-net-name-slot.rules
      # do not edit this file, it will be overwritten on update
      
      ACTION!="add", GOTO="net_name_slot_end"
      SUBSYSTEM!="net", GOTO="net_name_slot_end"
      NAME!="", GOTO="net_name_slot_end"
      
      IMPORT{cmdline}="net.ifnames"                   # 从 GRUB 读取 net.ifnames 配置, net.ifnames = 0 跳出 net.ifnames = 1 按照下面顺序配置
      ENV{net.ifnames}=="0", GOTO="net_name_slot_end"
      
      NAME=="", ENV{ID_NET_NAME_ONBOARD}!="", NAME="$env{ID_NET_NAME_ONBOARD}"  # 没有名字,ID_NET_NAME_ONBOARD这个ENV存在,用ID_NET_NAME_ONBOARD作为名字
      NAME=="", ENV{ID_NET_NAME_SLOT}!="", NAME="$env{ID_NET_NAME_SLOT}" # 没有名字,ID_NET_NAME_SLOT这个ENV存在,用ID_NET_NAME_SLOT作为名字
      NAME=="", ENV{ID_NET_NAME_PATH}!="", NAME="$env{ID_NET_NAME_PATH}" # 没有名字,ID_NET_NAME_PATH这个ENV存在,用ID_NET_NAME_PATH作为名字
      
      LABEL="net_name_slot_end"
  5. step5,udev 根据step3中的赋值,按照指定的scheme规则,去给在step1 step2中没有命名的网卡命名;

    强调:这个step顺序是在我们没有自定义自己的rules的前提下,如果用户自定义了自己的rules,则用户自定义为优先级最高;

二、scheme次序

上面step4中提到,按照指定的scheme规则,这个规则是什么呢?

首先说step3中,提到按照网卡的不同属性命名,系统识别网卡有好几种维度:

  • 比如:BIOS provided index numbers for on-board devices (example: eno1),
  • 比如:BIOS provided PCI Express hotplug slot index numbers (example: ens1)
  • 比如:physical location of the connector of the hardware (example: enp2s0),
  • 比如:mac地址

同一个网卡通常同时具有多个维度的名称,systemd在选取的时候,按照有先后次序,使用先命中的;

顺序可以简单理解为(eno1-ens1-enp1)

# qemu xml 配置
    <interface type='bridge'>
      <mac address='52:54:00:b5:4d:84'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </interface>

[root@aikaiyuan ~]# lspci | grep Eth
00:02.0 Ethernet controller: Red Hat, Inc. Virtio network device
00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device

[root@aikaiyuan ~]# udevadm info /sys/class/net/eth0 | grep NAME
E: ID_NET_NAME_MAC=enx525400b54d84
E: ID_NET_NAME_PATH=enp0s2
E: ID_NET_NAME_SLOT=ens2
E: UDEV_BIOSDEVNAME=0
[root@aikaiyuan ~]#

eth0这个网卡,scheme名称有3个,如果systemd自选,会使用哪个?ens2.(那这个为什么是/sys/class/net/eth0 而不是/sys/class/net/ens2 ,那是因为自定义
在我们未修改 /etc/default/grub 之前系统默认就是 ens2

三、用户自定义网卡名称

  1. 在用户没有自定义rules文件前提下,step1中的网卡命名方式也可认为是 一种用户自定义的网卡命名,即在/etc/sysconfig/network-scripts/ifcfg-xx 文件,xx就是这个网卡名称,文件内容中体现MAC_ADDRESS、NAME,这种情况下,则会按照配置文件中指定的名称来命名网卡;
  2. 如果用户自定义了rules文件,放在/etc/udev/rules.d/目录下,则这个优先级是最高的;比1中ifcfg-xx方式优先级更高,但是如果两者不一致,则在重启network服务时,会依据ifcfg-xx,所以用户不应该同时采用里两种方式给同一个网卡命不同的名称;

四、内核启动参数biosdevnane、net.ifnames

默认就是内核启动参数没有biosdevname 也没有net.ifnames 参数(其实默认是net.ifnames=1,biosdevname=0)这种情况下就按照一 中进行网卡命名;eno-ens-enp的方式逐个匹配。但是如果使能了biosdevname.则会使用biosdevname的命名 step1没有命名的网卡;

bios命名规则:

要么是em开头,要么是p开头;

怎么样使能biosdevname呢?2个条件,安装biosdevname包,且在内核启动参数中明确 biosdevname=1. 否则使能不了;

但是不管怎么样,如果用户自定义了udev rules,则用户自定义的rules优先!

这是总述,但凡用户自定义rules,优先级最高;

内核启动参数net.ifname,

如果在启动参数中增加net.ifname=0,这个文件会在/lib/udev/rule.d/80-net-name-slot.rules体现使用价值,则告诉系统不用scheme的方式来命名,这个时候,会恢复ethx这种不确定性的命名方式;

五、 不要用ethX去命名

内核在boot 过程是默认使用ethX方式来命名的,每次启动的时候都不确定,启动会后再通过udev等方式去rename,

参考

转载请注明:爱开源 » CentOS 7 CentOS 8 网卡命名规则

您必须 登录 才能发表评论!