我正在尝试自动化将在相同盒子上使用的网络接口设置。这些盒子有 3 个不同的 NIC。 3 个 NIC 中的每一个都有不同的 MAC 前缀,我可以使用它们来区分它们,并且我已经设置了 udev 规则,通过使用适当的 MAC 前缀对 MAC 地址进行通配符匹配,将它们映射到可预测的名称。
但是,我在 Centos 6.5 上按名称将接口映射到所需的 IP 配置时遇到问题。我无法使用正常方式(HWADDR),因为它使用完整的 MAC 地址,并且每个盒子上的地址都不同,所以我尝试匹配设备名称。问题似乎出在 NetworkManager 守护进程上。
我所做的是设置 ifcfg-设备/etc/sysconf/network-scripts 目录中的文件。例如,ifcfg-i1:
DEVICE=i1
TYPE=Ethernet
BOOTPROTO=none
IPADDR=10.102.30.158
PREFIX=24
GATEWAY=10.102.30.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
ONBOOT=yes
UUID=9ff7691b-e65b-4f9b-b6f2-e7549662403b
一切正常,如果所有接口都会在 NetworkManager 守护进程启动之前出现。但是,如果此服务在 3 个接口“就绪”之前启动,则该服务会将接口设置为与其 ifcfg 文件中的 IP 不同的 IP。以下是 IP 错误情况下 /var/log/messages 中的相关行:
Jul 31 18:19:14 centos6 kernel: ADDRCONF(NETDEV_UP): i1: link is not ready
Jul 31 18:19:14 centos6 kernel: ADDRCONF(NETDEV_UP): i2: link is not ready
Jul 31 18:19:14 centos6 kernel: e1000e: i1 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx
Jul 31 18:19:14 centos6 kernel: ADDRCONF(NETDEV_CHANGE): i1: link becomes ready
Jul 31 18:19:14 centos6 kernel: ADDRCONF(NETDEV_UP): i3: link is not ready
Jul 31 18:19:14 centos6 kernel: e1000e: i2 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Jul 31 18:19:14 centos6 kernel: ADDRCONF(NETDEV_CHANGE): i2: link becomes ready
现在 NetworkManager 服务已启动,但 i3 尚未准备就绪。
Jul 31 18:19:15 centos6 NetworkManager[2350]: <info> NetworkManager (version 0.8.1-66.el6) is starting...
Jul 31 18:19:15 centos6 NetworkManager[2350]: ifcfg-rh: parsing /etc/sysconfig/network-scripts/ifcfg-lo ...
Jul 31 18:19:15 centos6 NetworkManager[2350]: ifcfg-rh: parsing /etc/sysconfig/network-scripts/ifcfg-i3 ...
Jul 31 18:19:15 centos6 NetworkManager[2350]: ifcfg-rh: read connection 'System i3'
Jul 31 18:19:15 centos6 NetworkManager[2350]: ifcfg-rh: parsing /etc/sysconfig/network-scripts/ifcfg-i1 ...
Jul 31 18:19:15 centos6 NetworkManager[2350]: ifcfg-rh: read connection 'System i1'
Jul 31 18:19:15 centos6 NetworkManager[2350]: ifcfg-rh: parsing /etc/sysconfig/network-scripts/ifcfg-i2 ...
Jul 31 18:19:15 centos6 NetworkManager[2350]: ifcfg-rh: read connection 'System i2'
Jul 31 18:19:15 centos6 NetworkManager[2350]: ifcfg-rh: parsing /etc/sysconfig/network-scripts/ifcfg-em1 ...
Jul 31 18:19:15 centos6 NetworkManager[2350]: ifcfg-rh: read connection 'System em1'
最终 i3 确实准备好了:
Jul 31 18:19:16 centos6 kernel: e1000e: i3 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Jul 31 18:19:16 centos6 kernel: ADDRCONF(NETDEV_CHANGE): i3: link becomes ready
Jul 31 18:19:17 centos6 NetworkManager[2350]: <info> (i1): device state change: 7 -> 8 (reason 0)
Jul 31 18:19:17 centos6 NetworkManager[2350]: <info> Policy set 'System i1' (i1) as default for IPv4 routing and DNS.
Jul 31 18:19:17 centos6 NetworkManager[2350]: <info> Activation (i1) successful, device activated.
Jul 31 18:19:17 centos6 NetworkManager[2350]: <info> Activation (i1) Stage 5 of 5 (IP Configure Commit) complete.
Jul 31 18:19:17 centos6 NetworkManager[2350]: <info> (i3): carrier now ON (device state 2)
Jul 31 18:19:17 centos6 NetworkManager[2350]: <info> (i3): device state change: 2 -> 3 (reason 40)
Jul 31 18:19:17 centos6 NetworkManager[2350]: <info> Auto-activating connection 'System i1'.
Jul 31 18:19:17 centos6 NetworkManager[2350]: <info> Activation (i3) starting connection 'System i1'
Jul 31 18:19:17 centos6 NetworkManager[2350]: <info> (i3): device state change: 3 -> 4 (reason 0)
但此时 NetworkManager 已决定 i1 为默认策略,并将 i1 IP (10.102.30.158) 也分配给 i3。
我尝试在 ifcfg-xxx 文件中添加 NM_CONTROLLED="no" ,但 NetworkManager 日志显示:
warning: NM_CONTROLLED was false but HWADDR or SUBCHANNELS was missing; device will be managed
对于接口,因此没有任何影响。我无法使用 HWADDR,因为我无法使用确切的 MAC 地址。
首先,这是一个错误吗?如果接口在 NetworkManager 启动之前启动,则一切正常,因此结果取决于竞争条件。
如果这不是一个错误,我该如何实现这个目标?禁用 NetworkManager 可能不是一个选择。
答案1
我发布了这个问题到 Centos 6 Networking 论坛,那里的回复是使用 HWADDR 是唯一受支持的方法(至少对于 NetworkManager 而言)。
他们建议我生成 ifcfg-设备在网络启动之前,文件具有准确的 MAC 地址。使用初始化脚本就很简单了。