
网卡名称命名原理和修改方法
网卡名称命名原理和修改方法
一、命名规则策略
规则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:
- /usr/lib/udev/rules.d/60-net.rules
- /usr/lib/udev/rules.d/71-biosdevname.rules
- /usr/lib/udev/rules.d/75-net-description.rules
- /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参数,然后重启电脑。
更多推荐