最近,由于我们要从较旧的硬件配置迁移到较新的硬件配置,因此我不得不为公司构建一个新的克隆映像。由于一些客户要求,我们仍在使用 CentOS 7.9 (2009)。我们之前使用的主板型号是 Advantech ASMB-923,我们迁移到使用 Advantech ASMB-935。

在构建了基本操作系统映像并在其上安装了一些软件之后,我们创建了磁盘的克隆,以部署到其他机器上。但我在网络配置方面遇到了一些问题。该机器上有两个千兆以太网端口,以及一个带有两个 10 GB 以太网端口的 PCI 卡。我们通常只将千兆以太网端口用于两个独立的网络,而 10 GB 端口则保留用于非常特殊的用例,我们很少使用这种用例,但这是客户要求的一部分。

我们对网络设备使用eth命名方案, eth0应该用于软件通信,而eth1用于硬件通信。但是,我遇到了一个问题,这个问题在之前的主板上没有遇到过。出于某种原因,有时它会将eth标识符的分配更改为不同的物理端口。例如,有时它会按照我们的意愿将eth1分配给 10 GB 端口之一,而不是千兆端口。这会破坏我们的内部通信。

我尝试使用一个简单的脚本来解决这个问题,该脚本将端口的 PCI 地址映射到特定的eth设备名称,并使用“ ip link set name ”将设备重命名为正确的设备名称,然后向相关设备的ifcfg文件添加HWADDRNM_CONTROLLED =no属性。/etc/sysconfig/network-scripts 下还有一个“ save ”目录,它会覆盖我对ifcfg文件所做的任何更改,因此我重命名了该目录以防止这种情况发生。

我相信这应该足够了,但根本问题在发生频率上非常不一致,所以我不确定如何明确验证此解决方案是否有效。有人能给我一些关于这个问题的见解和可能更好的解决方案,或者至少确认我的解决方案是否可靠吗?

编辑:今天早上我再次检查了机器,发现两个令人不安的新异常,这使我的脚本失效:

  • 在一台机器上,当我检查 /sys/class/net 下从设备名称到 PCI 地址的映射时,我发现 10 GB 以太网端口的 PCI 地址不再是“0000:1a:00.0”和“0000:1a:00.1”,而是“0000:af:00.0”和“0000:af:00.1”。eth1 和 eth2 的 ifcfg 文件中也缺少 HWADDR 属性和 NM_CONTROLLED=no 属性。
  • 在另一台机器上,PCI 地址保持不变,但 eth1 和 eth2 ifcfg 文件中缺少 HWADDR 和 NM_CONTROLLED 属性,如上所述。

6

  • 1
    我个人讨厌现代网络接口命名约定方案,但在相同的硬件上,它应该可以防止此类问题。您是否尝试过使用现代命名方案(如您所知,这是默认方案)?


    – 


  • 通常,最可靠的方法是使用 MAC 地址(NIC 的硬件地址)作为唯一标识符,以便在不使用可预测命名时在特定 NIC 上强制使用特定设备名称。但我不确定 RHEL / CentOS 7 是否可以并且仍会为此使用 udev 规则


    – 

  • @drookie 我在上面添加了新的详细信息。脚本不起作用,因为显然在一台机器上,PCI 地址自发更改,而在另一台机器上,HWADDR 和 NM_CONTROLLED 属性自发从 ifcfg 文件中消失。


    – 

  • @HBruijin 但是 MAC 地址在不同的机器上是不一样的。它对于每台机器都是唯一的。我们使用 Clonezilla 映像部署到具有相同硬件的众多系统,但每个系统的 MAC 地址都不同。


    – 

  • @drookie 我们可以转换为可靠的命名方案——问题是我们的代码库有大量对这些“eth”设备名称的硬编码引用,我们必须为此进行大量重构。


    – 

0