VMware ESXi 如何确定为设备分配名称的顺序(网卡乱序问题解决)
免责声明:本文为 How VMware ESXi determines the order in which names are assigned to devices (2091560) 的翻译版本。尽管我们会不断努力为本文提供最佳翻译版本,但本地化的内容可能会过时。有关最新内容,请参见英文版本。 本文介绍了自 ESXi 5.5 起用来为现代服务器系统的各个输入/输出端口分配短名称(称为别名或设备名称)的新算法。本文还介绍了在需要时如何更改别名。ESXi 分配设备的方式得到了改进,现在的方式更统一、稳定和可预测。
本文主要讨论网络设备命名,但本文介绍的概念和算法也适用于存储适配器和图形设备。网络设备使用vmnicN作为别名,其中 N 是一个整数。
同样,存储适配器别名采用vmhbaN格式,而图形设备别名类似于vmgfxN。有关所使用的数字的详细信息,请参见 “Additional Information” 部分。 |
自 ESXi 5.5 起,设备别名分配功能已成为新设计的设备管理器的一部分,并升级了设备别名分配功能,如本文所述。这样做是因为在 5.5 之前的 ESXi 版本中,介绍为物理(或逻辑)设备分配别名的文档很少。此外,由专用程序(esxcfg-init 以及后来的 jumpstart 插件)分配的设备别名难以与机箱标记关联起来,也难以在 ESXi 安装之前预测新计算机的别名。最后,在系统中添加或移除其他设备后,分配的别名在重新引导后可能会更改。 |
初始安装时,新的命名方案会尝试按物理位置以可预测的顺序分配名称。此后,即使在系统中添加或移除了其他设备,该命名方案也会使设备名称保持不变。在安装时,集成在系统主板上的设备通常按照其输出端口在系统机箱上的编号顺序获得编号最小的名称,而可插拔插槽中的设备通常按照插槽在机箱上的编号顺序获得下一个最大编号名称。读者应注意的是,此过程会忽略找不到驱动程序的设备。 则分配的设备名称应如下所示: 使用主机配置文件配置系统时,系统管理员应在硬件更改后捕获已更新的配置文件。 要将同类无状态主机群集从一个版本升级到另一个版本,请执行以下操作: 再举一个例子,在刀片系统上,板载设备和可插拔设备并无明确区分。刀片机箱可能会提供在不同刀片之间移动设备的方法,甚至可能会提供创建并移除多个虚拟设备再将其分配给其他刀片的方法。在这些情况下,下一节所述的详细规则仍适用。 通常,硬件供应商很可能会为以硬接线方式连接到单个刀片的设备提供 M1/M2 信息,并为可分配的设备提供 S1/S2/S3 信息。或者,硬件供应商也可能会为所有设备提供 M1 信息,此信息可让供应商完全控制 ESXi 分配名称的顺序。有关信息源标记 M1、M2、S1、S2 和 S3 的说明,请参见下一节“设备信息和命名”。 注意:在极少数情况下,别名在 ESXi 升级或修补程序安装中会更改,这是因为在 ESXi 解析固件设备位置信息时添加了错误修复或临时解决方法的副作用。如果需要更正已更改的别名,请按照下面“更改 ESXi 主机分配的名称”中的步骤进行操作。 在某些情况下,可能需要更改 ESXi 主机分配的别名。过程如下所示: 就物理 PCI 功能而言,VMware 支持为 32 个 HBA 和 GFX 适配器以及 96 块网卡分配名称。 此方法最多允许为单个 PCIe PF(物理功能)分配 100 个伪设备。
获得经过排序的系统设备信息列表后,ESXi 设备管理器可以根据设备类型(网络、存储或图形适配器)为这些设备分配别名。
对于不使用主机配置文件的全新安装或自动部署,设备管理器将查询计算机的固件以获取每个端口的位置信息,此信息通常包括哪些端口是板载端口,哪些端口位于可插拔插槽中以及这些端口和插槽在系统机箱上的编号顺序。然后,ESXi 会从 0 往上依次为板载端口、固件未描述的端口和可插拔插槽中的端口分配别名。
如果系统具有:
物理端口
设备别名
板载端口 1
vmnic0
板载端口 2
vmnic1
插槽 3 端口 1
vmnic2
插槽 5 端口 1
vmnic3
插槽 5 端口 2
vmnic4
对硬件配置进行的更改需遵守以下规则:
从一个 ESXi 版本升级到下一个版本(包括执行自动部署配置)时,不会更改先前分配给系统端口的别名。这包括从先前版本升级到 ESXi 5.5 等高级版本。
注意:在极少数情况下,别名在 ESXi 升级或修补程序安装中会更改,这是因为在 ESXi 解析固件设备位置信息时添加了错误修复或临时解决方法的副作用。如果需要更正已更改的别名,请按照下面“更改 ESXi 主机分配的名称”中的步骤进行操作。
设备类型和设备名称的持久性
大多数驱动程序会创建使用物理 PCI 功能一对一映射的设备对象。为这些物理设备预留的别名的范围从 0 开始。部分驱动程序会创建不使用物理功能一对一映射的对象。对于本机驱动程序,这些别名会永久记录在本地存储(在有状态系统上)和/或主机配置文件中。
使用基于 ESXi 本机驱动程序框架构建的驱动程序创建逻辑设备时,此类逻辑设备可以带有与 PCI 功能不对应的附加设备。在驱动程序首先创建这些逻辑设备时,这些设备会按照未指定的顺序分配到编号更大的别名。与物理设备的别名一样,逻辑设备的别名在重新引导后也仍保留在本地存储和/或主机配置文件中。例如,假如有一个聚合网络适配器 (CNA),其 PCI 类将其识别为网络设备,而其本机驱动程序同时导出网络上行链路对象和 iSCSI 存储适配器对象。在这种情况下,网络上行链路是物理设备(其别名可能是 vmnic1 ),而 iSCSI 适配器是逻辑设备(其别名可能是 vmhba64 )。
基于 ESXi 的 Linux 驱动程序兼容性层 vmklinux 构建的驱动程序可以创建伪逻辑设备。与真逻辑设备一样,这些设备也不与 PCI 功能一对一对应。一般而言,这些设备的别名在重新引导后不一定会保留。但是,某些 vmklinux 驱动程序可能会使用特殊算法来实现持久性,例如,以固定方式向相应的持久性物理设备的别名插入数位。对于其他 vmklinux 驱动程序,伪逻辑设备的别名一般以一种确定的方法分配,因此当安装在系统上的一组硬件和驱动程序保持不变时,这些别名不会更改,但具体情况不一定如此。
本节讨论结果可能看似意外的几种特殊情况。本节未详尽讨论各种情况。
没有驱动程序的设备
如上所述,系统只会为具有驱动程序的设备分配别名。例如,如果最初安装在计算机上的 ESXi 版本没有适用于其中一块计算机网卡的驱动程序,则该 NIC 的端口不会获得 vmnic 别名。编号不会按顺序为这些端口预留。如果后来将 ESXi 升级到支持该网卡的版本,则这些端口将获得后续可用的未使用别名,就好像该 NIC 是新添加的一样。这时,别名的顺序可能与在同一台计算机上全新安装新的 ESXi 版本时的顺序有所不同。
在某些系统上,有些端口实际上位于可插拔 PCI/PCIe 卡上,而用户可能会将这些端口视为集成端口。例如,在至少由一家供应商提供的系统上,几个网络端口是基本系统附带的标准设备,最终客户可能会认为这些端口是板载端口,而这些端口实际上位于出厂时安装在编号最大的插槽中的 PCIe 卡上。因此,在 vmnic 别名顺序中,这些端口会出现在其他插槽中可能会添加的任何 NIC 之后。
ESXi 会为所有能够找到驱动程序的设备分配名称。
ESXi 从以下来源获取设备位置信息。对于每个设备,ESXi 会按顺序查询这些来源,直至从其中一个来源找到信息为止。
标记
设备数据源
设备信息规范
M1
用于设备命名的 PCIe _DSM
PCIe 固件规范版本 3.1 的第 4.6.7 节“DSM for Naming a PCI or PCI Express Device Under Operating Systems”(用于在操作系统中为 PCI 或 PCI Express 设备命名的 DSM)
M2
SMBIOS 类型 41 结构
系统管理 BIOS (System Management BIOS, SMBIOS) 参考规范版本 2.6 或更高版本的“Onboard Devices Extended Information (Type 41)”(板载设备扩展信息(类型 41))一节
S1
ACPI _SUN 对象
高级配置和电源管理接口 (Advanced Configuration and Power Interface Specification, ACPI) 规范版本 5.0 的第 6.1.11 节“_SUN (Slot User Number)”(_SUN(插槽用户编号))。首先会尝试 PCI 功能的 _SUN 方法,如果该方法不存在,则会尝试同一个 PCI 设备的功能 0 的 _SUN 方法。
S2
旧版 $PIR 表
旧版 $PIR 表:MindShare, Inc. 出版的《PCI System Architecture》(PCI 系统架构,第 4 版,由 Tom Shanley 和 Don Anderson 编著)第 233-238 页的“Interrupt Routing Table”(中断路由表)
S3
SMBIOS 类型 9 结构
系统管理 BIOS (SMBIOS) 参考规范版本 2.6 或更高版本的“System Slots (Type 9)”(系统插槽(类型 9))一节
P
PCI SBDF 地址
设备的当前 PCI SBDF (segment:bus:device.function) 地址
为具有驱动程序的所有设备查询以上信息源后,每种类型的设备会按以下顺序进行排序和命名:
更改 ESXi 主机分配的名称
如果受影响的系统附加到主机配置文件,请编辑该配置文件中的设备别名配置部分,该部分位于配置文件中的常规系统设置下。然后,修复受影响的 ESXi 主机。
注意:必须重新引导主机才能完成修复。
从 ESXi Shell,运行以下命令以查看当前为设备位置分配别名的情况:
localcli --plugin-dir /usr/lib/vmware/esxcli/int/ deviceInternal alias list
输出:
Bus type Bus address Alias
------------------------------------
pci s00000007.00 vmnic2
pci s00000008.00 vmnic4
pci s00000008.01 vmnic5
pci s00000008.03 vmnic7
pci s00000008.02 vmnic6
pci s00000002.01 vmnic1
pci s00000002.00 vmnic0
pci s00000007.01 vmnic3
logical pci#s00000008.02#0 vmnic6
logical pci#s00000008.00#0 vmnic4
logical pci#s00000008.01#0 vmnic5
logical pci#s00000008.03#0 vmnic7
localcli --plugin-dir /usr/lib/vmware/esxcli/int deviceInternal alias list | grep vmnic7
pci s00000008.03 vmnic7
logical pci#s00000008.03#0 vmnic7
对于要重新分配的每个别名,使用以下命令:
localcli --plugin-dir /usr/lib/vmware/esxcli/int/ deviceInternal alias store --bus-type logical --alias vmnicN --bus-address B
其中 vmnicN 和 B 是要进行的新分配。例如,在上例中,可以使用以下命令交换 vmnic0 和 vmnic7:
localcli --plugin-dir /usr/lib/vmware/esxcli/int/ deviceInternal alias store --bus-type pci --alias vmnic7 --bus-address s00000002.00
localcli --plugin-dir /usr/lib/vmware/esxcli/int/ deviceInternal alias store --bus-type logical --alias vmnic0 --bus-address "pci#s00000008.03#0"
localcli --plugin-dir /usr/lib/vmware/esxcli/int/ deviceInternal alias store --bus-type logical --alias vmnic7 --bus-address "pci#s00000002.00#0"
目前使用以下别名编号分配:
部分设备会使多个端口在同一个 PCI 地址可用。以下是在这种情况下分配别名的算法的简要描述。
1000000 + (pciIndex*100) + p#
其中:
pciIndex 是 PCI 别名中的编号。
p# 是相对端口号
例如:如果 PCIe 功能获得名称 vmnic4 ,则:
lspci : 00:04:00.0 - vmnic4
端口 1 获得 vmnic4
端口 2 获得 vmnic1000402
端口 3 获得 vmnic1000403
https://kb.vmware.com/articleview?docid=2091560&lang=zh_CN
个人4口工控小主机网卡乱序解决命令
localcli --plugin-dir /usr/lib/vmware/esxcli/int/ deviceInternal alias store --bus-type pci --alias vmnic0 --bus-address s00000003.00
localcli --plugin-dir /usr/lib/vmware/esxcli/int/ deviceInternal alias store --bus-type logical --alias vmnic0 --bus-address "pci#s00000003.00#0"
localcli --plugin-dir /usr/lib/vmware/esxcli/int/ deviceInternal alias store --bus-type pci --alias vmnic1 --bus-address p0000:02:00.0
localcli --plugin-dir /usr/lib/vmware/esxcli/int/ deviceInternal alias store --bus-type logical --alias vmnic1 --bus-address "pci#p0000:02:00.0#0"
localcli --plugin-dir /usr/lib/vmware/esxcli/int/ deviceInternal alias store --bus-type pci --alias vmnic2 --bus-address m00008501
localcli --plugin-dir /usr/lib/vmware/esxcli/int/ deviceInternal alias store --bus-type logical --alias vmnic2 --bus-address "pci#m00008501#0"
localcli --plugin-dir /usr/lib/vmware/esxcli/int/ deviceInternal alias store --bus-type pci --alias vmnic3 --bus-address p0000:04:00.0
localcli --plugin-dir /usr/lib/vmware/esxcli/int/ deviceInternal alias store --bus-type logical --alias vmnic3 --bus-address "pci#p0000:04:00.0#0"