networkcard-cfg

Linux下网卡命名规则

rename 规则
1
2
3
4
5
6
7
8
9
10
11
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, 依据/lib/udev/rules.d/75-net-description.rules,将udev工具会根据device属性将填写网卡的属性命名,可能一个网卡会有多个维度的名称;

step4,udev 根据step3中的赋值,按照指定的scheme规则,去给在step1 step2中没有命名的网卡命名;

强调:这个step顺序是在我们没有自定义自己的rules的前提下,如果用户自定义了自己的rules,则用户自定义为优先级最高
传统命名

centos6之前采用的都是传统的命名方式,如eth0,1…

可预测的命名

cenos7之后提供了可预测性的网卡命名方式。

1
2
3
4
5
如果从BIOS中能够取到可用的,板载网卡的索引号,则使用这个索引号命名,例如: eno1,如不能则尝试2
如果从BIOS中能够取到可以用的,网卡所在的PCI-E热插拔插槽(注:pci槽位号)的索引号,则使用这个索引号命名,例如: ens1,如不能则尝试3
如果能拿到设备所连接的物理位置(PCI总线号+槽位号?)信息,则使用这个信息命名,例如:enp2s0,如不能则尝试4
传统的kernel命名方法,例如: eth0,这种命名方法的结果不可预知的,即可能第二块网卡对应eth0,第一块网卡对应eth1
使用网卡的MAC地址来命名,这个方法一般不使用
自定义规则
1
2
3
4
5
6
7
在用户没有自定义rules文件前提下,step1中的网卡命名方式也可认为是一种用户自定义的网卡命名,
即在/etc/sysconfig/network-scripts/ifcfg-xx 文件,xx就是这个网卡名称,文件内容中体现MAC_ADDRESS、NAME,
这种情况下,则会按照配置文件中指定的名称来命名网卡

如果用户自定义了rules文件,放在/etc/udev/rules.d/目录下,则这个优先级是最高的;
比1中ifcfg-xx方式优先级更高,但是如果两者不一致,则在重启network服务时,会依据ifcfg-xx,
所以用户不应该同时采用里两种方式给同一个网卡命不同的名称

udevadm info /sys/class/net/网卡名

可以显示此时这个网卡的pcie信息,vendor_id,idbus等等信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@Bai5gc:/sys/class/net/eth1# udevadm info /sys/class/net/eth1
P: /devices/pci0000:00/0000:00:02.2/0000:03:00.0/net/eth1
E: DEVPATH=/devices/pci0000:00/0000:00:02.2/0000:03:00.0/net/eth1
E: ID_BUS=pci
E: ID_MODEL_FROM_DATABASE=Ethernet Connection X552 10 GbE Backplane
E: ID_MODEL_ID=0x15ab
E: ID_NET_DRIVER=ixgbe
E: ID_NET_LINK_FILE=/lib/systemd/network/99-default.link
E: ID_NET_NAME_MAC=enxb4a9fca897e7
E: ID_NET_NAME_ONBOARD=eno3
E: ID_NET_NAME_PATH=enp3s0f0
E: ID_PATH=pci-0000:03:00.0
E: ID_PATH_TAG=pci-0000_03_00_0
E: ID_PCI_CLASS_FROM_DATABASE=Network controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
E: ID_VENDOR_ID=0x8086
E: IFINDEX=3
E: INTERFACE=eth1
E: SUBSYSTEM=net
E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/eth1
E: TAGS=:systemd:
E: USEC_INITIALIZED=5061037
E: net.ifnames=0

ps:解释一下pci地址

  • /pci0000:00:这是根 PCIe 控制器的地址,pci0000:00 表示根控制器。
  • /0000:00:02.2:这是连接到根控制器的第一个 PCIe 设备的地址。0000:00:02.2 表示这个设备的总线号、设备号和功能号。
  • /0000:03:00.0:这是连接到第一个 PCIe 设备的下一个 PCIe 设备的地址。0000:03:00.0 表示新设备的总线号、设备号和功能号。
命名rule.d
biosdevname和net.ifnames两种命名规范
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
net.ifnames的命名规范为:设备类型+设备位置+数字

设备类型:

en 表示Ethernet
wl 表示WLAN
ww 表示无线广域网WWAN

实际的例子:

eno1 板载网卡
enp0s2 pci网卡
ens33 pci网卡
wlp3s0 PCI无线网卡
wwp0s29f7u2i2 4G modem
wlp0s2f1u4u1 连接在USB Hub上的无线网卡
enx78e7d1ea46da pci网卡


biosdevname的命名规范为: 要么是em开头,要么是p开头
实际的例子:

em1 板载网卡
p3p4 pci网卡
p3p4_1 虚拟网卡