我在 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
您可以在readlink
shell 下读取该内容。
最有用的可能是标签文件,因为提取名称的数字部分并将其用作设备名称很简单。
$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/.* //'