Centos7以前版本的Centost系统对网卡命令采用了传统的命令标准,如eth0,eth1,个人是理解eth标识了网卡的链路层封装类型,后面的数字就是网卡编号了,但这个编号可不是一成不变的,如果服务器增加或删除新硬件就可能会发生变化,为运维工作多少带来了一些麻烦,为了解决这个问题Centos7以后版本引入了新的网络设备命名规范:一致网络设备命名(CONSISTENT NETWORK DEVICE NAMING),Centos7以后支持biosdevname和net.ifnames两种命名规范。

1.net.ifnames命名规范为:设备类型+设备位置+端口号

设备类型:en 代表以太网,wl 代表无线局域网(WLAN),ww 代表无线广域网(WWAN)。

设备位置:集成设备的设备索引编号 ,或扩展卡所在总线槽位编号

端口号:板载集成设备索引编号或扩展卡上的物理端口编号

设备名称类型

格式

说明

eno1

板载设备索引号

ens33

热插拔插槽索引号

举例:

名称

设备类型

说明

eno1

板载网卡

板载1号网卡

enp0s2

pci网卡

PCI扩展卡的2号端口

ens33

pci网卡

热插拔插槽3号PCI-E插槽的3号端口

wlp3s0

PCI无线网卡

第3号PCI扩展卡的0号端口

2.biosdevname命名规范

Centos系统需要安装biosdevname程序包才可以使用biosdevname命名规范,biosdevname程序读取BIOS信息中的type 9(系统插槽)和 type 41(板载设备扩展信息)两个字段信息来命名网卡。(要求SMBIOS的版本要高于2.6)

设备

旧名称

新名称

板载内置网卡

eth[0123…]

em[1234…]

em1

PCI扩展卡网络接口

eth[0123…]

p【槽位号】p【端口号】

p3p4

子接口虚拟功能

eth[0123…]

p【槽位号】p【端口号】_【子接口号】

p3p4_1

二、系统默认的网卡命名规则

官方文档命名规则描如下:

默认情况下,systemd 会使用以下策略,采用支持的命名方案为接口命名:

方案 1:如果固件或 BIOS 信息适用且可用,则使用整合了为板载设备提供索引号的固件或 BIOS 的名称(例如:eno1),否则请使用方案 2。(针对的是板载集成网卡命名)

方案 2:如果固件或 BIOS 信息适用且可用,则使用整合了为 PCI 快速热插拔插槽提供索引号的固件或 BIOS 名称(例如 ens1),否则请使用方案 3。(针对的是PCI-E扩展网卡针命名标准)

方案 3:如果硬件连接器物理位置信息可用,则使用整合了该信息的名称(例如:enp2s0),否则请使用方案 5。

方案 4:默认不使用整合接口 MAC 地址的名称(例如:enx78e7d1ea46da),但用户可选择使用此方案。(根据MAC地址命名网卡)

方案 5:传统的不可预测的内核命名方案,在其他方法均失败后使用(例如: eth0)(以上命令信息都无法获取时则采用传统的命令规则)

这个策略(如上所述)是默认策略。如果该系统已启用 biosdevname,则会使用该方案。注:启用 biosdevname 需要添加 biosdevname=1 作为命令行参数(Dell 系统除外),此时只要安装 biosdevname,就会默认使用该方案。如果用户已添加 udev 规则,该规则会更高内核设备名称,则会优先使用这些规则

三、设备重命名策略

关于设备重命名官方的文档做了如下阐述:

1./usr/lib/udev/rules.d/60-net.rules 文件中的规则会让 udev 帮助工具 /lib/udev/rename_device 查看所有 /etc/sysconfig/network-scripts/ifcfg-suffix 文件。如果发现包含 HWADDR 条目的 ifcfg 文件与某个接口的 MAC 地址匹配,它会将该接口重命名为 ifcfg 文件中由 DEVICE 指令给出的名称。

2./usr/lib/udev/rules.d/71-biosdevname.rules 中的规则让 biosdevname 根据其命名策略重命名该接口,即在上一步中没有重命名该接口、已安装 biosdevname、且在 boot 命令行中将 biosdevname=0 作为内核命令给出。

3./lib/udev/rules.d/75-net-description.rules 中的规则让 udev 通过检查网络接口设备,填写内部 udev 设备属性值 ID_NET_NAME_ONBOARD、ID_NET_NAME_SLOT、ID_NET_NAME_PATH。注:有些设备属性可能处于未定义状态。

4./usr/lib/udev/rules.d/80-net-name-slot.rules 中的规则让 udev 重命名该接口,优先顺序如下:ID_NET_NAME_ONBOARD、ID_NET_NAME_SLOT、ID_NET_NAME_PATH。并提供如下信息:没有在步骤 1 或 2 中重命名该接口,同时未给出内核参数 net.ifnames=0。如果一个参数未设定,则会按列表的顺序设定下一个。如果没有设定任何参数,则不会重命名该接口。

从官方的阐述来看1,3,4都与系统systemd udev命名规则有关,2与biosdevname有关,个人理解四个文件的用途如下:

1./usr/lib/udev/rules.d/60-net.rules (rename_device程序基于自定义配置文件命名)

如果在目录/etc/sysconfig/network-scripts/中有以ifcfg-开头的文件,并且其中包含了指定网卡的MAC,则以ifcfg文件中的DEVICE字段给写的名称命名。

2./usr/lib/udev/rules.d/71-biosdevname.rules(biosdevname基于BIOS信息自动命名)

如果ifcfg开头的文件中找不到对应的配置,则看系统是否安装了biosdevname程序包,并且系统未设备参数biosdevname=0,则按biosdevname命名标准为网卡命名。

3./lib/udev/rules.d/75-net-description.rules(systemd-udev基于systemd-udev基于网卡信息命名)

如果1,2两条规则都没有命中则查看网卡信息,基于网卡信息指定的字段命名。

4./usr/lib/udev/rules.d/80-net-name-slot.rules(systemd-udev基于systemd-udev基于BIOS信息命名)

网卡信息都没有指定的字段,则按BIOS获取的板载槽位信息命名。

总结:自定义配置的优先级、其次是biosdevname、最后是systemd-udev自动配置

四、恢复网卡传统命名标准

从以上命名策略与命名规则来看,响应网卡命名的应该就是受biosdevname、net.ifnames两个参数影响,官方也给出两个参数的默认值:iosdevname=0是系统默认值(dell服务器默认是1),net.ifnames=1是系统默认值

如果想恢复以前的传统命名规范则只需要在grub文件中将两个参数设置为0即可,具体操作过程如下:

1.编辑/etc/sysconfig/grub文件,在GRUB_CMDLINE_LINUX字段最后添加net.ifnames=0 biosdevname=0

2.重新生成配置文件grub配置文件,执行如下命名

grub2-mkconfig -o /boot/grub2/grub.cfg

3.手动编辑/etc/sysconfig/network-scripts/目录下的ifcf-开头的文件,注意:HWADDR字段要与待命名的网卡MAC地址对应,或者UUID字段与网卡的UUID对应也可以。

4、重启系统。