由于网卡名称的确定,是谁先被识别,谁的序号就靠前。但是我们的需求就是希望网卡名称和硬件的RJ45是绑定到一起的。
这个可以通过 udev 来更改名字。LS1046A cpu内的MAC 提供了一个设备地址,这个设备地址是和CPU内的MAC绑定的,这样就比较方便,如果用MAC地址来区分,如果是多个设备,就无法做到批量修改,不是通用的做法。
可以用 73-fsl-dpaa-persistent-networking.rules 来做设置
# Rules for handling naming the DPAA FMan ethernet ports in a consistent way
SUBSYSTEM=="net", DRIVERS=="fsl_dpa*", ATTR{device_addr}=="1ae0000", NAME="fm1-mac1"
SUBSYSTEM=="net", DRIVERS=="fsl_dpa*", ATTR{device_addr}=="1ae2000", NAME="fm1-mac2"
SUBSYSTEM=="net", DRIVERS=="fsl_dpa*", ATTR{device_addr}=="1ae4000", NAME="fm1-mac3"
SUBSYSTEM=="net", DRIVERS=="fsl_dpa*", ATTR{device_addr}=="1ae6000", NAME="fm1-mac4"
SUBSYSTEM=="net", DRIVERS=="fsl_dpa*", ATTR{device_addr}=="1ae8000", NAME="fm1-mac5"
SUBSYSTEM=="net", DRIVERS=="fsl_dpa*", ATTR{device_addr}=="1aea000", NAME="fm1-mac6"
SUBSYSTEM=="net", DRIVERS=="fsl_dpa*", ATTR{device_addr}=="1af0000", NAME="fm1-mac9"
# Rename macless0 to "macless0"
SUBSYSTEM=="net", ATTR{device_type}=="macless0", NAME="macless0"
可以使用下面的命令来找到设备地址:
udevadm info -a -p /sys/class/net/eth1
[root@linx ~]#udevadm info -a -p /sys/class/net/eth1
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/platform/soc/soc:fsl,dpaa/soc:fsl,dpaa:ethernet@2/net/eth1':
KERNEL=="eth1"
SUBSYSTEM=="net"
DRIVER==""
ATTR{addr_assign_type}=="0"
ATTR{addr_len}=="6"
ATTR{address}=="5c:d2:0b:10:94:d6"
ATTR{bpids}=="32"
ATTR{broadcast}=="ff:ff:ff:ff:ff:ff"
ATTR{carrier}=="1"
ATTR{carrier_changes}=="2"
ATTR{carrier_down_count}=="1"
ATTR{carrier_up_count}=="1"
ATTR{consumers}==""
ATTR{dev_id}=="0x0"
ATTR{dev_port}=="0"
ATTR{device_addr}=="1ae4000"
ATTR{device_type}=="private"
ATTR{dormant}=="0"
ATTR{flags}=="0x1003"
ATTR{gro_flush_timeout}=="0"
ATTR{ifalias}==""
ATTR{ifindex}=="4"
ATTR{iflink}=="4"
ATTR{link_mode}=="0"
ATTR{mtu}=="1500"
ATTR{name_assign_type}=="4"
ATTR{netdev_group}=="0"
ATTR{operstate}=="up"
ATTR{proto_down}=="0"
ATTR{suppliers}==""
ATTR{tx_queue_len}=="1000"
ATTR{type}=="1"
looking at parent device '/devices/platform/soc/soc:fsl,dpaa/soc:fsl,dpaa:ethernet@2':
KERNELS=="soc:fsl,dpaa:ethernet@2"
SUBSYSTEMS=="platform"
DRIVERS=="fsl_dpa"
ATTRS{consumers}==""
ATTRS{driver_override}=="(null)"
ATTRS{suppliers}==""
looking at parent device '/devices/platform/soc/soc:fsl,dpaa':
KERNELS=="soc:fsl,dpaa"
SUBSYSTEMS=="platform"
DRIVERS==""
ATTRS{consumers}==""
ATTRS{driver_override}=="(null)"
ATTRS{suppliers}==""
looking at parent device '/devices/platform/soc':
KERNELS=="soc"
SUBSYSTEMS=="platform"
DRIVERS==""
ATTRS{consumers}==""
ATTRS{driver_override}=="(null)"
ATTRS{suppliers}==""
looking at parent device '/devices/platform':
KERNELS=="platform"
SUBSYSTEMS==""
DRIVERS==""
ATTRS{consumers}==""
ATTRS{suppliers}==""
在实际的测试当中,我发现当我用 /etc/network/interfaces 来设置固定ip的话,networking.service 中会调用ifup eth1 ,这样可能就会导致设置的网卡失效,变成如下这样:
[root@linx ~]#ifconfig -a
eth2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255
ether 5c:d2:0b:10:94:d6 txqueuelen 1000 (Ethernet)
RX packets 865 bytes 41890 (40.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0x1ae4000-1ae4fff
eth3: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 5c:d2:0b:10:94:da txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0x1af0000-1af0fff
eth4: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 5c:d2:0b:10:94:d5 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0x1ae2000-1ae2fff
eth5: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 5c:d2:0b:10:94:d9 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0x1aea000-1aeafff
eth6: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 5c:d2:0b:10:94:d8 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0x1ae8000-1ae8fff
eth7: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 5c:d2:0b:10:94:db txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0x1af2000-1af2fff
eth8: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 5c:d2:0b:10:94:d4 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0x1ae0000-1ae0fff
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 644 bytes 52096 (50.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 644 bytes 52096 (50.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
rename5: flags=4098<BROADCAST,MULTICAST> mtu 1500
ether 5c:d2:0b:10:94:d7 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0x1ae6000-1ae6fff
可以看到 udev-trigger.service 和 networking.service 有重合的运行时间,可能是在ifup的时候,是会导致网卡名称更改失效的。
# systemd-analyze plot > boot.svg
解决方法1:systemctl disable networking
解决方法2 :调整 networking.service的启动顺序
修改 /lib/systemd/system/networking.service ,在After 这一行加上 systemd-udev-trigger.service
调整后:看已经没有重合了