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
注: 新枚举从 1 开始。
net.ifnames
net.ifnames 命名规范为:设备类型 + 设备位置 + 数字
设备类型
en 代表以太网
wl 代表无线局域网(WLAN)
ww 代表无线广域网(WWAN)
设备命名
示例
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)
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 # 重启网络服务