systemd-udevd.service 忽略 60-net.rules

systemd-udevd.service 忽略 60-net.rules

我尽了最大努力,不寻求帮助就让它工作了。我搞不懂。我有一台有 6 个以太网端口的机器。我希望它们始终命名为 eth0 到 eth5,就像我们在 CentOS 6.5 中所做的那样。

在 CentOS 6.5 中,我们使用以下 udev 规则,使用 PCI 地址来精确指定每个接口分配的名称:

    ACTION=="add", SUBSYSTEM=="net", IMPORT{program}="/lib/udev/rename_device"                                           
KERNEL=="eth?", ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:00:19.0", NAME="eth0"                         
KERNEL=="eth?", ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:08:00.0", NAME="eth1"                         
KERNEL=="eth?", ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:07:00.0", NAME="eth5"                         
KERNEL=="eth?", ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:06:00.0", NAME="eth4"                         
KERNEL=="eth?", ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:05:00.0", NAME="eth3"                         
KERNEL=="eth?", ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:04:00.0", NAME="eth2"                         
SUBSYSTEM=="net", RUN+="/etc/sysconfig/network-scripts/net.hotplug"

我现在运行的是 CentOS 7.1,内核版本为 3.10.0-229.20.1.el7.x86_64。Systemd 目前正在此机器上运行。Systemd/udev 对以太网设备使用了一种新的持久且可预测的命名方法。

我已经尝试了该网站提供的所有建议:http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/ 这应该是新 systemd/udev 设备命名方案的官方文档。

此页面底部列出了 3 种禁用新 systemd/udev 命名方案的方法:

  1. 您禁用固定名称的分配,以便再次使用不可预测的内核名称。为此,只需屏蔽 udev 的默认策略规则文件:ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules
  2. 您可以创建自己的手动命名方案,例如,将接口命名为“internet0”、“dmz0”或“lan0”。为此,请在 /etc/systemd/network/ 中创建自己的 .link 文件,为一个、一些或所有接口选择一个明确的名称或更好的命名方案。有关更多信息,请参阅 systemd.link(5)。
  3. 您在内核命令行上传递 net.ifnames=0

我已尝试所有三种方法但仍然无法使其正常工作。

当我尝试选项 1 时,我仍然得到 enp0s25...enp4 接口名称。

当我尝试选项 2 时,我仍然会得到新的接口名称。

选项 3 让我更接近目标,但仍然不够接近。当我尝试选项 3 时,通过在启动时将 net.ifnames=0 添加到内核命令中,我通过 eth5 接口获得了 eth0。这很好,但它们是由内核自动命名的,并且它忽略了我的 udev 规则;60-net.rules 文件或 70-persistent-net.rules(关于文件应该命名的信息存在冲突)文件位于 /etc/udev/rules.d 中。

我的 60-net.rules 和 70-persistent-net.rules 文件都相同,如下所示:

-bash-4.2# cat 70-persistent-net.rules                                                                               
ACTION=="add", SUBSYSTEM=="net", IMPORT{program}="/lib/udev/rename_device"                                           
ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:00:19.0", NAME="eth0"                                         
ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:04:00.0", NAME="eth2"                                         
ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:05:00.0", NAME="eth3"                                         
ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:06:00.0", NAME="eth4"                                         
ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:07:00.0", NAME="eth5"                                         
ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:08:00.0", NAME="eth1" 

下面是一些输出,显示我的机器是如何组装的:

lspci | grep Ethernet                                                                                  
00:19.0 Ethernet controller: Intel Corporation 82567LM Gigabit Network Connection (rev 03)                           
04:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection                                     
05:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection                                     
06:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection                                     
07:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection                                     
08:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection

-bash-4.2# dmesg | grep eth                                                                                          
[    6.978275] e1000e 0000:00:19.0 eth0: (PCI Express:2.5GT/s:Width x1) 00:01:05:0f:2a:a0                            
[    6.986168] e1000e 0000:00:19.0 eth0: Intel(R) PRO/1000 Network Connection                                        
[    6.993044] e1000e 0000:00:19.0 eth0: MAC: 7, PHY: 8, PBA No: FFFFFF-0FF                                          
[    7.127337] e1000e 0000:04:00.0  ready                                                                            
[  478.016884] e1000e: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx                                
[  478.024566] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready                                               
[  660.262275] e1000e: eth0 NIC Link is Down                                                                         
[  660.419098] e1000e: eth1 NIC Link is Down                                                                         
[  666.229161] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready                                                    
[  666.404529] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready                                                    
[  668.474872] e1000e: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx                                
[  668.482553] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready                                               
[  738.547269] e1000e: eth0 NIC Link is Down                                                                         
[  738.704105] e1000e: eth1 NIC Link is Down                                                                         
[  749.018153] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready                                                    
[  749.195650] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready                                                    
[  751.264876] e1000e: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx                                
[  751.272556] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready                                               
[ 1003.295095] e1000e: eth1 NIC Link is Down                                                                         
[ 1010.842662] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready                                                    
[ 1555.995276] e1000e: eth0 NIC Link is Down                                                                         
[ 1556.153100] e1000e: eth1 NIC Link is Down                                                                         
[ 1562.076158] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready                                                    
[ 1562.267653] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready                                                    
[ 1564.817867] e1000e: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx                                
[ 1564.825549] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready                                               
[ 2349.926276] e1000e: eth0 NIC Link is Down                                                                         
[ 2350.083101] e1000e: eth1 NIC Link is Down                                                                         
[ 2356.570139] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready                                                    
[ 2356.754645] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready                                                    
[ 2358.743867] e1000e: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx                                
[ 2358.751548] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready                                               
[ 2535.460274] e1000e: eth0 NIC Link is Down                                                                         
[ 2535.617098] e1000e: eth1 NIC Link is Down                                                                         
[ 2541.570159] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready                                                    
[ 2541.756655] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready                                                    
[ 2544.019877] e1000e: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx                                
[ 2544.027562] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready   

举个例子,您可以从我的自定义 udev 规则中看到,我希望将 eth1 专门分配给 PCI 地址 0000:08:00.0 处的接口。但在这里,您可以看到它实际上被分配给了 0000:04:00.0 处的接口,输出如下:

-bash-4.2# ethtool -i eth1                                                                                           
driver: e1000e                                                                                                       
version: 3.2.4.2-NAPI                                                                                                
firmware-version: 1.6-0                                                                                              
bus-info: 0000:04:00.0                                                                                               
supports-statistics: yes                                                                                             
supports-test: yes                                                                                                   
supports-eeprom-access: yes                                                                                          
supports-register-dump: yes                                                                                          
supports-priv-flags: no

这是我的 /etc/udev/rules.d 目录的列表:

-bash-4.2# ls -l                                                                                                     
total 12                                                                                                             
-rw-r----- 1 root root 633 May 10 00:29 60-net.rules                                                                 
-rw-r--r-- 1 root root 537 Dec 21  2015 70-persistent-net.rules                                                      
lrwxrwxrwx 1 root root   9 May 10 00:44 80-net-setup-link.rules -> /dev/null                                         
-rw-r--r-- 1 root root 701 Dec 21  2015 net.rules.old

如您所见,我还创建了指向 /dev/null 的符号链接,以禁用 systemd/udev 命名方案。但这似乎对我没有任何作用。

我也尝试编辑 /usr/lib/udev/rules.d 中的 60-net.rules 文件,但这也没有任何作用。

在 /etc/sysconfig/network-scripts 中我有 ifcfg-eth0 和 ifcfg-eth1,但我将它们重命名为 ifcfg-ethx 和 ifcfg-ethx1,以确保它们不会妨碍工作。

每当我对任何文件进行更改时,我都会发出以下命令来应用更改:

udevadm control --reload-rules
modprobe e1000e
systemctl stop network
systemctl start network

但这似乎并没有真正起作用或应用我所做的任何更改。

我已经尝试了所有办法,但就是无法解决。我现在很绝望。任何建议都非常有用。

以下是一些其他信息:

-bash-4.2# udevadm info /sys/class/net/eth1                                                                          
P: /devices/pci0000:00/0000:00:1c.3/0000:02:00.0/0000:03:01.0/0000:04:00.0/net/eth1                                  
E: DEVPATH=/devices/pci0000:00/0000:00:1c.3/0000:02:00.0/0000:03:01.0/0000:04:00.0/net/eth1                          
E: ID_BUS=pci                                                                                                        
E: ID_MODEL_FROM_DATABASE=82574L Gigabit Network Connection                                                          
E: ID_MODEL_ID=0x10d3                                                                                                
E: ID_NET_NAME_MAC=enx003059081853                                                                                   
E: ID_NET_NAME_PATH=enp4s0                                                                                           
E: ID_OUI_FROM_DATABASE=KONTRON COMPACT COMPUTERS AG                                                                 
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=5                                                                                                         
E: INTERFACE=eth1                                                                                                    
E: SUBSYSTEM=net                                                                                                     
E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/eth1                                                                     
E: TAGS=:systemd:                                                                                                    
E: USEC_INITIALIZED=27130                                                                                            
E: net.ifnames=0

您可以在此输出中看到,eth1 仍被分配给位于 PCI 地址 0000:04:00.0 的接口,并且 .link 文件也未被使用,因为没有显示 ID_NET_LINK_FILE 属性。

这是我的 10-eth1.link 文件在 /etc/systemd/network 中的示例。

-bash-4.2# cat 10-eth1.link                                                                                          
[Match]                                                                                                              
OriginalName=enp4s0                                                                                                  
Path=pci-0000:08:00.0-*                                                                                              
Driver=e1000e                                                                                                        

[Link]                                                                                                               
Name=eth1           

答案1

我不是这方面的专家,但也许一些信息总比没有好。

我的理解是,使用标准 udev 基础架构无法实现这一点。Red Hat 的文档位于https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/sec-troubleshooting_network_device_naming似乎同意:

在下列情况下,使用 ethX 名称可以正确工作:

  • 系统只有一个网络接口。
  • 当用于 Red Hat Enterprise Linux 7 虚拟机客户机中的 virtio NIC 时。[...]

基本上,当您的系统启动时会发生以下情况:

  1. 内核通过eth分配eth0接口名称。
  2. udev 规则稍后用于重命名这些接口,从 ethX为所需名称。

当步骤 2 中的规则尝试重命名以太坊X名称在哪里X<=,那么您很可能会因为命名冲突而收到错误。这是我在不同情况下收到的命名冲突错误,其中 BIOS 似乎指示我的两个接口应具有相同的名称:

systemd-udevd: could not rename interface '6' from 'eth0' to 'enp4s0': File exists

我确信,除了 eth0 到 eth,你可以随意调用你的接口例如,如果您有坚持在接口名称上使用“eth”前缀的工具,除非您有大量的接口,否则“eth100”、“eth101”等应该是安全的。

也许一个解决方法是让 udev 将所有接口重命名为“other_eth0”之类的名称,然后让一个在系统启动时运行的服务重命名所有带有“other_”前缀的接口以删除这些前缀,尽管我脑子里不知道如何在 udev 规则之外进行接口重命名。

我很惊讶您在 CentOS 6 上成功使用了这些规则,因为我在 CentOS 6 上也遇到过类似的问题,无法为接口分配正确的名称,并且会给它们起“rename2”之类的名字。我在 CentOS 6 上使用了“eth100”、“eth101”等解决方案。

相关内容