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 往上依次为板载端口、固件未描述的端口和可插拔插槽中的端口分配别名。 如果系统具有:
则分配的设备名称应如下所示:
此方式可以在一组全新安装或部署的相同主机之间生成统一的设备名称分配。设备名称分配通常可根据上述规则进行预测,前提是主机的固件提供了必要信息并且未出现任何特殊情况。
在有状态主机上,别名分配会立即记录在持久的本地存储中。在无状态主机上,别名分配是主机配置文件的一部分;只要系统管理员捕获该配置文件,别名分配就会记录并持久保留下来。
硬件更改和设备别名
对硬件配置进行的更改需遵守以下规则:
使用主机配置文件配置系统时,系统管理员应在硬件更改后捕获已更新的配置文件。 ESXi 升级
从一个 ESXi 版本升级到下一个版本(包括执行自动部署配置)时,不会更改先前分配给系统端口的别名。这包括从先前版本升级到 ESXi 5.5 等高级版本。 注意:在极少数情况下,别名在 ESXi 升级或修补程序安装中会更改,这是因为在 ESXi 解析固件设备位置信息时添加了错误修复或临时解决方法的副作用。如果需要更正已更改的别名,请按照下面“更改 ESXi 主机分配的名称”中的步骤进行操作。 对于有状态系统,别名在升级过程中会保留在本地存储和主机配置文件(如果有)中。无状态系统的设备别名分配会记录在主机配置文件中。但是,来自 ESXi 5.5 之前版本的主机配置文件不包含别名分配。从 5.5 之前版本升级到 5.5 时,ESXi 会识别到这种情况,并使用 ESXi 5.5 之前版本的原始别名分配算法来防止在此类升级过程中进行别名重新分配。VMware 建议在进行无状态升级后捕获新的主机配置文件,以便设备分配保持不变。
要将同类无状态主机群集从一个版本升级到另一个版本,请执行以下操作:
设备类型和设备名称的持久性
物理设备
大多数驱动程序会创建使用物理 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 和 M2 的源通常适用于板载设备,尽管源 M1 可以用于任何设备。源 S1-S3 适用于可插拔插槽中的设备。源 P 未提供任何实际位置信息,并且在系统中添加或移除其他设备后不一定会保留,因此,最后才会查询此信息源。
命名
为具有驱动程序的所有设备查询以上信息源后,每种类型的设备会按以下顺序进行排序和命名:
注意:在极少数情况下,别名在 ESXi 升级或修补程序安装中会更改,这是因为在 ESXi 解析固件设备位置信息时添加了错误修复或临时解决方法的副作用。如果需要更正已更改的别名,请按照下面“更改 ESXi 主机分配的名称”中的步骤进行操作。 在某些情况下,可能需要更改 ESXi 主机分配的别名。过程如下所示:
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 功能而言,VMware 支持为 32 个 HBA 和 GFX 适配器以及 96 块网卡分配名称。 此方法最多允许为单个 PCIe PF(物理功能)分配 100 个伪设备。
目前使用以下别名编号分配:
部分设备会使多个端口在同一个 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"