Centos

如何在 Centos 6.5 上根據介面名稱(不是 MAC)設置 IP

  • August 10, 2015

我正在嘗試自動化將在相同盒子上使用的網路介面設置。這些盒子有 3 個不同的 NIC。3 個 NIC 中的每一個都有不同的 MAC 前綴,我可以使用這些前綴來區分它們,並且我設置了 udev 規則,通過使用適當的 MAC 前綴在 MAC 地址上使用萬用字元匹配將它們映射到可預測的名稱。

但是,我無法按名稱將介面映射到 Centos 6.5 上所需的 IP 配置。我不能使用正常方式(HWADDR),因為它使用完整的 MAC 地址,並且每個盒子上的地址都不同,所以我試圖匹配 DEVICE 名稱。問題似乎與 NetworkManager 守護程序有關。

我所做的是在 /etc/sysconf/network-scripts 目錄中設置 ifcfg-*設備文件。*例如,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 可能不是一個選項。

我將這個問題發佈到 Centos 6 Networking 論壇,得到的回應是使用 HWADDR 是唯一受支持的方法(至少對於 NetworkManager 而言)。

他們建議我在網路啟動之前生成具有確切 MAC 地址的 ifcfg- *device文件。*使用初始化腳本會很簡單。

引用自:https://unix.stackexchange.com/questions/219547