理解网卡命名规则
命令的规则
- 如果固件或BIOS中的信息适用且可用,则使用包含固件或BIOS提供的板载设备(on-board devices)索引号的名称;(例如: eno1)
- 如果固件或BIOS中的信息适用且可用,则使用包含固件或BIOS提供的名称的PCI Express热插拔插槽索引号(slot index numbers);(例如:ens1)
biosdevname=1
- 包括硬件连接器物理位置的名称(例如:enp2s0),如果适用,则使用其他名称;
net.ifnames=1
- 如果上面的方法均失败,则使用传统的不可预测的内核命名方案(例如:eth0)
enp0s10:
| | |
v | |
en| | --> ethernet
v |
p0| --> bus number (0)
v
s10 --> slot number (10)
代码分析rename过程
在src/udev/udevd.c
代码中 int main(int argc, char *argv[])
1492 if (!udev_list_node_is_empty(&event_list) && !udev_exit && !stop_exec_queue) {
1493 udev_builtin_init(udev);
1494 if (rules == NULL)
1495 rules = udev_rules_new(udev, arg_resolve_names);
1496 if (rules != NULL)
1497 event_queue_start(udev);
1498 }
流程
udev_builtin_init
--> builtin_net_id
--> names_pci
--> dev_pci_onboard(dev, names);
--> dev_pci_slot(dev, names);
dev_pci_slot
299 if (get_proc_cmdline_key("net.ifnames", NULL) > 0)
300 do_virtio = 1;
301 else if (get_proc_cmdline_key("net.ifnames=", &value) > 0) {
302 safe_atoi(value, &n);
303 if (n > 0)
304 do_virtio = 1;
305 }
..........
502 /* handle only ARPHRD_ETHER and ARPHRD_SLIP devices */
503 s = udev_device_get_sysattr_value(dev, "type");
504 if (!s)
505 return EXIT_FAILURE;
506 i = strtoul(s, NULL, 0);
507 switch (i) {
508 case ARPHRD_ETHER:
509 prefix = "en";
510 break;
511 case ARPHRD_SLIP:
512 prefix = "sl";
513 break;
514 default:
515 return 0;
516 }
.......
223 /* compose a name based on the raw kernel's PCI bus, slot numbers */
224 s = names->pci_path;
225 l = sizeof(names->pci_path);
226 if (domain > 0)
227 l = strpcpyf(&s, l, "P%u", domain);
228 l = strpcpyf(&s, l, "p%us%u", bus, slot);
229 if (func > 0 || is_pci_multifunction(names->pcidev))
230 l = strpcpyf(&s, l, "f%d", func);
231 if (dev_id > 0)
232 l = strpcpyf(&s, l, "d%d", dev_id);
233 if (l == 0)
234 names->pci_path[0] = '\0';
.......
273 if (hotplug_slot > 0) {
274 s = names->pci_slot;
275 l = sizeof(names->pci_slot);
276 if (domain > 0)
277 l = strpcpyf(&s, l, "P%d", domain);
278 l = strpcpyf(&s, l, "s%d", hotplug_slot);
279 if (func > 0 || is_pci_multifunction(names->pcidev))
280 l = strpcpyf(&s, l, "f%d", func);
281 if (dev_id > 0)
282 l = strpcpyf(&s, l, "d%d", dev_id);
283 if (l == 0)
284 names->pci_slot[0] = '\0';
285 }
cmdline 配置 biosdevname=0 net.ifnames=1
环境测试
Jan 6 06:39:35 localhost NetworkManager[733]: <info> (ens3): DHCPv4 state changed unknown -> bound
Jan 6 06:39:35 localhost NetworkManager[733]: <info> (ens3): device state change: ip-config -> ip-check (reason 'none') [70 80 0]
Jan 6 06:39:35 localhost NetworkManager[733]: <info> (ens3): device state change: ip-check -> secondaries (reason 'none') [80 90 0]
Jan 6 06:39:35 localhost NetworkManager[733]: <info> (ens3): device state change: secondaries -> activated (reason 'none') [90 100 0]
Jan 6 06:39:35 localhost NetworkManager[733]: <info> NetworkManager state is now CONNECTED_LOCAL
Jan 6 06:39:35 localhost dhclient[1058]: bound to 192.168.122.97 -- renewal in 1489 seconds.
Jan 6 06:39:35 localhost NetworkManager[733]: <info> NetworkManager state is now CONNECTED_GLOBAL
Jan 6 06:39:35 localhost NetworkManager[733]: <info> Policy set 'Wired connection 1' (ens3) as default for IPv4 routing and DNS.
Jan 6 06:39:35 localhost NetworkManager[733]: <info> (ens3): Activation: successful, device activated.
修改xml文件,经bus的号修改bus='0x00'
->bus='0x03'
<interface type='bridge'>
<mac address='52:54:00:89:61:3c'/>
<source bridge='virbr0'/>
<target dev='tap4'/>
<model type='virtio'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x03' slot='0x03' function='0x0'/>
</interface>
Jan 6 06:43:32 localhost NetworkManager[736]: <info> (enp3s3): DHCPv4 state changed unknown -> bound
Jan 6 06:43:32 localhost NetworkManager[736]: <info> (enp3s3): device state change: ip-config -> ip-check (reason 'none') [70 80 0]
Jan 6 06:43:32 localhost NetworkManager[736]: <info> (enp3s3): device state change: ip-check -> secondaries (reason 'none') [80 90 0]
Jan 6 06:43:32 localhost dhclient[1060]: bound to 192.168.122.97 -- renewal in 1664 seconds.
Jan 6 06:43:32 localhost NetworkManager[736]: <info> (enp3s3): device state change: secondaries -> activated (reason 'none') [90 100 0]
网卡名字是 enp63s0f0---> enp61s0f0,可以推出pci的地址应该为 3f:00.0
--> 3d:00.0