安装依赖 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=0GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet net.ifnames=1 biosdevname=1"
重新生成image # grub2-mkconfig -o /boot/grub2/grub.cfg
重启
所以大家提供的这种办法其实是不好的;
解释完上面内容之后,咱们来看下到底网卡名称是如何命名的。 核心流程:明确一点是,linux内核启动过程中,会默认给网卡以ethX方式随机命名,然后再通过systemd去rename成其他名称。关键字,rename!设备类型:
en 表示Ethernetwl 表示WLANww 表示无线广域网WWAN设备位置:
FormatDescriptiono<index>on-board device index numbers<slot>[f<function>][d<dev_id>]hotplug slot index numberx<mac>MAC addressp<bus>s<slot>[f<function>][d<dev_id>]PCI geographical locationp<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>]USB port number chain实际的例子:
eno1 板载网卡enp0s2 pci网卡ens33 pci网卡wlp3s0 PCI无线网卡wwp0s29f7u2i2 4G modemwlp0s2f1u4u1 连接在USB Hub上的无线网卡enx78e7d1ea46da pci网卡实际的例子:
em1 板载网卡p3p4 pci网卡p3p4_1 虚拟网卡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=0,且上一步没有重命名网卡,则按照biosdevname的命名规范,从BIOS中取相关信息来命名网卡。主要是取SMBIOS中的type 9 (System Slot) 和 type 41 (Onboard Devices Extended Information)不过要求SMBIOS的版本要高于2.6,且系统中要安装biosdevname程序。
step3, 依据/lib/udev/rules.d/75-net-description.rules,将udev工具会根据device属性将填写网卡的属性命名,可能一个网卡会有多个维度的名称哦;
udevadm info /sys/class/net/eth0 | grep NAME ID_NET_NAME_ONBOARD ID_NET_NAME_SLOT ID_NET_NAME_PATH ID_NET_NAME_MAC
step4, /usr/lib/udev/rules.d/80-net-name-slot.rules 如果在60-net.rules ,71-biosdevname.rules这两条规则中没有重命名网卡,且内核未指定net.ifnames=0参数 则udev依次尝试使用以下属性值来命名网卡,如果这些属性值都没有,则网卡不会被重命名。
ID_NET_NAME_ONBOARD ID_NET_NAME_SLOT ID_NET_NAME_PATH
step5,udev 根据step3中的赋值,按照指定的scheme规则,去给在step1 step2中没有命名的网卡命名;
强调:这个step顺序是在我们没有自定义自己的rules的前提下,如果用户自定义了自己的rules,则用户自定义为优先级最高;
上面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,所以用户不应该同时采用里两种方式给同一个网卡命不同的名称;
默认就是内核启动参数没有biosdevname 也没有net.ifnames 参数(其实默认是net.ifnames=1,biosdevname=0)这种情况下就按照一 中进行网卡命名;eno-ens-enp的方式逐个匹配。但是如果使能了biosdevname.则会使用biosdevname的命名 step1没有命名的网卡;
要么是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这种不确定性的命名方式;
内核在boot 过程是默认使用ethX方式来命名的,每次启动的时候都不确定,启动会后再通过udev等方式去rename,