为什么需要这个?
服务器通常有多块网卡,有板载集成的,同时也有插在PCIe插槽的。Linux系统的命名原来是eth0,eth1这样的形式,但是这个编号往往不一定准确对应网卡接口的物理顺序
为解决这类问题,dell开发了biosdevname方案。systemd v197版本中将dell的方案作了进一步的一般化拓展。目前的Centos既支持dell的biosdevname,也支持systemd的方案
CentOS 7 中的命名策略:
Scheme 1:如果从 BIOS 中能够读取到可用的,板载网卡的索引号,则使用这个索引号命名,例如:eno1,如不能则
尝试 Scheme 2
Scheme 2:如果从 BIOS 中能够读取到可用的,网卡所在的 PCI-E 热插拔槽(注:pci 槽位号)的索引号,则使用这个索引号
命名,例如:ens33,如不能则尝试 Scheme 3
可以使用 lspci -v 查看网卡所在的 PCI-E 槽位( Physical Slot )
Scheme 3:如果能拿到设备所连接的物理位置( PCI 总线号+槽位号)信息,则使用这个信息命名,例如:enp2s0,如不能则
尝试 Scheme 4
Scheme 4:使用网卡的 MAC 地址来命名,例如:enx000c29d683aa 。默认不开启
Scheme 5:使用传统的 kernel 命名方法,例如:eth0,这种命名方法的结果不可预知,即可能第二块网卡对应 eth0,第一块
网卡对应 eth1
CentOS 7 开机内核检测到的网卡信息:
[root@web ~]# dmesg | grep -i eth
[ 2.297646] e1000 0000:02:01.0 eth0: (PCI:66MHz:32-bit) 00:0c:29:d6:83:8c
[ 2.297660] e1000 0000:02:01.0 eth0: Intel(R) PRO/1000 Network Connection
[ 2.688274] e1000 0000:02:02.0 eth1: (PCI:66MHz:32-bit) 00:0c:29:d6:83:96
[ 2.688282] e1000 0000:02:02.0 eth1: Intel(R) PRO/1000 Network Connection
[ 3.074626] e1000 0000:02:06.0 eth2: (PCI:66MHz:32-bit) 00:0c:29:d6:83:a0
[ 3.074635] e1000 0000:02:06.0 eth2: Intel(R) PRO/1000 Network Connection
biosdevname 和 net.ifnames 两种命名规范
net.ifnames 的命名规范为:设备类型+设备位置+数字
设备类型:
en 表示 Ethernet
wl 表示 WLAN
ww 表示无线广域网
实例的例子:
eno1 板载网卡
enp0s2 第0号 PCI 总线的2号槽位网卡
ens33 PCI 的 Physical Slot 为 33
wwp0s29f7u2i2 4G modem
wlp0s2f1u4u1 连接在 USB Hub 上的无线网卡
enx78e7d1ea46da pci网卡
biosdevname 的命名规范
实际的例子:
em1 板载网卡
p3p4 pci 网卡
p3p4_1 虚拟网卡
systemd 中的实际执行顺序:
按照如下顺序执行 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
1)60-net.rules
使用 /lib/udev/rename_device 这个程序,去查询 /etc/sysconfig/network-scripts/ 下所有以 ifcfg- 开头的文件,如果在 ifcfg-xx 中匹配到 HWADDR=xx:xx:xx:xx:xx:xx 参数的网卡接口则选取 DEVICE=yyyy 中设置的名字作为网卡名称
2)71-biosdevname.rules
如果系统中安装了 biosdevname ,且内核参数指定 biosdevname=1,且上一步没有重命名网卡,则按照 biosdevname 的命名规范,从 BIOS 中获取相关信息来命名网卡
主要是取 SMBIOS 中的 type 9(System Slot)和 type 41(Onboard Devices Extended Information)不过要求 SMBIOS 的版本要高于 2.6,且系统中要安装 biosdevname 程序
3)75-net-description.rules
udev 通过检查网卡信息,填写如下这些 udev 的属性值
ID_NET_NAME_ONBOARD
ID_NET_NAME_SLOT
ID_NET_NAME_PATH
ID_NET_NAME_MAC
查看读取到的网卡信息的属性值:
udevadm info /sys/class/net/ifname | grep ID_NET_NAME
4)80-net-name-solt.rules
如果在60-net.rules ,71-biosdevname.rules这两条规则中没有重命名网卡,且内核指定net.ifnames=1参数,则udev依次尝试使用以下属性值来命名网卡,如果这些属性值都没有,则网卡不会被重命名
ID_NET_NAME_SLOT
ID_NET_NAME_PATH
ID_NET_NAME_MAC
上边的71-biosdevname.rules 是实际执行biosdevname的策略;75-net-description.rules和80-net-name-slot.rules实际执行上面策略的2,3,4
根据上述的过程,可见网卡命名受 biosdevname和net.ifnames这两个内核参数影响。这两个参数都可以在grub配置中提供
biosdevname=0是系统默认值(dell服务器默认是1),net.ifnames=1是系统默认值
配置 CentOS 7 使用传统的网卡接口命名方式:
编辑内核参数:
[root@web ~]# vim /etc/default/grub
……
GRUB_CMDLINE_LINUX="net.ifnames=0 crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
……
为grub2生成配置文件:
编辑完grub配置文件以后不会立即生效,需要生成配置文件
[root@web ~]# grub2-mkconfig -o /etc/grub2.cfg
然后重新启动系统
Note:以前提供的配置文件就不可以使用啦,需要重新提供配置文件