修改方法
安装依赖 yum install initscripts biosdevname
- 修改/etc/default/grub
- 在 GRUB_CMDLINE_LINUX 后面添加如下 参数,
- 需要 em[id] 添加 net.ifnames=1 biosdevname=1
- 需要 eth[id] 添加 net.ifnames=0 biosdevname=0
- 需要 enp0s2 添加 net.ifnames=1 biosdevname=0
GRUB_CMDLINE_LINUX=”crashkernel=auto rhgb quiet net.ifnames=1 biosdevname=1″
- 重新生成image #
grub2-mkconfig -o /boot/grub2/grub.cfg
- 重启
以下是命名规则
从centos7开始,系统默认的网卡命名有已经不是我们熟悉的ethX方式了,细心的同学会留意到一些比如ens enp等开头的网卡名称,简单了解,可以解释为centos7开始,网卡命名会根据网卡的硬件信息,插槽位置等有关;
而网上也有为那些依然想使用ethX方式命名的提供了策略。比如在内核启动参数里增加biosdevname=0 net.ifnames=0;
但是这里忽略了 一个问题,那就是为什么centos7不再使用以前的ethX方式?根本是因为之前ethX方式是不确定的,每次启动可能都不同(如果没有用户自定义网卡名称的前提下);
所以大家提供的这种办法其实是不好的;
解释完上面内容之后,咱们来看下到底网卡名称是如何命名的。
核心流程:明确一点是,linux内核启动过程中,会默认给网卡以ethX方式随机命名,然后再通过systemd去rename成其他名称。关键字,rename!
biosdevname和net.ifnames两种命名规范
net.ifnames的命名规范为:
设备类型:
- en 表示Ethernet
- wl 表示WLAN
- ww 表示无线广域网WWAN
设备位置:
Format | Description |
---|---|
o<index> | on-board device index number |
s<slot>[f<function>][d<dev_id>] | hotplug slot index number |
x<mac> | MAC address |
p<bus>s<slot>[f<function>][d<dev_id>] | PCI geographical location |
p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>] | USB port number chain |
实际的例子:
- eno1 板载网卡
- enp0s2 pci网卡
- ens33 pci网卡
- wlp3s0 PCI无线网卡
- wwp0s29f7u2i2 4G modem
- wlp0s2f1u4u1 连接在USB Hub上的无线网卡
- enx78e7d1ea46da pci网卡
biosdevname的命名规范为
实际的例子:
- em1 板载网卡
- p3p4 pci网卡
- p3p4_1 虚拟网卡
一、如何rename?
默认rename流程:
- step1 依据/usr/lib/udev/rules.d/60-net.rules, 查看是否有ifcfg-xx配置文件(路径在/etc/sysconfig/network-scripts/),是否有定义了指定MAC地址的配置文件(ifcfg-xx ,xx必须和配置文件的内容DEVICE一致),如果有,则命名改网卡;
- 如果 /etc/udev/rules.d/70-persistent-net.rules 地址与 ifcfg-xx 匹配使用自定义网卡名
-
# cat /etc/udev/rules.d/70-persistent-net.rules SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:9f:c8:dd", NAME="aaa" # cat /etc/sysconfig/network-scripts/ifcfg-aaa | grep -E 'aaa|MACADDR' NAME="aaa" DEVICE="aaa" MACADDR="00:0c:29:9f:c8:dd"
- step2 依据/usr/lib/udev/rules.d/71-biosdevname.rules, 如果系统中安装了biosdevname,且内核参数未指定biosdevname=0,且上一步没有重命名网卡,则按照biosdevname的命名规范,从BIOS中取相关信息来命名网卡。主要是取SMBIOS中的type 9 (System Slot) 和 type 41 (Onboard Devices Extended Information)不过要求SMBIOS的版本要高于2.6,且系统中要安装biosdevname程序。
-
# cat /usr/lib/udev/rules.d/71-biosdevname.rules # whitelist all Dell systems ATTR{[dmi/id]sys_vendor}=="Dell*", ENV{UDEV_BIOSDEVNAME}="1" # 是 Dell 型号设置 biosdevname=1 # kernel command line "biosdevname={0|1}" can turn off/on biosdevname IMPORT{cmdline}="biosdevname" # 从GRUB启动项重置 biosdevname 配置 ENV{UDEV_BIOSDEVNAME}=="0", GOTO="netdevicename_end" # 如果 biosdevname = 0 跳出 end ENV{UDEV_BIOSDEVNAME}=="1", GOTO="netdevicename_start" # 如果 biosdevname = 1 执行 netdevicename_start # off by default GOTO="netdevicename_end" LABEL="netdevicename_start" # using NAME= instead of setting INTERFACE_NAME, so that persistent # names aren't generated for these devices, they are "named" on each boot. SUBSYSTEMS=="pci", PROGRAM="/sbin/biosdevname --smbios 2.6 --nopirq --policy physical -i %k", NAME="%c" OPTIONS+="string_escape=replace" # 执行 /sbin/biosdevname 命令 LABEL="netdevicename_end"
-
- step3, 依据/lib/udev/rules.d/75-net-description.rules,将udev工具会根据device属性将填写网卡的属性命名,可能一个网卡会有多个维度的名称哦;
# udevadm info /sys/class/net/aaa | grep NAME
E: ID_NET_NAME_MAC=enx000c299fc8dd
E: ID_NET_NAME_PATH=enp4s0
E: ID_NET_NAME_SLOT=ens161 - step4, /usr/lib/udev/rules.d/80-net-name-slot.rules 如果在60-net.rules ,71-biosdevname.rules这两条规则中没有重命名网卡,且内核未指定net.ifnames=0参数 则udev依次尝试使用以下属性值来命名网卡,如果这些属性值都没有,则网卡不会被重命名。
-
# cat /usr/lib/udev/rules.d/80-net-name-slot.rules # do not edit this file, it will be overwritten on update ACTION!="add", GOTO="net_name_slot_end" SUBSYSTEM!="net", GOTO="net_name_slot_end" NAME!="", GOTO="net_name_slot_end" IMPORT{cmdline}="net.ifnames" # 从 GRUB 读取 net.ifnames 配置, net.ifnames = 0 跳出 net.ifnames = 1 按照下面顺序配置 ENV{net.ifnames}=="0", GOTO="net_name_slot_end" NAME=="", ENV{ID_NET_NAME_ONBOARD}!="", NAME="$env{ID_NET_NAME_ONBOARD}" # 没有名字,ID_NET_NAME_ONBOARD这个ENV存在,用ID_NET_NAME_ONBOARD作为名字 NAME=="", ENV{ID_NET_NAME_SLOT}!="", NAME="$env{ID_NET_NAME_SLOT}" # 没有名字,ID_NET_NAME_SLOT这个ENV存在,用ID_NET_NAME_SLOT作为名字 NAME=="", ENV{ID_NET_NAME_PATH}!="", NAME="$env{ID_NET_NAME_PATH}" # 没有名字,ID_NET_NAME_PATH这个ENV存在,用ID_NET_NAME_PATH作为名字 LABEL="net_name_slot_end"
-
- step5,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)
# qemu xml 配置
<interface type='bridge'>
<mac address='52:54:00:b5:4d:84'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</interface>
[root@aikaiyuan ~]# lspci | grep Eth
00:02.0 Ethernet controller: Red Hat, Inc. Virtio network device
00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device
[root@aikaiyuan ~]# udevadm info /sys/class/net/eth0 | grep NAME
E: ID_NET_NAME_MAC=enx525400b54d84
E: ID_NET_NAME_PATH=enp0s2
E: ID_NET_NAME_SLOT=ens2
E: UDEV_BIOSDEVNAME=0
[root@aikaiyuan ~]#
eth0这个网卡,scheme名称有3个,如果systemd自选,会使用哪个?ens2.(那这个为什么是/sys/class/net/eth0 而不是/sys/class/net/ens2 ,那是因为自定义
在我们未修改/etc/default/grub
之前系统默认就是ens2
三、用户自定义网卡名称
- 在用户没有自定义rules文件前提下,step1中的网卡命名方式也可认为是 一种用户自定义的网卡命名,即在/etc/sysconfig/network-scripts/ifcfg-xx 文件,xx就是这个网卡名称,文件内容中体现MAC_ADDRESS、NAME,这种情况下,则会按照配置文件中指定的名称来命名网卡;
- 如果用户自定义了rules文件,放在/etc/udev/rules.d/目录下,则这个优先级是最高的;比1中ifcfg-xx方式优先级更高,但是如果两者不一致,则在重启network服务时,会依据ifcfg-xx,所以用户不应该同时采用里两种方式给同一个网卡命不同的名称;
四、内核启动参数biosdevnane、net.ifnames
默认就是内核启动参数没有biosdevname 也没有net.ifnames 参数(其实默认是net.ifnames=1,biosdevname=0)这种情况下就按照一 中进行网卡命名;eno-ens-enp的方式逐个匹配。但是如果使能了biosdevname.则会使用biosdevname的命名 step1没有命名的网卡;
bios命名规则:
要么是em开头,要么是p开头;
怎么样使能biosdevname呢?2个条件,安装biosdevname包,且在内核启动参数中明确 biosdevname=1. 否则使能不了;
但是不管怎么样,如果用户自定义了udev rules,则用户自定义的rules优先!
这是总述,但凡用户自定义rules,优先级最高;
内核启动参数net.ifname,
如果在启动参数中增加net.ifname=0,这个文件会在/lib/udev/rule.d/80-net-name-slot.rules体现使用价值,则告诉系统不用scheme的方式来命名,这个时候,会恢复ethx这种不确定性的命名方式;
五、 不要用ethX去命名
内核在boot 过程是默认使用ethX方式来命名的,每次启动的时候都不确定,启动会后再通过udev等方式去rename,
参考
转载请注明:爱开源 » CentOS 7 CentOS 8 网卡命名规则