记录我的一些生活写照、无聊的牢骚、内心世界的活动 注册 | 登陆

VMware ESXi 如何确定为设备分配名称的顺序(网卡乱序问题解决)

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 安装之前预测新计算机的别名。最后,在系统中添加或移除其他设备后,分配的别名在重新引导后可能会更改。

初始安装时,新的命名方案会尝试按物理位置以可预测的顺序分配名称。此后,即使在系统中添加或移除了其他设备,该命名方案也会使设备名称保持不变。在安装时,集成在系统主板上的设备通常按照其输出端口在系统机箱上的编号顺序获得编号最小的名称,而可插拔插槽中的设备通常按照插槽在机箱上的编号顺序获得下一个最大编号名称。读者应注意的是,此过程会忽略找不到驱动程序的设备。

设备名称分配
获得经过排序的系统设备信息列表后,ESXi 设备管理器可以根据设备类型(网络、存储或图形适配器)为这些设备分配别名。
 
全新安装/自动部署
对于不使用主机配置文件的全新安装或自动部署,设备管理器将查询计算机的固件以获取每个端口的位置信息,此信息通常包括哪些端口是板载端口,哪些端口位于可插拔插槽中以及这些端口和插槽在系统机箱上的编号顺序。然后,ESXi 会从 0 往上依次为板载端口、固件未描述的端口和可插拔插槽中的端口分配别名。

如果系统具有:
  • 两个板载网络端口
  • 一块位于插槽 3 的单端口网卡
  • 一块位于插槽 5 的双端口网卡

则分配的设备名称应如下所示:

物理端口 设备别名
板载端口 1 vmnic0
板载端口 2 vmnic1
插槽 3 端口 1 vmnic2
插槽 5 端口 1 vmnic3
插槽 5 端口 2 vmnic4
 
此方式可以在一组全新安装或部署的相同主机之间生成统一的设备名称分配。设备名称分配通常可根据上述规则进行预测,前提是主机的固件提供了必要信息并且未出现任何特殊情况。
 
在有状态主机上,别名分配会立即记录在持久的本地存储中。在无状态主机上,别名分配是主机配置文件的一部分;只要系统管理员捕获该配置文件,别名分配就会记录并持久保留下来。
 
硬件更改和设备别名
对硬件配置进行的更改需遵守以下规则:
  • 在初始安装后添加或移除卡时,其余端口会保留已分配的名称。
  • ESXi 会为新端口分配对应端口类型的第一个可用的未分配别名。
  • 已移除的端口的别名会变为可用。
  • 替换的端口可能会被视为与原始端口相同的端口,也可能会被视为先移除再添加的端口。在前一种情况下,新端口具有相同的别名。在后一种情况下,该端口可能会获取相同的别名。当旧别名是编号最小的可用别名时,将发生这种情况。
  • 假如替代设备具有更多端口,则将为这些端口分配对应端口类型的下一个可用的未分配别名。替代设备具有较少的端口时,未使用的别名会释放出来,以供重新分配。

使用主机配置文件配置系统时,系统管理员应在硬件更改后捕获已更新的配置文件。

ESXi 升级
从一个 ESXi 版本升级到下一个版本(包括执行自动部署配置)时,不会更改先前分配给系统端口的别名。这包括从先前版本升级到 ESXi 5.5 等高级版本。

注意:在极少数情况下,别名在 ESXi 升级或修补程序安装中会更改,这是因为在 ESXi 解析固件设备位置信息时添加了错误修复或临时解决方法的副作用。如果需要更正已更改的别名,请按照下面“更改 ESXi 主机分配的名称”中的步骤进行操作。
 
对于有状态系统,别名在升级过程中会保留在本地存储和主机配置文件(如果有)中。无状态系统的设备别名分配会记录在主机配置文件中。但是,来自 ESXi 5.5 之前版本的主机配置文件不包含别名分配。从 5.5 之前版本升级到 5.5 时,ESXi 会识别到这种情况,并使用 ESXi 5.5 之前版本的原始别名分配算法来防止在此类升级过程中进行别名重新分配。VMware 建议在进行无状态升级后捕获新的主机配置文件,以便设备分配保持不变。

要将同类无状态主机群集从一个版本升级到另一个版本,请执行以下操作:

  1. 使用 ESXi 5.5 或 6.0 映像升级 Auto Deploy 服务器。
  2. 从群集中移除引用主机。
  3. 使用 ESXi 5.5 或 6.0 重新引导引用主机。
  4. 提取主机配置文件。
  5. 如果存在未按预期分配的设备名称,请编辑主机配置文件的设备别名部分。
  6. 使用新的配置文件重新引导引用主机。
  7. 如果该主机现已具有所需的配置,请将主机配置文件附加到其余主机;否则,请从步骤 5 起重复以上过程。
  8. 将引用主机重新附加到群集。
  9. 重新引导群集的其余主机(通常是回滚重新引导)。
 

设备类型和设备名称的持久性

物理设备
大多数驱动程序会创建使用物理 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 之后。

再举一个例子,在刀片系统上,板载设备和可插拔设备并无明确区分。刀片机箱可能会提供在不同刀片之间移动设备的方法,甚至可能会提供创建并移除多个虚拟设备再将其分配给其他刀片的方法。在这些情况下,下一节所述的详细规则仍适用。

通常,硬件供应商很可能会为以硬接线方式连接到单个刀片的设备提供 M1/M2 信息,并为可分配的设备提供 S1/S2/S3 信息。或者,硬件供应商也可能会为所有设备提供 M1 信息,此信息可让供应商完全控制 ESXi 分配名称的顺序。有关信息源标记 M1、M2、S1、S2 和 S3 的说明,请参见下一节“设备信息和命名”。

设备信息和命名
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) 地址
 
标记为 M1 和 M2 的源通常适用于板载设备,尽管源 M1 可以用于任何设备。源 S1-S3 适用于可插拔插槽中的设备。源 P 未提供任何实际位置信息,并且在系统中添加或移除其他设备后不一定会保留,因此,最后才会查询此信息源。
 
命名
为具有驱动程序的所有设备查询以上信息源后,每种类型的设备会按以下顺序进行排序和命名:
  • 信息来自 M1 或 M2 的设备,按照该信息给定的端口号排序。
  • 信息来自 P 的设备。这些设备通常是板载设备,而硬件平台供应商没有为这些设备提供 M1 或 M2 信息。
  • 信息来自 S1、S2 或 S3 的设备,按照插槽编号排序。如果有多个设备位于同一个插槽中(例如,典型的多端口网卡),该插槽中的设备会按 PCI SBDF 顺序排序。

注意:在极少数情况下,别名在 ESXi 升级或修补程序安装中会更改,这是因为在 ESXi 解析固件设备位置信息时添加了错误修复或临时解决方法的副作用。如果需要更正已更改的别名,请按照下面“更改 ESXi 主机分配的名称”中的步骤进行操作。

更改 ESXi 主机分配的名称

在某些情况下,可能需要更改 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

     
当一个网卡由本机驱动程序控制时,实际上有两个与该设备相关联的别名:一个 pci 设备的 pci 别名和一个上行链路逻辑设备的逻辑别名。例如,我们在下面看到 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 pci --alias vmnicN --bus-address B
 
当出现逻辑别名时,pci 别名和逻辑别名都需要重新更改:
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 vmnic0 --bus-address s00000008.03
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"

 
运行所有必要的 alias store 命令后,正常关闭并重新引导系统。
设备编号信息
目前使用以下别名编号分配:
  • 对于物理 PCI 别名:
    • vmnic:0-31,64-127
    • vmhba: 0-31
    • vmgfx: 0-31
       
  • 对于本机驱动程序逻辑别名:
    • vmnic: 128-1000000
    • vmhba:64-95,128-159 ...
    • vmgfx: 32 - 1000000
       
  • 对于 vmlinux 逻辑别名:
    • vmnic:32-63,1000000-最大值
    • vmhba:32-63,96-127...

就物理 PCI 功能而言,VMware 支持为 32 个 HBA 和 GFX 适配器以及 96 块网卡分配名称。

多个伪逻辑设备别名分配
部分设备会使多个端口在同一个 PCI 地址可用。以下是在这种情况下分配别名的算法的简要描述。
  • 要求:
    • 标准命名约定(例如,vmnicX,其中 X 是一个十进制数字)
    • 逻辑上行链路必须在重新引导后仍存在。
       
  • 算法:对于具有相同类型的多个端口的每个设备,算法如以下相对端口号(端口 1、端口 2,以此类推)所示:
    1. 端口 1 – 分配 PCI 别名(编号范围为 0-31 或 64-127)
    2. 端口 2(和编号更大的端口)– 获得百万范围内的别名编号,如步骤 3 所说明
    3. 要使其他端口实现持久性,请采用此方法。可以使用以下公式获取每个别名的编号:

      1000000 + (pciIndex*100) + p#

      其中:

      pciIndex 是 PCI 别名中的编号。
      p# 是相对端口号

      例如:如果 PCIe 功能获得名称 vmnic4,则:
      lspci : 00:04:00.0 - vmnic4
      并且
      端口 1 获得 vmnic4
      端口 2 获得 vmnic1000402
      端口 3 获得 vmnic1000403

    此方法最多允许为单个 PCIe PF(物理功能)分配 100 个伪设备。

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"

« 上一篇 | 下一篇 »

发表评论

评论内容 (必填):