vmware 的网络适配器到 eth 号码映射

vmware 的网络适配器到 eth 号码映射

我在 ESXi 5.5 上有一个 ubuntu 虚拟机,有 6 个 e1000 接口。在创建虚拟机时,我为所有虚拟机分配了一个不同的网络并启动它。

当我登录到 Linux 时,我看到了 eth0-eth5,但顺序并不像我预期的那样。我预期网络适配器 1 映射到 eth0,网络适配器 2 映射到 eth1,依此类推

请问您知道为什么会这样吗?如何解决?

答案1

我学习的两种方法是:

  • 您可以查看 vmware 上每个 NIC 的网络设置中的 MAC 地址,然后ifconfig在控制台上进行检查。

  • 如果有六条线路,请用此方法断开其中五条。首先编辑配置文件并突出显示网络适配器 1 至 5。在设置下取消选中“连接”按钮。然后:

    cd /sys/class/net
    grep "" eth0/*
    

    查找处于 1 或 0(零)状态的运营商。处于 1 状态的运营商就是您要查找的运营商。然后您可以分配所需的 VLAN 或 IP。

    对列出的每个 NIC(eth0、eth1、eth2 等)执行此操作。

这两个操作都允许您查看 MAC 地址,但第二个操作允许您查看更多的配置详细信息。

答案2

我们也遇到过这个问题。我们认为这与 vNIC 所在的虚拟 PCI 插槽有关。我记得,前三个 vNIC 没问题,但随着 vNIC 数量的增加,eth 的顺序就变得很奇怪了。

我们从未真正修复过这个问题,因为我们很快就能摆脱拥有太多 vNIC 的虚拟机。

我不了解 Ubuntu,但看看 /etc/udev/rules.d/ 下是否有一个名为“persistent”和“net”的文件。从您的 vNIC 获取 MAC 地址,并将它们映射到您选择的 ethX。您应该找到类似这样的规则

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:56:01:02:03", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

00:50:56:01:02:03如果您希望 MAC 地址为 eth1的 vNIC ,只需更改NAME="eth0"NAME="eth1"并重新启动。

编辑:

今天,我部署了一个带有 3 个 SCSI 控制器和 2 个 vNIC 的虚拟机。对于 BIOS,第一个 vNIC 是 NIC 2,第二个 vNIC 是 NIC 1。我将 vmx 文件与另一个文件(2 个 vNIC 但只有 1 个 SCSI 控制器)进行了比较。“正常”虚拟机如下所示:

ethernet0.pciSlotNumber = "192"
ethernet1.pciSlotNumber = "224"

这个“奇怪”的虚拟机看起来是这样的:

scsi1.pciSlotNumber = "192"
scsi2.pciSlotNumber = "224"
ethernet0.pciSlotNumber = "256"
ethernet1.pciSlotNumber = "1184"

如您所见,附加的 SCSI 控制器占用了另一台虚拟机中 vNIC 所在的插槽。因此,这似乎确实与虚拟 PCI 插槽有关。

答案3

这对我来说在 vmware 下是有效的,其中经常有这些文件(可能需要 vmware 内核模块):

  • /sys/bus/pci/设备/0000:.../标签
  • /sys/bus/pci/设备/0000:.../acpi_index

以及这个符号链接:

  • /sys/bus/pci/设备/0000:.../firmware_node

文件标签包含一行文本,如:以太网0以太网1等,并按照OVF文件中原有的编号进行编号。

文件 acpi_index 有一个数字(可能是 long int),排序后的数字与 OVF 文件中接口的原始顺序或 VM 中定义的顺序相匹配。

符号链接 firmware_node 的目标文件名部分也按照与原始 OVF 文件中的接口相同的顺序排列。

例如../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:8b/device:8c

您可以在readlinkshell 下读取该内容。

最有用的可能是标签文件,因为提取名称的数字部分并将其用作设备名称很简单。

$dev您可以像这样阅读标签:

read label < /sys/bus/pci/devices/$dev/label

然后像这样提取数字后缀:${label#Ethernet}

如果没有标签,则这对对联不执行任何操作:

read label < /sys/bus/pci/devices/$dev/label && echo ${label#Ethernet}

如果您想要处理所有设备以获取顺序,您可以按照总线顺序读取以太网设备,如下所示:

lspci -D -mm | sed -n -e 's/ "Ethernet controller".*//;T;p'

然后您可以将其导入到此段中作为前缀标签

while read dev ; do read label < /sys/bus/pci/devices/$dev/label ; echo ${label#Ethernet} $dev ; done

然后您可以像这样排序并删除标签:sort | sed -e 's/.* //'

按照 VMWARE 定义的顺序发出所有以太网设备的完整表达式是:

lspci -D -mm | sed -n -e 's/ "Ethernet controller".*//;T;p' | while read dev ; do read label < /sys/bus/pci/devices/$dev/label ; echo ${label#Ethernet} $dev ; done | sort | sed -e 's/.* //'

相关内容