最新消息:

CentOS 7 CentOS 8 网卡命名规则

CentOS7 admin 258浏览 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一致),如果有,则命名改网卡;

  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程序。

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

    udevadm info /sys/class/net/eth0 | grep NAME
    ID_NET_NAME_ONBOARD
    ID_NET_NAME_SLOT
    ID_NET_NAME_PATH
    ID_NET_NAME_MAC

  4. step4, /usr/lib/udev/rules.d/80-net-name-slot.rules 如果在60-net.rules ,71-biosdevname.rules这两条规则中没有重命名网卡,且内核未指定net.ifnames=0参数 则udev依次尝试使用以下属性值来命名网卡,如果这些属性值都没有,则网卡不会被重命名。

    ID_NET_NAME_ONBOARD
    ID_NET_NAME_SLOT
    ID_NET_NAME_PATH

  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 网卡命名规则

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址