目录

​​背景​​

​​一致网络设备命名规范​​

​​biosdevname​​

​​net.ifnames​​

​​系统默认命名规则​​

​​流程​​

​​rename 流程​​

​​scheme 次序​​

​​用户自定义网卡名称​​

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

​​biosdevname​​

​​net.ifname​​

​​修改网卡名称​​

​​背景​​

​​流程​​

​​编辑 grub 配置文件​​

​​重新生成 grub 配置文件​​

​​修改网卡配置文件​​


Linux 操作系统的网卡设备的传统命名方式是 eth0、eth1、eth2等,而 CentOS7 提供了不同的命名规则,默认是网卡命名会根据网卡的硬件信息,插槽位置等有关;来分配。这样做的优点是命名全自动的、可预知的,缺点是比 eth0、wlan0 更难读,比如 ens33 。

背景

服务器通常有多块网卡,有板载集成的,同时也有插在PCIe插槽的。
Linux系统的命名原来是eth0,eth1这样的形式,但是这个编号往往不一定准确对应网卡接口的物理顺序。

细心的同学会留意到从centos7开始一些比如ens enp等开头的网卡名称,简单了解,可以解释为centos7开始,网卡命名会根据网卡的硬件信息,插槽位置等有关;
而网上也有为那些依然想使用ethX方式命名的提供了策略。比如在内核启动参数里增加biosdevname=0 net.ifnames=0;

为什么centos7不再使用以前的ethX方式?根本是因为之前ethX方式是不确定的,每次启动可能都不同(如果没有用户自定义网卡名称的前提下);

一致网络设备命名规范

在centos5的时候,我们习惯了eth0这样的网络设备命名,在centos6发现网络设备变成了em1这样的命名。
那时我们在安装的时候,给启动参数加上 biosdevname=0,就可以继续使用eth0这样的命名。
升级到centos7后,发现原有的参数biosdevname=0不起作用了,网络设备变成了eno1这样的名称。
centos7这种变化的原因是由于systemd和udev引入了一种新的网络设备命名方式:一致网络设备命名(CONSISTENT NETWORK DEVICE NAMING)。
一致网络设备命名(CONSISTENT NETWORK DEVICE NAMING)规范,支持 biosdevname 和 net.ifnames 两种命名规范。

biosdevname

biosdevname 命名规范

设备

旧名称

新名称

示例

内嵌网络接口(LOM)

eth[0123…]

em[1234…][a]

em1

PCI 卡网络接口

eth[0123…]

pp[b]

p3p4

虚拟功能

eth[0123…]

pp_[c]

p3p4_1

注: 新枚举从 1 开始。

net.ifnames

net.ifnames 命名规范为:设备类型 + 设备位置 + 数字

设备类型

  • ​en​​ 代表以太网
  • ​wl​​ 代表无线局域网(WLAN)
  • ​ww​​ 代表无线广域网(WWAN)

设备命名

格式

描述

o<index> :on-board device index number

板载设备索引号

s<slot>[f<function>][d<dev_id>]  :hotplug slot index number

热插拔插槽索引号

x<MAC>:MAC address

MAC 地址

p<bus>s<slot>[f<function>][d<dev_id>]: PCI geographical location

PCI 地理位置

p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>]:USB port number chain

USB 端口链

示例

  • ​eno1​​ 板载1号网卡
  • ​enp0s2​​ PCI扩展卡的2号端口
  • ​ens33​​ 热插拔插槽3号PCI-E插槽的3号端口
  • ​wlp3s0​​ 第3号PCI扩展卡的0号端口

系统默认命名规则

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

  • Scheme 1(方案 1): 如果从BIOS中能够取到可用的,板载网卡的索引号,则使用这个索引号命名,例如: eno1,如不能则尝试Scheme 2
  • Scheme 2(方案 2): 如果从BIOS中能够取到可以用的,网卡所在的PCI-E热插拔插槽的索引号,则使用这个索引号命名,例如: ens1,如不能则尝试Scheme 3
  • Scheme 3(方案 3): 如果能拿到设备所连接的物理位置信息,则使用这个信息命名,例如:enp2s0,如不能则尝试Scheme 5
  • Scheme 4(方案 4): 使用网卡的MAC地址来命名,这个方法一般不使用。
  • Scheme 5(方案 5):传统的kernel命名方法,例如: eth0,这种命名方法的结果不可预知的,即可能第二块网卡对应eth0,第一块网卡对应eth1。

流程

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

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

rename 流程

默认rename流程:
按照如下顺序执行udev的rule
1./usr/lib/udev/rules.d/60-net.rules
2./usr/lib/udev/rules.d/71-biosdevname.rules
3./lib/udev/rules.d/75-net-description.rules
4./usr/lib/udev/rules.d/80-net-name-slot.rules

step1 依据/usr/lib/udev/rules.d/60-net.rules, 查看是否有ifcfg-xx配置文件(路径在/etc/sysconfig/network-scripts/),是否有定义了指定MAC地址的配置文件(ifcfg-xx ,xx必须和配置文件的内容DEVICE一致),如果有,则命名该网卡;

step2 依据/usr/lib/udev/rules.d/71-biosdevname.rules,如果biosdevname使能了(安装了biosdevname这个包,且内核启动参数显式设置为1),且网卡没有在step1中定义,则按照biosdevname命名规则rename网卡;(注意,如果没有安装biosdevname这个包,就没有这个文件)

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

step4,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)

linux 下 网卡命名改名_配置文件

eth2这个网卡,scheme名称有3个,如果systemd自选,会使用哪个?ens5f0.(那这个为什么是/sys/class/net/eth2 而不是/sys/class/net/ens5f0 ,那是因为自定义的缘故;)

用户自定义网卡名称

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,所以用户不应该同时采用里两种方式给同一个网卡命不同的名称;

/etc/udev/udev.conf是udev主配置文件,用户定制的规则文件在/etc/udev/rules.d目录下。对于网卡设备的配置一般社区约定的是/etc/udev/rules.d/70-persistent-net.rules文件。

示例内容如下:
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="24:6e:96:03:5c:8d", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

上述规则内容描述的是在内核发现有网络设备添加时,内核网络设备描述名文eth*格式的设备,变名为eth0.

内核启动参数biosdevnane、net.ifnames

默认就是内核启动参数没有biosdevname 也没有net.ifnames 参数;

其实默认是net.ifnames=1,biosdevname=0;这种情况下就按照rename 中进行网卡命名;eno-ens-enp的方式逐个匹配。
但是如果使能了biosdevname.则会使用biosdevname的命名 step1没有命名的网卡;要么是em开头,要么是p开头;

biosdevname

怎么样使能biosdevname呢?
2个条件:
1》安装biosdevname包
2》在内核启动参数中明确 biosdevname=1. 否则使能不了;
但是不管怎么样,如果用户自定义了udev rules,则用户自定义的rules优先!
这是总述,但凡用户自定义rules,优先级最高;

net.ifname

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

修改网卡名称

背景

如果不习惯使用新的命名规则,可以恢复使用传统的方式命名;另外我们在做一些操作的时候,往往需要进行批量处理,如果说每台主机的网卡名都是一样的,这就给我们提供了很大的便利,我们可以进行批处理操作;

流程

编辑 grub 配置文件

vim /etc/sysconfig/grub   # 其实是/etc/default/grub的软连接

# 为GRUB_CMDLINE_LINUX变量增加2个参数,具体内容如下:GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap net.ifnames=0 biosdevname=0 rhgb quiet"

重新生成 grub 配置文件

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

修改网卡配置文件

原来网卡配置文件名称为 ifcfg-ens33,这里需要修改为 ethx 的格式,并适当调整网卡配置文件。
mv /etc/sysconfig/network-scripts/ifcfg-ens33  /etc/sysconfig/network-scripts/ifcfg-eth0# 修改ifcfg-eth0文件如下内容(其它内容不变)
NAME=eth0
DEVICE=eth0
# systemctl restart network.service    # 重启网络服务