一.前言:
在早期的的操作系统中例如fedora13或者ubuntu15之前网卡命名的方式为eth0,eth1,eth2,属于biosdevname 命名规范。当然这是针对intel网卡的命名规则,对于realtek类型的网卡会命名为ens33。但是这个编号往往不一定准确对应网卡接口的物理顺序,为了能够方便定位和区分网络设备,目前linux的主流操作系统采用一致网络设备命名(CONSISTENT NETWORK DEVICE NAMING)规范。
二.一致网络设备命名规则(CONSISTENT NETWORK DEVICE NAMING)
命名规范为:设备类型 + 设备位置
1. 设备类型
en 代表以太网
wl 代表无线局域网(WLAN)
ww 代表无线广域网(WWANs)
2. 设备位置
格式 | 含义 |
o<on-board_index_number> | 主板bios内置的网卡 |
s<hot_plug_slot_index_number>[f<function>][d<device_id>] | 主板bios内置的PCI-E网卡 |
x<MAC> | MAC 地址 |
p<bus>s<slot>[f<function>][d<device_id>] | PCI-E独立网卡 |
[P<domain_number>]p<bus>s<slot>[f<function>][u<usb_port>][…][c<config>][i<interface>] | USB网卡 |
例如:
eno1 板载1号网卡
enp0s2 以太网0号PCI扩展卡的2号端口
ens33 由主板 BIOS 内置的 PCI-E 接口的网卡
wlp1s0 无线第1号PCI扩展卡的0号端口
3.优势
(1) 设备名称是完全可预测的。
(2) 即使添加或删除硬件,设备名称也保持固定,因为不会发生重新枚举。
(3) 有缺陷的硬件可以无缝更换。
三.系统默认命名规则
1. systemd rename流程
以centos7为例,系统默认用于网卡设备重命名的服务是systemd-udevd,我们可以使用systemctl status systemd-udevd来查看目前该服务的状态
在centos7中, systemd命名网卡的规则是根据一下6个配置文件来的
/lib/udev/rules.d/60-net.rules
/lib/udev/rules.d/71-biosdevname.rules
/lib/udev/rules.d/75-net-description.rules
/lib/udev/rules.d/80-net-name-slot.rules
/lib/udev/rules.d/80-net-setup-link.rules
/lib/udev/rules.d/99-systemd.rules
(1) 第一步: /lib/udev/rules.d/60-net.rules
使用/lib/udev/rename_device这个程序,首先查询/etc/sysconfig/network-scripts/下所有以ifcfg-开头的文件
如果在ifcfg-xx中匹配到HWADDR=xx:xx:xx:xx:xx:xx参数的网卡接口
则选取DEVICE=yyyy中设置的名字作为网卡名称。
ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", RESULT=="?", NAME="$result"
在不修改 udev 规则的条件下,/etc/sysconfig/network-scripts/的 ifcfg-* 文件的优先最高。在ifcfg-*文件中将DEVICE 和 mac 绑定后重命名网卡名称和避免网卡乱序。
(2)第二步:/lib/udev/rules.d/71-biosdevname.rules
如果系统中安装了biosdevname,且内核参数未指定biosdevname=0,且上一步没有重命名网卡,则按照biosdevname的命名规范,从BIOS中取相关信息来命名网卡。
主要是取SMBIOS中的type 9 (System Slot) 和 type 41 (OnboardDevices Extended Information)
(3)第三步: /lib/udev/rules.d/75-net-description.rules
/lib/udev/rules.d/75-net-description.rules 中的规则让 udev 通过检查网络接口设备,填写内部 udev 设备属性值 ID_NET_NAME_ONBOARD、ID_NET_NAME_SLOT、ID_NET_NAME_PATH,但是有些设备属性可能处于未定义状态。
可以通过udevadm test-builtin net_id /sys/class/net/xxx 网络接口比如ens33来查看相关属性。
(4)第四步: /lib/udev/rules.d/80-net-name-slot.rules
如果在60-net.rules ,71-biosdevname.rules这两条规则中没有重命名网卡,且内核未指定net.ifnames=0参数,udev依次尝试来自udev规则文件75-net-description.rules属性值来命名网卡,
如果这些属性值都没有,则网卡不会被重命名,沿用内核给定的ethx来命名
(5)第五步 /lib/udev/rules.d/80-net-setup-link.rules
用内建的的path_id 和net_setup_link来查询 键值ID_NET_NAME,并赋给设备名字
NAME=="", ENV{ID_NET_NAME}!="", NAME="$env{ID_NET_NAME}"
(6)第六步 /lib/udev/rules.d/99-systemd.rules
用sysctl 改变内核的一些默认参数
/lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/name --prefix=/net/ipv6/conf/name
所以针对60-net.rules, 可以添加类似如下规则文件去固定命名。
# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?", ATTR{address}=="08:00:27:84:e3:82", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth", NAME="eth0"
/# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?", ATTR{address}=="08:00:27:f0:c8:7f", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth", NAME="eth2"
/# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?", ATTR{address}=="08:00:01:63:bd:f1", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth", NAME="eth1"
也可以修改/etc/sysconfig/network-scripts/下的 ifcfg-* 文件,在ifcfg-*文件中将DEVICE 和 mac 绑定,固定网卡名称,其中device条目即为设备名字,如DEVICE=eno2
强调:这个step顺序是在我们没有自定义自己的rules的前提下,如果用户自定义了自己的rules,则用户自定义为优先级最高;
2.scheme次序
systemd 会使用以下策略,采用支持的命名方案为接口命名:
Scheme 1(方案 1): 如果从BIOS中能够取到可用的板载网卡的索引号,则使用这个索引号命名,例如: eno1,如不能则尝试Scheme 2
Scheme 2(方案 2): 如果从BIOS中能够取到可以用的网卡所在的PCI-E热插拔插槽的索引号,则使用这个索引号命名,例如: ens1,如不能则尝试Scheme 3
Scheme 3(方案 3): 如果能拿到设备所连接的物理位置信息,则使用这个信息命名,例如:enp2s0,如不能则尝试Scheme 5
Scheme 4(方案 4): 使用网卡的MAC地址来命名,这个方法一般不使用。enx78e7d1ea46da
Scheme 5(方案 5):传统的kernel命名方法,例如: eth0,这种命名方法的结果不可预知的,即可能第二块网卡对应eth0,第一块网卡对应eth1。
四.修改为biosdevname命名规则
1. 修改启动参数
(1)编辑/etc/default/grub
root@ubuntu:~# vi /etc/default/grub
找到GRUB_CMDLINE_LINUX=""
改为GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
(2)重新生成GRUB的启动菜单配置文件(/boot/grub/grub.cfg)
root@ubuntu:~# update-grub
(3)重启系统后,网卡名称变成eth0和wlan0
2. 修改网卡配置文件
原来网卡配置文件名称为ifcfg-ens33,这里需要修改为eth0的格式,并适当调整网卡配置文件。
mv /etc/sysconfig/network-scripts/ifcfg-ens12 /etc/sysconfig/network-scripts/ifcfg-eth0 #修改ifcfg-eth0文件如下内容(其它内容不变),NAME=eth0 DEVICE=eth0
systemctl restart network.service #重启网络服务
3. 创建70-persistent-net.rules
直接在/etc/udev/rules.d/中创建或修改70-persistent-net.rules文件,加上或修改信息为:
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", NAME=="eth0"
五.ubuntu18修改网卡名称
上面讲过的都是在centos7中,在ubuntu18中,则简单很多,没有看到/lib/udev/rules.d/60-net.rules, /lib/udev/rules.d/71-biosdevname.rules,/lib/udev/rules.d/75-net-description.rules这些文件
ubuntu18识别网卡,名称默认会根据 /lib/udev/rules.d/目录下的80-net-setup-link.rules文件定义的规则来。如果你要更改规则,需要先将文件80-net-setup-link.rules从/lib/udev/rules.d目录复制到/etc/udev/rules.d目录。因为/etc/udev/rules.d目录下规则的优先级高于/lib/udev/rules.d目录,识别网卡并命名时,会优先从/etc/udev/rules.d目录下寻找规则文件。将ID_NET_NAME改成ID_NET_SLOT即可。