一、命名规则策略


规则1:

命名依据BIOS提供的在线硬件索引号;如果信息可读就命名,比如:eno1,否则使用规则2

规则2:

命名依据BIOS提供的PCI-E热插拔口索引号,如果信息可读就命名,比如:ens1,否则使用规则3

规则3:

命名依据硬件接口的物理位置,如果信息可读就命名,比如enp2s0,否则直接到规则5

规则4:

命名依据接口的MAC地址,默认不使用,除非用户选择使用此方案。比如enx78e7d1ea46da

规则5:

使用传统的方案,如果所有的方案都失败,则使用eth0这种样式。

二、网卡eth0命名


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

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

三、核心流程


核心流程:Linux内核启动过程中,会默认给网卡以eth0方式随机命名,然后再通过systemd去rename成其他名称。

(1)如何rename?

默认rename流程,按照如下顺序执行udev的rule:

  1. /usr/lib/udev/rules.d/60-net.rules
  2. /usr/lib/udev/rules.d/71-biosdevname.rules
  3. /usr/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,依据/usr/lib/udev/rules.d/75-net-description.rules,将udev工具会根据device属性将填写网卡的属性命名,可能一个网卡会有多个维度的名称哦;

step4,udev根据step3中的赋值,按照指定的scheme规则,去给在step1 step2中没有命名的网卡命名;

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

(2)scheme次序

上面step4中提到,按照指定的scheme规则,这个规则是什么呢?首先说step3中,提到按照网卡的不同属性命名,系统识别网卡有好几种维度:

  • BIOS提供的在线硬件索引号 (example:eno1),
  • BIOS提供的PCI-E热插拔口索引号 (example:ens1)
  • 硬件接口的物理位置 (example:enp2s0),
  • 接口的MAC地址

同一个网卡通常同时具有多个维度的名称,systemd在选取的时候,按照有先后次序,使用先命中的;顺序可以简单理解为(eno1>ens1>enp1)

问:eth2这个网卡,scheme名称有3个,如果systemd自选,会使用哪个?

答:ens5f0.

问:那这个为什么是/sys/class/net/eth2而不是/sys/class/net/ens5f0

答:那是因为自定义的缘故,自定义拥有最高优先权

(3)用户自定义网卡名称

在用户没有自定义rules文件前提下,step1中的网卡命名方式也可认为是一种用户自定义的网卡命名,即在/etc/sysconfig/network-scripts/ifcfg-xx文件,xx就是这个网卡名称,文件内容中体现MAC_ADDRESS、NAME,这种情况下,则会按照配置文件中指定的名称来命名网卡;

如果用户自定义了rules文件(一般命名为70-persistent-net.rules),放在/etc/udev/rules.d/目录下,则这个优先级是最高的;比ifcfg-xx方式优先级更高,但是如果两者不一致,则在重启network服务时,会依据/etc/udev/rules.d下的用户定制配置文件。

(4)内核启动参数

biosdevnane

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

怎么样使能biosdevname呢?2个条件(缺一不可):

  • 安装biosdevname包
  • 在内核启动参数中明确biosdevname=1.

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

综上所述,但凡用户自定义rules,优先级最高;

net.ifnames

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

四、不要用eth0去命名


内核在boot过程是默认使用eth0方式来命名的,每次启动的时候都不确定,启动会后再通过udev等方式去rename。网络形成时间会延长

五、修改网卡名称样式为eth0(网络中比较流行的,适用于Red-hat系列Linux)


如果不习惯使用新的命名规则,可以恢复使用传统的方式命名,编辑grub文件,增加两个变量,再使用grub2-mkconfig重新生成grub配置文件即可。

  • 编辑grub配置文件
vim/etc/sysconfig/grub              #其实是/etc/default/grub的软连接

为GRUB_CMDLINE_LINUX变量增加2个参数,具体内容如下:

GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifnames=0 biosdevname=0"

  • 重新生成grub配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg

然后重新启动Linux操作系统,通过ip a可以看到网卡名称已经变为eth0。

  • 修改网卡配置文件

原来网卡配置文件名称为ifcfg-ens12,这里需要修改为eth0的格式,并适当调整网卡配置文件。

mv /etc/sysconfig/network-scripts/ifcfg-ens12 /etc/sysconfig/network-scripts/ifcfg-eth0        #修改ifcfg-eth0文件如下内容(其它内容不变)
  • NAME=eth0
  • DEVICE=eth0
systemctl restart network.service #重启网络服务

六、修改网卡名称样式为eth0(另辟蹊径)


直接在/usr/lib/udev/rules.d/60-net.rules配置文件中修改对应网卡信息如下:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", NAME=="eth0"

其中XX:XX:XX:XX:XX:XX是硬件的MAC地址

同时修改/etc/sysconfig/network-scripts/ifcfg-eth0以及配置文件中的两个参数即可

  • NAME=eth0
  • DEVICE=eth0

 七、修改网卡名称样式为eth0(我喜欢的方法)


直接在/etc/udev/rules.d/中创建或修改70-persistent-net.rules文件,加上或修改信息为:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", NAME=="eth0"

如果IP地址是自动获取(DHCP),就可以重启电脑了

如果IP地址是手动输入,就修改NAME和DEVICE参数,然后重启电脑。 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐